實現 Android 手機上同時安裝正式包和測試包

小拓先森發表於2019-02-17

1. 前言

Maybe 你會有這個煩惱,在開發的時候,測試突然告訴你,正式包上有點問題,需要看一下,這時候你開啟測試機發現上面裝的是測試包,沒事,那就解除安裝了裝個正式包唄。然後嘞,正式包的問題確認完了,發現不是 Bug,而是一個 Feature,你需要回到測試包繼續開發,結果發現,又得把正式包解除安裝瞭然後裝個測試包。

這一來二去的多麻煩呀~

怎麼解決呢,有人說,我手裡頭有兩臺測試機,一臺裝正式包,另一臺裝測試包。我想說,陳獨秀同學,你先坐下,我們大多數人都只有一臺測試機呀。

那麼,問題來了,怎麼實現一臺手機上同時安裝正式包和測試包呢。這就是本文要解決的問題。

2. 實現一臺手機上同時安裝正式包和測試包

我們知道,Android 應用的唯一標識是包名,也就是 build.gradle 裡的 applicationId。在一臺手機上不允許安裝的兩個包的唯一標識重複。因此,只需要把測試包的 applicationId 亦即包名改一下就好了~

2.1 修改測試包包名

查閱文件之後發現,Android 官方對這種場景早有支援,只需要在 app/build.gradleandroid->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

相關文章