多个构建风格的应用程序ID清单占位符不起作用。

15
我正在修改当前的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>

当我编译相同版本的调试和发布版本时,出现错误消息:

...

安装失败,存在重复的权限

perm=com.myapp.permission.C2D_MESSAGE

pkg=com.myapp.dev

...

manifestApplicationId占位符来自OneSignal库上的AndroidManifest.xml,根据https://documentation.onesignal.com/docs/android-sdk-setup的说明。

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


我认为这是 https://dev59.com/318d5IYBdhLWcg3wNQNg 的重复。您需要从设备中卸载该应用程序并重新安装它。 - Blehi
1
@Blehi:当然,卸载已安装的变体将消除错误。但我的目标是将所有变体安装到同一设备上。谢谢。 - Wellsen
1个回答

21

OneSignal要求manifestPlaceholdersmanifestApplicationId的值设置为您的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值。 相反,在运行时需要调用OneSignal.setAppId(ONESIGNAL_APP_ID)


谢谢您的回复。我已经在每个构建类型的defaultConfig闭包中添加了这些占位符,就像上面的代码一样,现在我遇到了编译失败的问题:错误:执行任务':app:processProductionReleaseManifest'时失败。
没有密钥[permission#${manifestApplicationId}.permission.C2D_MESSAGE]的记录。
- Wellsen
编辑:我忘记在清单文件中删除之前添加的tools:overrideLibrary和tools:override。删除后,错误又变成了“重复权限”。目前仍在努力寻找解决方案... - Wellsen
@Wellsen 在您进行这个.gradle修改后,您需要卸载两个应用程序然后重新安装它们。其中一个很可能有错误的权限,因此需要这样做。 - jkasten
1
这里嵌套的 defaultConfig 块是有意为之吗? - stkent
1
gradlew 在我的电脑上构建失败。 - Jan
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接