我在gradle / android studio中使用Product Variants来实现以下项目设置:
我试图实现这个目标(占位符,多个清单),但我没有遵循多个教程,但没有任何作用。
按照本教程,我做了以下内容: http://www.kevinrschultz.com/blog/2014/03/23/using-android-content-providers-with-multiple-package-names/
我的build.gradle:
android {
compileSdkVersion 19
buildToolsVersion '20'
defaultConfig {
minSdkVersion 10
targetSdkVersion 19
versionCode 1
versionName "1.0"
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
productFlavors {
app1 {
packageName "com.test.app1"
//applicationId "com.test.app1"
}
app2 {
packageName "com.test.app2"
//applicationId "com.test.app2"
}
}}
这是我的清单文件。
的src /主/清单:
<?xml version="1.0" encoding="utf-8"?>
<application>
</application>
的src / APP1 /清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name="com.test.app1”
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.test.app1.MainActivity"
android:label="@string/app_name"
android:launchMode="singleTask"
android:screenOrientation="portrait" >
</activity>
</application>
</manifest>
的src / APP2 /清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name="com.test.app2”
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.test.app2.MainActivity"
android:label="@string/app_name"
android:launchMode="singleTask"
android:screenOrientation="portrait" >
</activity>
</application>
</manifest>
这给了我以下错误消息:
Manifest merger failed : Main AndroidManifest.xml at AndroidManifest.xml manifest:package attribute is not declared
不幸的是,由于我的应用需要不同的包路径,因此我无法为每个单独的清单标记设置包。如果我仍然这样做,合并将无法合并清单文件,因为不同的包值。除了packageName,我还尝试设置&#34; applicationId&#34;但这也不起作用。使用像package="${applicationId}"
这样的占位符无法正常工作,因为它无法解析变量值。
任何想法如何解决这个问题?我使用Android Studio 0.8.2和gradle 0.12.2
答案 0 :(得分:4)
您可以安全地添加
<manifest xmlns:android="..."
package="com.test.app">
</manifest>
在您的主要清单中。
但是你必须在build.gradle中使用applicationId
而不是packageName
。
build.gradle的applicationId
将在您的不同构建期间覆盖此值。
更好的方法是使用applicationIdSuffix
代替applicationId
来制作不同的产品口味。
该字段必须出现在主要清单中。
答案 1 :(得分:2)
除了src/app1/AndroidManifest.xml
和src/app2/AndroidManifest.xml
之外,您还有一个src/main/AndroidManifest.xml
,其中包含两个应用共享的元素。
在特定于风味的清单中,您不必指定package
属性,因为该属性已在build.gradle
中定义。
但是,在主清单中,您需要定义package
属性,以指定用于共享资源的包名称:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.app">
</manifest>
确保您没有任何依赖库,也使用该名称,否则您将收到另一个构建错误。
此外,您需要在applicationId
中指定packageName
而不是build.gradle
,以便将用于识别您的应用的软件包名称与用于内部资源访问的软件包名称分离。
点击此链接获取更多信息:http://tools.android.com/tech-docs/new-build-system/applicationid-vs-packagename
答案 2 :(得分:0)
我解决了同样的问题,在每个风格的清单中加入相同的package="com.ex.app"
,并将applicationId
和useOldManifestMerger true
放入build.gradle
文件
android {
useOldManifestMerger true
productFlavors{
app1{
applicationId = "com.ex.app1"
}
app2{
applicationId = "com.ex.app2"
}
}
}
答案 3 :(得分:0)
我刚刚开始新鲜,但这次Android Studio为我生成了Variant配置(在项目设置下有一个风味,变体等选项卡)。
我还决定将所有三个变体的包名更改为相同的名称,因为每个app(变体)的标识由applicationId完成(与变体的实际包名无关)。 / p>
感谢pdegand59的帮助!