react native之android多包共存解決方案
某天測試反映,每次測試不同環境的時候都要解除安裝舊的包。太麻煩了,能不解決?
兩種方案
研究發現發現兩個方案
- app內可以切不同的環境
- 通過多包共存的方式 --- xx.正式, xxx.測試、xx.開發環境 主要講一下app 共存
多包共存
包型別
比如我有一個app 包他可能有這樣幾種型別
- debug 包(預設渠道)
- release 包(預設渠道)
- debug 包(其他渠道 --- 比如美團)
- release 包(預設渠道 --- 比如美團)
怎麼共存
雖然我是個前端仔,but 查資料還是會的。經過不懈的努力,終於發現
安卓系統中區分不同應用使用的是 applicationId 屬性 複製程式碼
so 下一步問題變成如何去改appId 了 查詢資料發現可以利用 gradle 去設定productFlavors 可以很方便的實現這個需求.
具體操作
修改 android/app/build.gradle productFlavors { beta {//測試環境 applicationId "com.x.beta" // applicationIdSuffix ".beta" manifestPlaceholders = [ app_name: "@string/app_name_beta", ] //resValue("string", "envTag", "beta環境") } product {//生產環境 applicationId "com.x.product" // applicationIdSuffix ".product" manifestPlaceholders = [ app_name: "@string/app_name", ] // resValue("string", "envTag", "生產環境") } } 複製程式碼
這裡有兩種訪問去改 appId
- 第一種就是我那種去直接去設定不同的id
- 第二種就是去設定applicationIdSuffix 也就是應用標識字尾,比如我預設 appid是 com.x。執行/gradlew assembleReleaseBeta 會在後面追加 com.x.beat。當然不應命令列在 android Studio 裡面也能看到這個選項
動態設定app_name、icon、appkey
我們可以通過manifestPlaceholders 也就是佔位符來設定
// 擴充套件上面 beta { ... manifestPlaceholders = [ app_name: "@string/app_name_beta", app_icon: '@xxxx' JPUSH_APPKEY: '123' // 極光推送, GoogleMapKey: '456' //谷歌地圖 ] } product {} 複製程式碼
build.gradle 修改完了,接下來還要設定 /android/app/src/main/AndroidManifest.xml裡面的內容
<application android:icon="${app_icon}" android:label="${app_name}" xxxxx> <!-- Google Map Key --> <meta-data android:name="com.google.android.geo.API_KEY" android:value="${GoogleMapKey}" /> <!--極光推送--> <!-- User defined. 使用者自定義的廣播接收器--> <receiver android:name="com.ablegenius.member.receiver.JpushReceiver" android:enabled="true"> <!--android:process=":remote"廣播執行在遠端單獨程序中 ,除錯斷點無法執行需要關閉 或者 debug時候選擇 remote ! --> <intent-filter> xxxxx <!--推送包名必須一致使用Gradle中的常量才是最終的 --> <category android:name="${applicationId}" /> </intent-filter> </receiver> </application> 複製程式碼
最後配置包名 android/app/src/main/res/values/strings.xml
<resources> <string name="app_name">x正式</string> <string name="app_name_beta">x測試版</string> </resources> 複製程式碼最開始的時候我以為我的兩個版本appid 是一樣的,然而並不是解決了我的問題
通過 productFlavors 這種方式動態去改 appid,其實也就是現在的通用的一種說法 --- 多渠道打包 所以如果用這種方式 可以直接打渠道包上架到不同的市場