Wellsen Wellsen - 2 months ago 15
Android Question

applicationId manifest placeholder for multiple build flavors not working

I am modifying current android project so it can be installed on same device for multiple flavors and build configs.

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>


When I compile both debug and release version of the same flavor, I got error message:

...

INSTALL_FAILED_DUPLICATE_PERMISSION

perm=com.myapp.permission.C2D_MESSAGE

pkg=com.myapp.dev

...

manifestApplicationId placeholder came from AndroidManifest.xml on OneSignal library as instructed on https://documentation.onesignal.com/docs/android-sdk-setup

Anybody have a clue how to fix this problem? Thank you.

Answer

OneSignal requires the manifestPlaceholders key manifestApplicationId to be set to your applicationId (AKA your package name).

This can be done by setting it in your buildTypes like the following.

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"]
      }
   }
}
Comments