【问题标题】:Using flavours in Android studio and - error with wrong AndroidManifest selected / not merged在 Android Studio 中使用风味和 - 错误选择/未合并的 AndroidManifest 错误
【发布时间】:2015-11-17 13:40:28
【问题描述】:

我正在尝试设置风格,所以我可以在同一个项目中构建不同的应用程序,共享相同的代码......但我不确定我是否完全正确......

我在文件夹 W:\android-studio-projects\sharedid\ 中创建了一个名为 com.sharedid.app 的项目

为此我有

1) 在 W:\android-studio-projects\sharedid\app\src\main 中创建了 AndroidManifest.xml,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.sharedid.app"
  android:versionCode="1"
  android:versionName="1.0"
>
<activity android:name="com.shared.app.SharedMain" android:label="@string/MicMainName" >
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>  
</manifest>

2) 在 W:\android-studio-projects\sharedid\app\src\main\java ...我有所有 .java 文件

3) 在 W:\android-studio-projects\sharedid\app\src\main\res 我拥有所有共享和/或虚拟资源

为了我的口味我有:

1) 我在 W:\android-studio-projects\sharedid\app\src\myflavour 中创建了 AndroidManifest.xml(这个文件定义了一切——每种风格都不同)

2) 在 W:\android-studio-projects\sharedid\app\src\myflavour\res 我有一个文件夹 drawable-hdpi 包含各种图形

3) 在 W:\android-studio-projects\sharedid\app\src\myflavour\assets 我有 那个 特定应用程序的各种数据、配置和图形文件。 (由代码在运行时读取)

4) 在 *W:\android-studio-projects\sharedid\app\src\myfavlour* 我有以下 AndroidManifest.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.myflavour.app"
  android:versionCode="2"
  android:versionName="2.0"
>
<uses-sdk
  android:minSdkVersion="9"
  android:targetSdkVersion="17" 
/>
  <uses-feature android:glEsVersion="0x00020000" android:required="true" />

<application
  android:allowBackup="true"
  android:icon="@drawable/app_logo__forlarge"
  android:label="@string/MicAppName"
  android:theme="@style/MicTheme_myflavour"
  android:name="com.shared.app.MicApp"
>
<provider
  android:name="android.support.v4.content.FileProvider"
  android:authorities="com.myflavour.app.fileprovider"
  android:grantUriPermissions="true"
  android:exported="false">
  <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_filepaths" />
</provider>
<activity android:name="com.shared.app.SharedMain" android:label="@string/MicMainName" >
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>        
<activity>...more...</activity>        
</application>
</manifest>

“Gradle Scripts”-“Build Gradle”(模块:app)如下所示:

apply plugin: 'com.android.application'

android {
    signingConfigs {
    }
    compileSdkVersion 21
    buildToolsVersion '21.1.2'
    defaultConfig {
        applicationId "com.sharedid.app"
        minSdkVersion 9
        targetSdkVersion 17
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
        }
    }
    repositories {
        maven { url "https://jitpack.io" }
    }     
    productFlavors {
      myflavour {
          applicationId "com.myflavour.app"
      }
    }
    sourceSets {
      main {
        manifest.srcFile 'src/main/AndroidManifest.xml'
      }
      myflavour {
        manifest.srcFile 'src/myflavour/AndroidManifest.xml'
      }
    }           
}    
dependencies {
    compile 'com.android.support:support-v4:18.0.0'
    compile 'com.google.android.gms:play-services:+'
    compile 'com.android.support:appcompat-v7:21.1.2'
    compile 'com.github.PhilJay:MPAndroidChart:v2.0.8'
}

我的问题是这样的

当我在“构建变体”中选择“module=app”和“build-variant=com.myflavor.appDebug”并单击“运行 > 调试...”时,我会看到一个对话框,其中指出:“错误: 未找到默认活动”

根据我对风味的研究,我不需要定义源集路径,因为我使用默认的 convention 文件作为风味......如果我是对的 - 那么为什么它看不到所选风格的 Androidmanifest 文件?

我的理解基于以下参考链接:

其他问题排查

在我试图找到这个问题的根源时,我开始怀疑清单合并不起作用。这种怀疑的原因是,如果我忽略了关于没有活动的错误并试图将编译的应用程序推送到移动设备上,我会收到一个关于版本号小于移动设备上安装的版本号的警告 - 明确指示错误清单文件正在被使用。

所以我也尝试删除 src/main/AndroidManifest.xml 导致错误:

发现任务配置有问题 ':app:checkmyflavorDebugManifest'。文件 W:\android-studio-projects\sharedid\src\main\AndroidManifest.xml' 为属性“清单”指定的不存在

这让我相信 Android Studio 完全忽略了我实际上是在指定它使用另一个清单文件......同时虽然看起来我正在构建正确的变体版本。

我会感谢任何对此的评论/分析 - 即使只是为了确认我对原因的想法

我当前设置的屏幕截图

(在此屏幕截图中,我已经尝试删除主/共享的 androidmanifest 文件,但否则它会完成)

最新更新

我得出结论,风味不起作用/我的 gradle 设置一定是错误的。如果我例如选择构建变体 myflavorDebug Android studio 不使用 gradle 中定义的清单文件。仅此一项就足以断定问题出在哪里。

也许我的 gradle 文件在某种程度上是错误的,我不知道,但我非常小心地让我正确。如果有人在赏金活动期间发布答案,我会尽快分配。

【问题讨论】:

  • 我认为 AndroidManifest 需要声明任何包含活动的类。
  • 每种风格都有自己的 AndroidManifest 也有。这是 Google 自己的关于清单文件应该如何合并的文档的链接:developer.android.com/tools/building/manifest-merge.html - 也许我误解了它
  • 您的清单文件应该有活动类,但我没有在清单文件中看到它。你的活动班级名称是什么?您应该将其添加到应用程序标签中的清单文件中。
  • 我现在已经包含了我的风格的清单文件...是你想看的那个吗?还是您的意思是共享清单应该包含一个虚拟活动类?
  • 我也尝试在共享的 androidmanifest 文件中插入活动代码 - 没有区别。我还尝试了我的构建 gradle 中清单文件的“硬编码”路径。

标签: java android android-studio


【解决方案1】:

我认为问题出在这里:

applicationId "com.myflavour.app"

您在 build.gradle 中将您的 applicationIs 定义为 com.myflavour.app。 在您的 AndroidManifest 中,您指定

<activity android:name="com.shared.app.SharedMain"
    android:label="@string/MicMainName" >

作为您的主要活动。如果我没记错的话,你的主要活动应该以你的 applicationId 命名。所以基本上,您应该尝试更改您的清单以将您的活动声明为com.myflavour.app 并相应地安排您的包装,或者您可以使用相同的 applicationId 来满足您的口味。

【讨论】:

  • 在我过去的所有应用程序中,我的主要活动的名称都与包 ID 不同...
  • 另外,据我所知,风味背后的要点是在具有不同应用程序 ID 的多个风味中使用相同的活动,因此名称永远不会匹配?
【解决方案2】:

使用Flavors 不需要为每个Flavors 创建Manifest 文件。只需将所有类放在 src/mani/AndroidManifest.xml 文件中。 如果您仍希望同时使用这两个文件,请通过不覆盖“intent-filter”块来消除冲突:

<intent-filter>
  <action android:name="android.intent.action.MAIN" />
  <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

只用一次。

最后,你可以在http://developer.android.com/tools/building/manifest-merge.html找到很多有用的信息

从那里快速报价:

在构建过程中,清单合并过程存储一条记录 中的每个合并交易 manifest-merger--report.txt 文件在模块中 构建/输出/日志文件夹。为每个生成一个不同的日志文件 模块的构建变体。

【讨论】:

  • 好的,所以我把我能做的所有东西都放到主清单中。但是清单文件中的“包”呢? (我的问题是我认为合并似乎不起作用,因为我可以看到它们没有正确合并。但是,我仍然会按照您的建议尝试并报告)
  • 我假设“provider”条目仍然属于风味清单。但是我如何处理像这样的信息 android:theme="@style/...." 我曾希望我可以简单地覆盖/合并每种风格的 android 清单?
  • 尝试了很多不同的东西,虽然某些组合可能看起来有效,但我会收到类似这样的运行时错误:“无法启动活动 ComponentInfo{com.myflavour.app/com.shared.app.SharedMain }:java.lang.NullPointerException”。我猜有些事情出了问题。过去我在我的应用程序之间复制粘贴的代码,所以我知道它们单独工作。我会继续努力
  • 从“manifest-merger--report.txt”可以看到它完全忽略了风味所具有的AndroidManifest.xml(并且在gradle中定义) - 这支持我自己的Android Studio发现忽略它
  • Tom 请告诉我模块 build/outputs/logs 文件夹中 manifest-merger--report.txt 文件中的错误日志。合并是由 Gradle 而不是 AndroidStudion 完成的(它只运行诸如“gradle assembleDebeg”之类的命令的结果,或者您可以通过“./gradlew assembleDebug”进行多次合并)
【解决方案3】:

无法合并具有不同包名称的清单。
我认为这是问题所在。
只需从 myflavour 清单中删除 package="com.myflavour.app"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-12
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多