使用Gradle構建Android應用內測版本


在開發應用的過程中,有時候需要比較當前線上版本和正在開發中的版本差異,目前的做法只能是在兩個不同的設備上面安裝線上版本和開發中的版本,因為當前版本在調試過程中會覆蓋舊版本。本文通過使用gradle來構建android應用變種版本,通過配置build type和productFlavors來進行實踐,結果不完全盡如人意,但是提供了同一個程序不同變種在一個設備上共存的一種實踐。

applicationID VS package

在android的manifest文件中,我們可以配置一個package字段,這個字段主要有兩個作用:

  1. 作為包名指出當前應用的R文件所在路徑和組件所在路徑。所以我們在manifest文件中可以使用相對路徑來配置activity等。
  2. 作為應用的唯一標識在系統中存在,此時,其作用==applicationID。

要使同一個應用的不同版本在設備上共存的前提是它們具有不同的applicationID。

buildTypes VS productFlavors

要修改applicationId可以通過配置buildTypes中的applicationIdSuffix屬性,起作用是將applicationId設置為package加上你所配置的后綴。此時,面臨的第一個問題是我可能需要對debug版本和線上版本進行區分,比如不同的app圖標,app名字以便在launcher里面進行區分。此時,productFlavor可以幫上忙,productFlavor提供了替換程序資源文件的功能,只需要在當前項目的src目錄下新建一個flavor目錄,在里面覆寫資源即可。
到此,我們可以構建出一個用於開發的內測版本,它不會覆蓋手機上已經安裝的線上版本。

一些嘗試

通過第二節,我們可以打出一個內測包,但是還是存在如下問題:

  1. 兩個版本中大部分的隱式跳轉都一樣,你能忍受在應用內隨便點擊一個頁面,就會彈出選擇框的情況?
  2. 如果應用中注冊了Provider,將會被禁止安裝第二個app,因為Provider不能重名

針對第一個問題,我目前的解決方案是將actvity聲明的data字段全部引用資源文件,然后通過flavor去為debug版本修改data中的implict_intent_host字段。

	<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已經不再是公約的版本,這個暫時還沒有解決方案來處理。。。,小小的遺憾

第二個問題好解決,只需要將provider的authorities字段區分一下即可,同樣也會帶來一點點問題,比如一個公司內部存在多個app,之間通過provider來提供數據的話,那么這個provider應該對於其它app是已知的,修改authorities之后,其他app會找不到這個provider。

總結

以上提到的方法雖然存在一些問題,但是從目前來看只要注意到之前提到的這些內容,應該不會給開發帶來太大的困擾,同時我們最好提供一個默認的flovar,它不定義任何特殊的行為,那么通過gradle assembleNormalDebug和我們正常打出來的debug包沒有任何差別。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM