Android Gradle替换清单中值的包名称

DAr*_*rkO 39 android gradle

我正在使用Gradle with Product flavors,我为每个设置了不同的包名.

productFlavors {

    appone {
        packageName "com.dg.app1"
    }

    apptwo {
        packageName "com.dg.app2"
    }

    appthree {
        packageName "com.dg.app3"
    }

    appfour {
        packageName "com.dg.app4"
    }

}
Run Code Online (Sandbox Code Playgroud)

我需要能够在清单中替换每个相应应用程序的包名称.

我的清单有这个:

<receiver android:name="com.parse.GcmBroadcastReceiver"
          android:permission="com.google.android.c2dm.permission.SEND">
  <intent-filter>
    <action android:name="com.google.android.c2dm.intent.RECEIVE" />
    <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

    <category android:name="com.dg.example" />
  </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

所以我需要为每个app flavor的包名替换com.dg.example.做这个的最好方式是什么?

kco*_*ock 69

Gradle Plugin v0.12及更高版本:

${applicationId}而不是${packageName}.

Gradle Plugin v0.11及更高版本:

从v0.11开始,您不再需要指定不使用旧的清单合并.

Gradle Plugin v0.10及更高版本:

假设您使用的是0.10或更高版本,现在官方支持:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        // Make sure this is at least 0.10.+
        classpath 'com.android.tools.build:gradle:0.10.+'
    }
}
Run Code Online (Sandbox Code Playgroud)

从v0.10开始,你还必须手动启用新的清单合并,尽管我希望每当新的合并成为默认值时,该要求就会在一两个版本中消失:

android {
    useOldManifestMerger false
}
Run Code Online (Sandbox Code Playgroud)

然后,只需使用通常硬编码包名称的${packageName}任何地方AndroidManifest.xml.例如:

<category android:name="my.package.name"/>
Run Code Online (Sandbox Code Playgroud)

会成为

<category android:name="${packageName}"/>


Gradle Plugin v0.9及以下版本:

因此,参考这篇文章,似乎尚未通过Gradle正式支持.一个简单的解决方法如下:

  1. 用自定义标签替换包名称(例如,<category android:name="my.package.name"/>变为<category android:name="_PACKAGENAME_"/>
  2. 以下内容添加到您build.gradle的下android范围:

applicationVariants.all { variant ->
    // After processing the manifest, replace all instances of your tag
    // with the variant's actual package name.
    variant.processManifest << {
        def manifestOutFile = variant.processManifest.manifestOutputFile
        def newFileContents = manifestOutFile.getText('UTF-8').replace("_PACKAGENAME_", variant.packageName)
        manifestOutFile.write(newFileContents, 'UTF-8')
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 从Android Studio 1.0和android gradle插件1.0.0开始,它失败了,"无法找到属性'processManifest'" (3认同)