開發一套已有大量使用者的 APP 時通常都要小心一點
為了程式的穩定性與品質
我們都會建立各種環境來把關
像是 dev 開發環境,sit 整合測試環境,uat 情境測試環境,prod 正式環境… 之類的
雖然每個公司的環境不一樣,但卻是大同小異的
問題來了,如果各環境所需要的參數值不一樣
或是連接的 backend 不同的話
我們要怎麼去設定呢?
舉個例子,以下是改良前的方法
在 gradle.properties 中定義不同環境的 url 值
然後在 build.gradle 時候引用
這裡的作法是直接寫了好幾套不同的值,再依照程式運行的環境來手動變更
這樣做不僅麻煩,而且也無法保證會不會有人正式上版的時候忘記改
關於正式上版的包版程序,我認為人工介入的動作越少越安全
所以這是個較不推薦的方法
=========================================
其實 Android 本身就有提供環境區分的功能
我們就由上述這個例子來加以改善吧
首先我們要介紹 buildType
通常都有 debug,release 兩種
舉個實際用法,當我們打印 log 時
為了方便開發,有些 log 可能只想在開發版印出來就好,正式版不印
此時就可以利用 BuildConfig.DEBUG 這樣做
buildType 的功能當然不只這樣
我們在 build.gradle 中也可以依不同 buildType 來做設定,如下圖
再來就是 productFlavors,它的概念和 buildType 有點類似
但其目的是讓打包可以更符合自己的需求
比如這裡我們設了三個 productFlavors
我們在各 flavor 做想要的差異化設定
然後 build 的時候可以在 Build Variants 選擇版本
設定後如下圖,會有每個 flavor 的 buildType 可以選
然後在打包 apk 的時候也可以做選擇,甚至全選也行
最後的 apk 就會在 app/flavor name/buildType name/app-flavor-buildType.apk 如圖
以為這樣就結束了嗎?
還沒呢,我們若有一些圖片檔、設定檔,甚至是 java code 要依環境不同的話怎麼辦?
這就要提到資料夾結構了
在專案的 app/src/main 這個同層目錄上
我們可以建造不同 flavors 的資料夾,來存放不同的檔案
Android Studio 在 build 的時候會先去相對應名稱的資料夾找資源
沒有才會回 main 裡面找需要的資源
我們以 google-server 設定的 json 為例子,如下圖
最後要提一下 flavorDimensions 這個值
是從 Android Studio 3.0 之後開始,若使用 flavor 被要求必需實做的值
那這個值是什麼意思呢?
其實就是更多元的差異化打包,Dimensions 直翻為維度
我們可以從 build type 和 flavors 建構的平面二維種類加到立體的三維種類
可以想像是手機廠商有各類機型
然後每種機型又有各自的 build type 和 flavors 要打包的感覺。
以上就是 Android Studio 自配適各環境的用法
參考資料:https://developer.android.com/studio/build/build-variants
留言列表