我正在尝试设置口味,所以我可以在共享相同代码的同一个项目中构建不同的应用程序......但我不确定我是否完全正确...
我在文件夹W中创建了一个名为com.sharedid.app的项目:\ android-studio-projects \ sharedid \
为此我有
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(这个文件定义了所有东西 - 它对于每种风格都是unqiue)
2)在 W:\ android-studio-projects \ sharedid \ app \ src \ myflavour \ res 我有一个文件夹 drawable-hdpi 包含variois图形
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.myflavour.appDebug”并单击“运行&gt;调试...”时,我会看到一个对话框,指出:“错误:未找到默认活动“
根据我对口味的研究,我不需要定义源集路径,因为我使用默认的常规文件作为口味...如果我对此没有 - 那么为什么它看不到选择了风味的Androidmanifest文件?
参考链接我的理解基于:
其他疑难解答
在我试图找到这个问题的根源时,我开始怀疑明显的合并是行不通的。这种怀疑的原因是,如果我忽略了关于没有活动的错误并试图将已编译的应用程序推出移动设备,我会收到关于版本号小于移动设备上安装的版本号的警告 - 明确指示错误清单文件正在使用。
所以我也试图删除 src / main / AndroidManifest.xml ,这会导致错误:
发现任务配置存在问题 ':应用程序:checkmyflavourDebugManifest'。文件 女:\ Android的工作室项目\ sharedid的\ src \主\ AndroidManifest.xml中” 为属性'manifest'指定的不存在
这让我相信Android Studio完全无视我实际上是指定它使用另一个清单文件......同时,虽然看起来我正在构建正确的变体构建。
我会对此作出任何评论/分析 - 即使只是为了确认我对事业的看法
我当前设置的屏幕截图
(在此屏幕截图中,我已经体验过删除主/共享androidmanifest文件,但否则它已完成)
最新更新
我总结说味道不起作用/我的gradle设置一定是错的。如果我选择建筑物变化myflavourDebug Android studio不使用gradle中定义的清单文件。仅此一点就足以得出问题依赖的地方。
也许我的gradle文件在某种程度上是错误的,我不知道,但我已经非常谨慎地让我正确。如果有人在赏金活动期间发布asnwer,我会尽快快速分配。
答案 0 :(得分:3)
我认为问题在于:
string
您在build.gradle中将applicationIs定义为string
。
在您的AndroidManifest中,您指定
applicationId "com.myflavour.app"
作为您的主要活动。如果我没错,你的主要活动应该以你的applicationId命名。所以基本上,您应该尝试更改您的清单以将您的活动说明为com.myflavour.app
并相应地安排您的包装,或者您可以使用相同的applicationId作为您的风味。
答案 1 :(得分:2)
使用Flavors不需要为每个文件创建Manifest文件。只需将所有类放在 src / mani / AndroidManifest.xml 文件中即可。 如果您仍希望使用这两个文件,请不要覆盖&#34; intent-filter&#34;块:
<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文件 build / outputs / logs文件夹。为每个生成不同的日志文件 该模块的构建变体。
答案 2 :(得分:0)
不可能将清单与不同的包名称合并
我认为这是问题所在
只需从myflavour清单中删除package="com.myflavour.app"
。