产品变体:多种活动

时间:2014-08-12 12:53:17

标签: android gradle android-studio variants

我在gradle / android studio中使用Product Variants来实现以下项目设置:

  1. 两个应用程序,在一个Android工作室项目中有80%相似。
  2. 每个应用都应该有自己的清单包路径(它们应该基本上像两个独立的应用程序 - 使用它自己的谷歌API和推送键)
  3. 我试图实现这个目标(占位符,多个清单),但我没有遵循多个教程,但没有任何作用。

    按照本教程,我做了以下内容: 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

4 个答案:

答案 0 :(得分:4)

您可以安全地添加

<manifest xmlns:android="..."
  package="com.test.app">
</manifest>

在您的主要清单中。

但是你必须在build.gradle中使用applicationId而不是packageName。 build.gradle的applicationId将在您的不同构建期间覆盖此值。

更好的方法是使用applicationIdSuffix代替applicationId来制作不同的产品口味。

该字段必须出现在主要清单中。

答案 1 :(得分:2)

除了src/app1/AndroidManifest.xmlsrc/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",并将applicationIduseOldManifestMerger 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的帮助!