廢話少說,直接上方案!
你需要改以下幾處地方:
1.app- build.gradle
與 buildTypes 同級,你需要建一個 productFlavors
productFlavors {
one {
// 動態替換applicationId
// AndroidManifest.xml文件中用到applicationId的地方替換爲${applicationId}
// 不要把用到包名的地方也替換了,如per.goweii.one.MainActivity
applicationId "cn.com.***"
// 動態生成常量
// 引用方法爲BuildConfig.HTTP_DOMAIN
buildConfigField "String", "HTTP_DOMAIN", '"http://api.app.one/"'
buildConfigField "String", "WECHAT_APP_ID", '"WECHAT_APP_ID"'
buildConfigField "String", "WECHAT_APP_SECRET", '"WECHAT_APP_SECRET"'
// 動態生成資源文件,需要確保資源文件中沒有同名資源
// 引用方式爲R.string.app_name/@string/app_name
resValue "string", "app_name", "*********"
resValue "bool", "is_show_wechat_pay", 'true'
// 動態生成AndroidManifest.xml文件引用
// 引用方法爲${UMENG_CHANNEL_VALUE}
manifestPlaceholders = [
UMENG_CHANNEL_VALUE: "****",
UMENG_APP_KEY : "*********",
app_name : "*********",
app_icon : "*********",
]
}
two {
applicationId "cn.com.**"
/* buildConfigField "String", "HTTP_DOMAIN", '"http://api.app.two/"'
buildConfigField "String", "WECHAT_APP_ID", '"WECHAT_APP_ID"'
buildConfigField "String", "WECHAT_APP_SECRET", '"WECHAT_APP_SECRET"'*/
resValue "string", "app_name", "********"
//resValue "bool", "is_show_wechat_pay", 'false'
manifestPlaceholders = [
UMENG_CHANNEL_VALUE: "****",
UMENG_APP_KEY : "***********",
app_name : "*****”",
app_icon : "@drawable/ic_launcher",
]
}
}
具體說明,裏面註釋的很詳細不在贅述!
其中需要注意的幾點:
1,如果你的項目集成了友盟相關的東西,你需要在兩個配置裏面都配置上UMENG_CHANNEL_VALUE 和 UMENG_APP_KEY
2.不同安裝包需要配置不同的 app_name 和app_icon 因此需要在裏面配置好 這兩個要素,然後就是在 AndroidManifest.xml 裏面使用他們,如下:
<application
android:name=".logic.MyApplication"
android:configChanges="orientation|keyboardHidden|navigation"
tools:replace="label"
android:icon="${app_icon}"
android:label="${app_name}" //通過這兩處配置,就可以不同的安裝包,展示不同的app名稱與圖標
android:persistent="true"
android:theme="@style/JSJ_theme_noActionBar"
tools:remove="android:appComponentFactory">
其中需要特別注意 tools:replace=“label” 這個標籤必須有!
與此同時,在defaultConfig 裏面也需要配置上 app_name和app_icon
defaultConfig {
applicationId rootProject.applicationId
minSdkVersion rootProject.minSdkVersion
targetSdkVersion rootProject.targetSdkVersion
versionCode Integer.parseInt(project.VERSION_CODE)
versionName project.VERSION_NAME
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
//支持SVG圖片
vectorDrawables.useSupportLibrary = true
//極光推送設置
ndk {
//選擇要添加的對應cpu類型的.so庫。
abiFilters 'armeabi'
// 還可以添加 'x86', 'x86_64', 'mips', 'mips64'
}
manifestPlaceholders = [
JPUSH_PKGNAME: applicationId,
//JPush上註冊的包名對應的appkey
JPUSH_APPKEY : "*********************",
JPUSH_CHANNEL: "***", //暫時填寫默認值即可.
app_name : "*****",
app_icon : "@mipmap/ic_launcher",
]
}
否則會報出
requires a placeholder substitution but no value for <app_icon> is provided
3.***如果你使用了 google_service,那你還需要在google_service.json裏面修改下配置信息,把package_name 的值變換下, google_service 全局搜索下就好
否則會報出:
No matching client found for package name *************
有時可能改了也不會生效,這時候就需要檢查下是不是debug下面生成了相應的google_service 刪掉即可
- 有時在你同一個設備上安裝打包出的兩個app時會報出
與已安裝應用內容提供者衝突
這個時候是因爲你在AndroidManifest 裏面 添加了 provider的緣故,他的一個屬性 authorities 的值是唯一標識的,需要根據不同的包,動態修改,如下:
<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>
- 在打debug的包的時候是正常的,但是release包啓動就會崩潰,這個一般是混淆的原因,在混淆文件裏配置下就好
- 在打release 包的時候會報出 app:transformClassesAndResourcesWithProguardForTwoRelease
導致編譯不過,解決方案,在混淆文件裏添加下句:
-ignorewarnings # 抑制警告
如果正常混淆的情況下,不加這條命令也是正常的,加這條命令只是爲了通過編譯,便於調試