AndroidManifest 包名称与 Android 中的风格冲突

Tom*_*mCB 5 android android-productflavors

我正在尝试制作两种风格的应用程序。

摇篮:

defaultConfig {
        applicationId "be.myname.firstapp"
        minSdkVersion 15
        targetSdkVersion 23 }

productFlavors {
        raterate {
            applicationId = "be.myname.firstapp"
        }
        scarsforlife {
            applicationId = "be.myname.secondapp"
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的主文件夹、fistapp 文件夹和 secondaryapp 文件夹中有一个 AndroidManifest。

第一个文件夹中的包名称:be.myname.fistapp,第二个文件夹中的包名称:be.myname.secondapp。

在主文件夹中,我首先有:be.myname.firstapp,但这与 be.myname.secondapp 冲突。现在我尝试了:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="${packageId}">

</manifest>
Run Code Online (Sandbox Code Playgroud)

并得到这个:

Attribute manifest@package at AndroidManifest.xml:3:5-27 requires a placeholder substitution but no value for <packageId> is provided.
AndroidManifest.xml Error:
    Overlay manifest:package attribute declared at AndroidManifest.xml:3:5-45 value=(be.myname.secondapp)
    has a different value=(be.myname.secondapp) declared in main manifest at AndroidManifest.xml:3:5-27
    Suggestion: remove the overlay declaration at AndroidManifest.xml   and place it in the build.gradle:
        flavorName {
            applicationId = "be.myname.secondapp"
        }
Run Code Online (Sandbox Code Playgroud)

我现在很困惑。这样做的正确方法是什么?:)

Mat*_*ini 4

您不需要AndroidManifest.xml为每种口味修改包。

引用来自tools.android.com

因此,我们解耦了包名的两种用法:

  • 您构建的 .apk 清单中使用的最终包是您的应用程序在您的设备和 Google Play 商店中的名称,即“应用程序 ID”。
  • 在源代码中用于引用 R 类并解析任何相关活动/服务注册的包仍称为“包”。

您可以在 gradle 文件中指定应用程序 ID,如下所示:

应用程序/build.gradle:

apply plugin: 'com.android.application'

android {
  compileSdkVersion 19
  buildToolsVersion "19.1"

  defaultConfig {
      applicationId "com.example.my.app"
      minSdkVersion 15
      targetSdkVersion 19
      versionCode 1
      versionName "1.0"
  }
  ...
Run Code Online (Sandbox Code Playgroud)

和以前一样,您需要在 Manifest 文件中指定代码使用的包,如上面的 AndroidManifest.xml 示例所示。

关键部分来了:完成上述操作后,这两个包是独立的。您可以完全自由地重构您的代码 - 更改用于您的活动和服务的内部包、更新您的 Manifest 包以及重构您的导入语句。这不会影响应用程序的最终 ID,它现在始终是 Gradle 文件中指定的 applicationId。