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

1. 前言

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

這一來二去的多麻煩呀~android

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

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

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

咱們知道,Android 應用的惟一標識是包名,也就是 build.gradle 裏的 applicationId。在一臺手機上不容許安裝的兩個包的惟一標識重複。所以,只須要把測試包的 applicationId 亦即包名改一下就行了~編程

2.1 修改測試包包名

查閱文檔以後發現,Android 官方對這種場景早有支持,只須要在 app/build.gradleandroid->buildTypes->debug 節點下面設置 applicationIdSuffix 便可,示例以下:api

android {
    // ...
    
    buildTypes {
        debug {
            minifyEnabled false
            applicationIdSuffix ".test"         // 測試包增長包名後綴
        }
        release {
            // ...
        }
    }
    
    //...
}
複製代碼

2.2 問題來了~編譯失敗

事情每每不會這麼簡單,在我修改完 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 #1888app

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
相關文章
相關標籤/搜索