问题
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.
回答1:
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"]
      }
   }
}
Update: manifestApplicationId is no longer required for 3.3.0 and newer of the OneSignal SDK.
来源:https://stackoverflow.com/questions/39278532/applicationid-manifest-placeholder-for-multiple-build-flavors-not-working