最近接到產(chǎn)品一個需求,需要將現(xiàn)有工程打一個新的apk出來仪或,要給到新客戶使用确镊,需要替換appIcon, appName, appId以及切換新的api接口需要切換新的地址。
場景大概如下圖:
使用場景
二話不說范删,直接上代碼
第一步:添加productFlavors配置
打開項目app工程的
build.gradle
文件蕾域,在android {}
標(biāo)簽里面添加下面代碼
productFlavors {
_pro_hongyuan {
applicationId "com.bibt.aide"
resValue("integer", "app_evn", "1")
resValue("string", "app_name", "智運維-弘源")
manifestPlaceholders = [
app_icon : "@mipmap/ic_launcher",
package_name: applicationId,
JPUSH_PKGNAME: applicationId,
JPUSH_APPKEY : "xxxxxxxxxxxxxxxxxxxxxx", //極光開發(fā)平臺上注冊的包名對應(yīng)的appkey.
JPUSH_CHANNEL: "developer-default", //暫時填寫默認(rèn)值即可.
]
}
_pro_wantong {
applicationId "com.bibt.wantong"
resValue("integer", "app_evn", "2")
resValue("string", "app_name", "智運維-萬通")
manifestPlaceholders = [
app_icon : "@mipmap/ic_launcher",
package_name: applicationId,
JPUSH_PKGNAME: applicationId,
JPUSH_APPKEY : "xxxxxxxxxxxxxxxxxxxxxx", //極光開發(fā)平臺上注冊的包名對應(yīng)的appkey.
JPUSH_CHANNEL: "developer-default", //暫時填寫默認(rèn)值即可.
]
}
}
然后還需要在build.gradle
里面的defaultConfig{}
標(biāo)簽里面添加這個配置flavorDimensions "default"
defaultConfig {
//其他配置項省略
flavorDimensions "default"
}
不加這行會報這個錯
image.png
第二步:配置fileprovider信息
打開App的
AndroidManifest.xml
文件,在application標(biāo)簽內(nèi)添加provider節(jié)點
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${package_name}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
注意看了到旦,這里引用了package_name
變量旨巷,而package_name
變量是在步驟一的productFlavors
中聲明的
第三步:新建file_paths.xml
文件
在app/src/res目錄中新建xml文件夾,并新建文件file_paths.xml
添忘,文件內(nèi)容為
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path path="Android/data/${package_name}/" name="files_root" />
<external-path path="." name="external_storage_root" />
<external-path path="." name="external_files" />
</paths>
這里同樣的采呐,也是用了變量值package_name
到這里也就完成了,可以直接編譯打包搁骑。
過程比較痛苦斧吐,作者我遇到一個問題困擾許久,給大家分享下仲器,避免大家跟我一樣浪費時間煤率,報錯截圖如下
image.png
這個錯誤的意思大概就是
com.bibt.aide.DataProvider
已經(jīng)被使用了,話里話外的意思就是要我把com.bibt.aide這個換成別的娄周,當(dāng)時我是一臉懵逼的涕侈,因為沪停,我已經(jīng)在productFlavors 中定義了package_name煤辨,而且也作為變量引用到了AndroidManifest.xml和file_path.xml兩個文件當(dāng)中,理論上是沒有問題的呀木张,而且在網(wǎng)上搜索該問題众辨,其他博主也都是說這里用變量引用替換即可,于是我新建了一個helloword工程舷礼,將上面配置信息填入鹃彻,結(jié)果發(fā)現(xiàn)沒有任何問題,可以根據(jù)productFlavors 打出不同的apk包妻献。
后面我仔細(xì)對比蛛株,最后發(fā)現(xiàn)還有一個地方的AppId是寫死的
image.png
于是乎,我將其注釋掉育拨,一起添加到productFlavors(步驟一已經(jīng)配置過了)中谨履,然后編譯打包,一票通過熬丧,也就是說笋粟,替換AppId以及packageName的時候,也要考慮第三方引用變量。
第四步:根據(jù)productFlavors 配置中的app_evn字段害捕,切換不同的服務(wù)器地址绿淋,代碼如下
/**
* 該方法在Application的OnCreate方法里面調(diào)用即可
* 初始化服務(wù)器
*/
private void initServer(){
int server = getResources().getInteger(R.integer.app_evn);
if(server == HttpServerGet.ENV_TEST){
//測試環(huán)境
HttpServerGet.DEFAULT_ENV = HttpServerGet.ENV_TEST;
LogWrite.d("initServer:"+"測試環(huán)境", LogModel.MODEL_COMMON);
}else if(server == HttpServerGet.ENV_HONGYUAN){
//弘源-生產(chǎn)環(huán)境
HttpServerGet.DEFAULT_ENV = HttpServerGet.ENV_HONGYUAN;
LogWrite.d("initServer:"+"弘源-生產(chǎn)環(huán)境", LogModel.MODEL_COMMON);
}else if(server == HttpServerGet.ENV_WANTONG){
//萬通-生產(chǎn)環(huán)境
HttpServerGet.DEFAULT_ENV = HttpServerGet.ENV_WANTONG;
LogWrite.d("initServer:"+"萬通-生產(chǎn)環(huán)境", LogModel.MODEL_COMMON);
}
}
最后分享一張打包成功的截圖
image.png