使用Gradle構建Android應用內測版本
在開發應用的過程中,有時候需要比較當前線上版本和正在開發中的版本差異,目前的做法只能是在兩個不同的裝置上面安裝線上版本和開發中的版本,因為當前版本在除錯過程中會覆蓋舊版本。本文通過使用gradle來構建android應用變種版本,通過配置build type和productFlavors來進行實踐,結果不完全盡如人意,但是提供了同一個程式不同變種在一個裝置上共存的一種實踐。
applicationID VS package
在android的manifest檔案中,我們可以配置一個package欄位,這個欄位主要有兩個作用:
- 作為包名指出當前應用的R檔案所在路徑和元件所在路徑。所以我們在manifest檔案中可以使用相對路徑來配置activity等。
- 作為應用的唯一標識在系統中存在,此時,其作用==applicationID。
要使同一個應用的不同版本在裝置上共存的前提是它們具有不同的applicationID。
buildTypes VS productFlavors
要修改applicationId可以通過配置buildTypes中的applicationIdSuffix屬性,起作用是將applicationId設定為package加上你所配置的字尾。此時,面臨的第一個問題是我可能需要對debug版本和線上版本進行區分,比如不同的app圖示,app名字以便在launcher裡面進行區分。此時,productFlavor可以幫上忙,productFlavor提供了替換程式資原始檔的功能,只需要在當前專案的src目錄下新建一個flavor目錄,在裡面覆寫資源即可。
到此,我們可以構建出一個用於開發的內測版本,它不會覆蓋手機上已經安裝的線上版本。
一些嘗試
通過第二節,我們可以打出一個內測包,但是還是存在如下問題:
- 兩個版本中大部分的隱式跳轉都一樣,你能忍受在應用內隨便點選一個頁面,就會彈出選擇框的情況?
- 如果應用中註冊了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包沒有任何差別。
相關文章
- 使用新 Android Gradle 外掛加速您的應用構建AndroidGradle
- Android 應用構建速度提升Gradle配置優化AndroidGradle優化
- 用Gradle 構建你的android程式GradleAndroid
- Gradle for Android ( 構建變體 )GradleAndroid
- Android Studio gradle外掛版本和gradle版本對應關係AndroidGradle
- Android開發中Gradle外掛,Gradle版本與JDK版本之間的對應關係 AndroidAndroidGradleJDK
- 使用gradle構建springboot專案GradleSpring Boot
- Gradle For Android(2)--基礎的定製構建GradleAndroid
- 使用 webpack 構建應用Web
- 使用 Kotlin 構建 MVVM 應用程式—提高篇:Dagger-AndroidKotlinMVVMAndroid
- 使用Jenkins自動構建Android應用打包並上傳JenkinsAndroid
- springboot gradle demo (使用 Gradle 構建的 Spring Boot專案)Spring BootGradle
- 使用汽車應用庫構建應用
- Android中的Gradle之配置及構建優化AndroidGradle優化
- Android Gradle Groovy自動化構建進階篇AndroidGradle
- IDEA使用Gradle構建SpringBoot專案工程IdeaGradleSpring Boot
- Gradle自動實現Android元件化模組構建GradleAndroid元件化
- 使用webpack構建多頁應用Web
- 「譯」使用 Node 構建命令列應用命令列
- 使用Spring ViewComponent + htmx構建SpringBoot應用ViewSpring Boot
- 使用 Cloudflare 構建 Web3 應用CloudWeb
- Gradle之多專案構建Gradle
- gradle構建spring原始碼GradleSpring原始碼
- Gradle構建SpringBoot專案GradleSpring Boot
- gradle中的增量構建Gradle
- 【Java】【Gradle】Gradle構建SpringBoot專案,Gradle模組化管理JavaGradleSpring Boot
- Chapter5:使用Gradle管理多模組構建APTGradle
- 使用React Native和Expo快速構建原生移動iOS和Android應用程式React NativeiOSAndroid
- 通過Gradle自動實現Android元件化模組構建GradleAndroid元件化
- Android入門教程 | 使用 ConstraintLayout 構建自適應介面AndroidAI
- [Apache][Nginx]構建僅對團隊內部公開使用的web應用ApacheNginxWeb
- 使用 OpenTelemetry 構建 .NET 應用可觀測性(4):ASP.NET Core 應用中整合 OTelASP.NET
- 使用 OpenTelemetry 構建 .NET 應用可觀測性(3):.NET SDK 概覽
- 構建 API 應用API
- 使用Angular與TypeScript構建Electron應用(六)AngularTypeScript
- 使用Java和Spring MVC構建Web應用JavaSpringMVCWeb
- 使用Java和Reactive Streams構建流式應用JavaReact
- 使用Rust和WebAssembly構建Web應用程式RustWeb
- 使用微服務構建現代應用程式微服務