Maybe 你會有這個煩惱,在開發的時候,測試忽然告訴你,正式包上有點問題,須要看一下,這時候你打開測試機發現上面裝的是測試包,沒事,那就卸載了裝個正式包唄。而後嘞,正式包的問題確認完了,發現不是 Bug,而是一個 Feature,你須要回到測試包繼續開發,結果發現,又得把正式包卸載了而後裝個測試包。java
這一來二去的多麻煩呀~android
怎麼解決呢,有人說,我手裏頭有兩臺測試機,一臺裝正式包,另外一臺裝測試包。我想說,陳獨秀同窗,你先坐下,咱大多數人都只有一臺測試機呀。git
那麼,問題來了,怎麼實現一臺手機上同時安裝正式包和測試包呢。這就是本文要解決的問題。github
咱們知道,Android 應用的惟一標識是包名,也就是 build.gradle
裏的 applicationId
。在一臺手機上不容許安裝的兩個包的惟一標識重複。所以,只須要把測試包的 applicationId
亦即包名改一下就行了~編程
查閱文檔以後發現,Android 官方對這種場景早有支持,只須要在 app/build.gradle
的 android->buildTypes->debug
節點下面設置 applicationIdSuffix
便可,示例以下:api
android {
// ...
buildTypes {
debug {
minifyEnabled false
applicationIdSuffix ".test" // 測試包增長包名後綴
}
release {
// ...
}
}
//...
}
複製代碼
事情每每不會這麼簡單,在我修改完 app/build.gradle
以後,sync 一下,發現,編譯失敗了,譯失敗了,失敗了,敗了,了。。。bash
錯誤日誌以下:微信
[...]
:app:compileDebugJavaWithJavac
error: The generated com.xxx.xx.test.R class cannot be found
複製代碼
咋辦,不知道咋回事兒,看起來像是 AndroidAnnotation 的鍋。面向搜索引擎編程,通過一番搜索,發現了這個:Using a debug "applicationIdSuffix" causes compilation errors #1888。app
具體解釋參見上述 issue,貼一下解決辦法。在 android->defaultConfig
下增長 javaCompileOptions
配置:測試
javaCompileOptions {
annotationProcessorOptions {
arguments = [
"resourcePackageName": android.defaultConfig.applicationId
]
}
}
複製代碼
resourcePackageName
這個參數是 AndroidAnnotations
定義的,關於它的具體含義能夠參考 這裏
So,終於能夠在一臺手機上同時安裝正式包和測試包了~~
評論區的老哥們討論得比較多,你們說得是對的,這種方法只適用於小的項目,大點的項目接了一些三方 SDK 的項目是用不了這種的(有缺陷),由於在 Android 上,不少三方 SDK 都是以包名做爲 apiKey 的,若是包名變了可能不少三方 SDK 就不 work 了,好比百度地圖、三方推送這些。
我當時的實踐到最後,也發現是推送會有問題,須要從新申請,這在當時是不可行的,因此改包名這種方式的確是有問題,我寫這篇文章的目的主要也是給你們提供一些參考,謝謝你們^_^