在項目開發過程中,經常會有需要打包不同版本的 APK 的需求。 比如 debug版,release版,dev版等等。 有時候不同的版本中使用到的不同的服務端api域名也不相同。 比如 debug_api.com,release_api.com,dev_api.com等等。
不同的版本對應了不同的 api 域名,還可能對應不同的 icon 等。
如果每次都在打包前修改我們都手動來修改,這樣實在是不夠方便。
但如果我們使用了 Android Studio 和 Gradle,這個麻煩就可以輕松省去。
具體方式如下: 在 Android Studio 中打開 build.gradle(Module中)的 android 節點下添加如下代碼
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|
上面設置完成后,我們要在哪里使用它?
使用方式如下: 在 Android Studio 的工具欄中,找到『Build』項,找到『Generate Signed APK…』,如下圖。
選擇 Module -> 創建 APK key,或者輸入 APK key密碼 -> 關鍵來了!如下圖。
在『BuildType』處,選擇我們在 build.gradle 中設置的兩個 BuildType,分別是releas,dev,debug。其中『debug』為 Android Studio 自帶的。
在『Flavors』處,選擇我們在 build.gradle 中設置的兩個Flavors,以方便直接使用定義在 build.gradle 中自定義的參數。
所以! 上面我有提到說,buildType 和 Flavors 並沒有直接的聯系。 他們可以根據用戶需求互相配合使用。如上圖,BuildType 選擇了 release,但 Flavors 選擇的卻是 flavors_dev。
到此基本的使用就全部說完了。
這里有一個問題,打出來的不同版本的包,全部都能夠在同一部手機上安裝,且能夠將兩個包全都發布到 Google 的市場上去這是為什么呢?
這里就要提到在 BuildType 中我們所設置的『applicationIdSuffix』屬性了,按照這個屬性的字面翻譯為:『applicationId 的后綴』,那這里又來了一個問題,『applicationId』是什么? 其實這個『applicationId』屬性,實際上在項目創建完成后就存在於 build.gradle 中。在 android 節點下的 defaultConfig 節點中。而且默認的 applicationId 和 AndroidManifest.xml 中的 package 屬性相同。
如下圖:
我們能夠看到,這兩個屬性的默認值是相同的。
applicationId 和 packageName 它們是什么關系?
默認創建項目后,兩者相同。如果需要根據不同的需求構建不同版本的APK,這時我們通過設置『applicationIdSuffix』可以做到。
這里有一個值得注意的現象。
舉個例子,我們在打包時使用了 dev 類型,將打包出來的 APK 軟件安裝到手機中。
使用如下代碼,獲取我們手機上所有程序的packageName。
1
2 3 4 5 6 |
|
我們打印出來的包名信息中,會出現 com.spencer_dev.test.dev 。並沒有出現 com.spencer_dev.test 。
但是! 如果通過反編譯工具,將 APK 包進行反編譯直接查看源代碼,在 java 代碼所在的 src 目錄中的包名,還和我們設置的一樣,為 com.spencer_dev.test 。可 AndroidManifest.xml 中的 package 和 BuildConfig 類中的 APPLICATION_ID 已經變成了 com.spencer_dev.test.dev 。
applicationId 和 packageName 它們各自代表什么?
按照上面的結果來說, package 代表了 java 代碼中的包名。 applicationId 代表了應用中的唯一標識。和應用簽名一起用來區別和其他應用不同。我想這也就是為什么 Google 市場能夠允許相同應用不同 applicationId 的原因。