【问题标题】:applicationId manifest placeholder for multiple build flavors not working多个构建风格的 applicationId 清单占位符不起作用
【发布时间】:2016-09-01 18:26:45
【问题描述】:

我正在修改当前的 android 项目,以便可以将其安装在同一设备上以实现多种风格和构建配置。

build.gradle:

{
    // ...
    defaultConfig {
        applicationId "com.myapp"
        manifestPlaceholders = [
            manifestApplicationId: "${applicationId}",
            onesignal_app_id: "xxxx",
            onesignal_google_project_number: "xxxx"
        ]
    // ...
    }

    productFlavors {
        production {
            applicationId "com.myapp"
            // ...
        }

        dev {
            applicationId "com.myapp.dev"
            // ...
        }

        // ...
    }

    buildTypes {
        release {
            // ...
        }

        debug {
            applicationIdSuffix ".debug"
            // ...
        }
    }

    // ...
}

AndroidManifest.xml

<manifest ... >
    <uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
    <permission
    android:name="${applicationId}.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />      
    <!-- ... -->

    <receiver
        android:name="com.onesignal.GcmBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="${applicationId}" />
        </intent-filter>
    </receiver>

    <!-- ... -->
</manifest>

当我同时编译同种风格的调试版和发布版时,我收到错误消息:

...

INSTALL_FAILED_DUPLICATE_PERMISSION

perm=com.myapp.permission.C2D_MESSAGE

pkg=com.myapp.dev

...

manifestApplicationId 占位符来自 OneSignal 库上的 AndroidManifest.xml,如 https://documentation.onesignal.com/docs/android-sdk-setup 上的指示

有人知道如何解决这个问题吗?谢谢。

【问题讨论】:

  • 我认为这是 stackoverflow.com/questions/27043933/… 的副本。您需要从设备上卸载该应用并重新安装。
  • @Blehi:当然,卸载已安装的变体将摆脱错误。但我的目标是将所有变体安装到同一设备上。谢谢。

标签: android gradle android-manifest buildconfig manifest-merging


【解决方案1】:

OneSignal 需要将 manifestPlaceholders 密钥 manifestApplicationId 设置为您的 applicationId(也就是您的包名称)。

这可以通过在您的buildTypes 中设置来完成,如下所示。

buildTypes {
   debug {
      defaultConfig {
         manifestPlaceholders = [manifestApplicationId          : "${applicationId}",
                                 onesignal_app_id               : "11111111-1111-1111-1111-111111111111",
                                 onesignal_google_project_number: "111111111"]
       }
   }

   release {
      defaultConfig {
         manifestPlaceholders = [manifestApplicationId          : "${applicationId}",
                                 onesignal_app_id               : "22222222-2222-2222-2222-222222222222",
                                 onesignal_google_project_number: "222222222"]
      }
   }
}

更新 1:OneSignal-Android 3.3.0 不再需要 manifestApplicationId

更新 2:OneSignal-Android 4.0.0 不再需要任何 manifestPlaceholders 值。 Instead OneSignal.setAppId(ONESIGNAL_APP_ID) needs to be called at runtime.

【讨论】:

  • 感谢您的回复。我在每个 buildType 的 defaultConfig 闭包中添加了这些占位符,就像上面的代码一样,现在我得到了 build failed: Error:Execution failed for task ':app:processProductionReleaseManifest'。 > 没有键记录 [permission#${manifestApplicationId}.permission.C2D_MESSAGE]
  • 编辑:我忘记在我之前添加的清单上删除 tools:overrideLibrary 和 tools:override。在我这样做之后,错误又回到了“重复权限”。现在还在努力寻找解决方案...
  • @Wellsen 进行此.gradle 更改后,您需要卸载这两个应用程序,然后重新安装它们。其中一个很可能拥有错误的权限,因此需要这样做。
  • 这里嵌套的defaultConfig 块是故意的吗?
  • 没有defaultConfig 嵌套。 gradlew 无法在我的基础上构建
猜你喜欢
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 2013-09-28
  • 2014-03-04
相关资源
最近更新 更多