在開發應用的過程當中,有時候須要比較當前線上版本和正在開發中的版本差別,目前的作法只能是在兩個不一樣的設備上面安裝線上版本和開發中的版本,由於當前版本在調試過程當中會覆蓋舊版本。本文經過使用gradle來構建android應用變種版本,經過配置build type和productFlavors來進行實踐,結果不徹底盡如人意,可是提供了同一個程序不一樣變種在一個設備上共存的一種實踐。
html
在android的manifest文件中,咱們能夠配置一個package字段,這個字段主要有兩個做用:html5
要使同一個應用的不一樣版本在設備上共存的前提是它們具備不一樣的applicationID。android
要修改applicationId能夠經過配置buildTypes中的applicationIdSuffix屬性,起做用是將applicationId設置爲package加上你所配置的後綴。此時,面臨的第一個問題是我可能須要對debug版本和線上版本進行區分,好比不一樣的app圖標,app名字以便在launcher裏面進行區分。此時,productFlavor能夠幫上忙,productFlavor提供了替換程序資源文件的功能,只須要在當前項目的src目錄下新建一個flavor目錄,在裏面覆寫資源便可。
到此,咱們能夠構建出一個用於開發的內測版本,它不會覆蓋手機上已經安裝的線上版本。app
經過第二節,咱們能夠打出一個內測包,可是仍是存在以下問題:ide
針對第一個問題,我目前的解決方案是將actvity聲明的data字段所有引用資源文件,而後經過flavor去爲debug版本修改data中的implict_intent_host字段。gradle
<data android:host="@string/implict_intent_host" android:path="/movie" android:scheme="@string/implict_intent_scheme" />
這樣,debug版本的activity的data將會改變,因爲以前項目在建立隱式跳轉都集中管理了,那麼只須要修改建立的隱式intent Uri的host部分從資源文件讀取便可。可是這個方案存在一些問題:從第三方(如html5頁面)的跳轉就會失效,由於內測版本的intent host已經再也不是公約的版本,這個暫時尚未解決方案來處理。。。,小小的遺憾ui
第二個問題好解決,只須要將provider的authorities字段區分一下便可,一樣也會帶來一點點問題,好比一個公司內部存在多個app,之間經過provider來提供數據的話,那麼這個provider應該對於其它app是已知的,修改authorities以後,其餘app會找不到這個provider。debug
以上提到的方法雖然存在一些問題,可是從目前來看只要注意到以前提到的這些內容,應該不會給開發帶來太大的困擾,同時咱們最好提供一個默認的flovar,它不定義任何特殊的行爲,那麼經過gradle assembleNormalDebug和咱們正常打出來的debug包沒有任何差異。調試