1. 前言
Maybe 你會有這個煩惱,在開發的時候,測試突然告訴你,正式包上有點問題,需要看一下,這時候你開啟測試機發現上面裝的是測試包,沒事,那就解除安裝了裝個正式包唄。然後嘞,正式包的問題確認完了,發現不是 Bug,而是一個 Feature,你需要回到測試包繼續開發,結果發現,又得把正式包解除安裝瞭然後裝個測試包。
這一來二去的多麻煩呀~
怎麼解決呢,有人說,我手裡頭有兩臺測試機,一臺裝正式包,另一臺裝測試包。我想說,陳獨秀同學,你先坐下,我們大多數人都只有一臺測試機呀。
那麼,問題來了,怎麼實現一臺手機上同時安裝正式包和測試包呢。這就是本文要解決的問題。
2. 實現一臺手機上同時安裝正式包和測試包
我們知道,Android 應用的唯一標識是包名,也就是 build.gradle
裡的 applicationId
。在一臺手機上不允許安裝的兩個包的唯一標識重複。因此,只需要把測試包的 applicationId
亦即包名改一下就好了~
2.1 修改測試包包名
查閱文件之後發現,Android 官方對這種場景早有支援,只需要在 app/build.gradle
的 android->buildTypes->debug
節點下面設定 applicationIdSuffix
即可,示例如下:
android {
// ...
buildTypes {
debug {
minifyEnabled false
applicationIdSuffix ".test" // 測試包增加包名字尾
}
release {
// ...
}
}
//...
}
複製程式碼
2.2 問題來了~編譯失敗
事情往往不會這麼簡單,在我修改完 app/build.gradle
之後,sync 一下,發現,編譯失敗了,譯失敗了,失敗了,敗了,了。。。
錯誤日誌如下:
[...]
:app:compileDebugJavaWithJavac
error: The generated com.xxx.xx.test.R class cannot be found
複製程式碼
咋辦,不知道咋回事兒,看起來像是 AndroidAnnotation 的鍋。面向搜尋引擎程式設計,經過一番搜尋,發現了這個:Using a debug "applicationIdSuffix" causes compilation errors #1888。
2.3 問題解決
具體解釋參見上述 issue,貼一下解決辦法。在 android->defaultConfig
下增加 javaCompileOptions
配置:
javaCompileOptions {
annotationProcessorOptions {
arguments = [
"resourcePackageName": android.defaultConfig.applicationId
]
}
}
複製程式碼
resourcePackageName
這個引數是 AndroidAnnotations
定義的,關於它的具體含義可以參考 這裡
Last
So,終於可以在一臺手機上同時安裝正式包和測試包了~~
Patch-2019-03-11
評論區的老哥們討論得比較多,大家說得是對的,這種方法只適用於小的專案,大點的專案接了一些三方 SDK 的專案是用不了這種的(有缺陷),因為在 Android 上,很多三方 SDK 都是以包名作為 apiKey 的,如果包名變了可能很多三方 SDK 就不 work 了,比如百度地圖、三方推送這些。
我當時的實踐到最後,也發現是推送會有問題,需要重新申請,這在當時是不可行的,所以改包名這種方式的確是有問題,我寫這篇文章的目的主要也是給大家提供一些參考,謝謝大家^_^
Personal
- 微信公眾號:yongf666
- 掘金:https://juejin.im/user/57b8751a2e958a005fa2fc45
- 個人網站:https://www.54yongf.com/
- 微博:http://weibo.com/2902237231
- 知乎:http://www.zhihu.com/people/wang-yong-8-33
- 郵箱:ScottWang1996@gmail.com
- StackOverflow:http://stackoverflow.com/users/5304207