問(wèn)題描述:
截圖類似如下:
在做馬甲應(yīng)用(多變體APP)的時(shí)候辆琅,由于只配置了不同的
applicationId
和相應(yīng)的代碼目錄琉预,并沒(méi)有對(duì)ContentProvider
和項(xiàng)目中的第三方庫(kù)等配置做修改佩谷,就出現(xiàn)了這個(gè)錯(cuò)誤奥喻。一般都是由于兩個(gè)APP的清單文件中的provider
的authorities
是一樣的導(dǎo)致的慕嚷。另一個(gè)原因就是一些第三方庫(kù)(如極光)哥牍,也需要進(jìn)行各個(gè)變體的配置,若是相同則也會(huì)出現(xiàn)此類錯(cuò)誤喝检。
解決方案:
1嗅辣、針對(duì)provider
進(jìn)行修改,使用${applicationId}
進(jìn)行替換固定包名
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
2挠说、針對(duì)第三方庫(kù)的配置進(jìn)行修改:
如極光的配置澡谭,以某一receiver
為例:【主要是配置不同的JPUSH_PKGNAME
】
- AndroidMainifest.xml
<receiver android:name="com.xuansa.bigu.receiver.JPushReceiver">
<intent-filter>
<action android:name="cn.jpush.android.intent.REGISTRATION" />
<action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" />
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" />
<action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
<action android:name="cn.jpush.android.intent.CONNECTION" />
<category android:name="${JPUSH_PKGNAME}" />
</intent-filter>
</receiver>
- build.gradle
productFlavors {
v1 { //變體1
versionCode 1
versionName "1.1.1"
applicationId "com.test.v1"
if (applicationId.endsWith('.debug')) { //debug
manifestPlaceholders = [
JPUSH_APPKEY: "xxx", //極光APPid
JPUSH_PKGNAME: applicationId //可直接引用
]
} else { //release
manifestPlaceholders = [
JPUSH_APPKEY: "xxx", //極光APPid
JPUSH_PKGNAME: applicationId //可直接引用
]
}
}
v2 { //變體2
versionCode 2
versionName "2.2.2"
applicationId "com.test.v2"
if (applicationId.endsWith('.debug')) { //debug
manifestPlaceholders = [
JPUSH_APPKEY: "xxx", //極光APPid
JPUSH_PKGNAME: applicationId //可直接引用
]
} else { //release
manifestPlaceholders = [
JPUSH_APPKEY: "xxx", //極光APPid
JPUSH_PKGNAME: applicationId //可直接引用
]
}
}
}
需要注意:
相同簽名,不同包名的APP是可以同時(shí)安裝的损俭。但不能有指定的唯一的標(biāo)識(shí)蛙奖。
參考資料:
Android中由于ContentProvider導(dǎo)致的“應(yīng)用組件的命名與已安裝應(yīng)用有沖突”問(wèn)題