android debug bridge tools_如何优雅的管理多环境下的Android代码
生活随笔
收集整理的這篇文章主要介紹了
android debug bridge tools_如何优雅的管理多环境下的Android代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
秦子帥明確目標,每天進步一點點.....作者?|? 小碼哥哥地址?|?juejin.im/post/5e1ef261f265da3e0535f10a介紹日常開發過程中除了主工程代碼,肯定也少不了調試代碼,如日志、調試開關、調試工具、功能Mock等等,此時就需要一個開發階段使用的開發環境?,F在很多項目都使用云測試,三方云測試平臺(如testin, 阿里云等等)測試時往往無法跳過登錄,所以要在云測的安裝包中內置登錄token,還要指定云測接口等等一些云測場景下的一些特殊功能,此時就需要一個專為三方云測平臺使用的云測環境。項目上線當然需要有線上環境 此外AS/Gradle還內置了debug環境和release環境。那么多不同的環境,代碼如何去做管理? 又如何把不同環境的代碼完全隔離開來?我們必須要保證調試、Mock等等這些業務無關的代碼完全不能影響到線上。首先, 我們使用AS新建一個項目, 我們看看AS/Gradle有什么?如上圖所示, AS已經在src目錄下創建三個SourceSet目錄,分別是androidTest, main和test,其中main是主工程目錄,其他兩個是用于單元測試目錄。AS/Gradle只有這三個SourceSet目錄嗎?當然不是!我們知道build.gradle配置文件中,可以配置buildTypes.默認已經有debug和release兩個buildType. 我們還可以自定義一個buildType名字叫custom.android {????...????????buildTypes {????????debug {????????????minifyEnabled false????????????proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'????????}????????release {????????????minifyEnabled true????????????proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'????????}????????custom {????????????minifyEnabled false????????????proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'????????}????}}執行同步操作后,我們點開AS左側的"build Variants",我們可以選擇具體使用哪個buildType很多人可能會問, 這有什么用?這真的很有用!上面說過AS已經在src目錄下創建了名為"main"的SourceSet目錄和另外兩個test目錄。此時我們可以在src目錄下再創建一個debug/release/custom目錄,目錄下的內容和main目錄下內容一致。main目錄一直處于激活狀態,但同一時刻只會有一個buildType的SourceSet目錄會被激活,如下圖所示。編譯時,Gradle會自動合并多個SourceSet目錄。AS/Gradle還支持根據buildType引入其他module或者三方倉庫dependencies {????????...????????debugImplementation project(":debugLib1")????????debugApi 'com.android.support:appcompat-v7:28.0.0'????????????????customImplementation project(":customLib")????????customApi 'com.google.code.gson:gson:2.8.5'????????...????}除了buildType,AS/Gradle還支持productFlavors,內容和buildTypes類似,可自行百度這里不再贅述。需要強調的是Gradle在編譯時可以同時有一個buildType,一個productFlavor和main三個SourceSet共存,編譯過程中會自動合并三個SourceSet目錄.現在,如何使用多環境已經顯而易見了,我們只要按需自定義buildType/productFlavor,然后將調試或者Mock的代碼放到對應的buildType/productFlavor的SourceSet下就可以做到不同環境代碼分離了。代碼分離就一切順利了嗎?實際操作過程中會發現,buildType/productFlavor是可以直接引用到main下面的代碼,相反卻是不可以的,因為一旦做buildType/productFlavor切換操作的時候,main就可能找不到buildType/productFlavor中的類了。問題來了,既然main無法直接引用buildType/productFlavor中的代碼,那么buildType/productFlavor中的代碼如何初始化?main又如何調用這些類呢?就以上面說的云測環境做例子,假設我為云測創建了一個productFlavor名字叫cloud,我想要在云測環境app執行初始化的時候調用一次登錄接口,這樣就可以內置token而不需要在云測環境手動登錄了,public?class?LoginManager?{????public?static?void?login()?{????????//do login????}}如何觸發這個登錄操作是一個問題。通常我們會在自定義Application的onCreate()方法中執行初始化。public?class?App?extends?Application?{????????@Override????public?void?onCreate()?{????????LoginManager.login(); //這里不應該直接引用LoginManager, 因為LoginManager在productFlavor為cloud的SourceSet中, 一旦切到其他productFlavor,LoginManager類就找不到了????}}這里有一個辦法?在cloud中新建一個CloudApp繼承自main中的App,然后在could的AndroidManifest中引用????????android:name="chao.app.cloud.CloudApp"?????????tools:replace="android:name"?//必要, 使用CloudApp替換App????????...????????/>public?class?CloudApp?extends?App?{????@Override????public?void?onCreate()?{????????super.onCreate();????????LoginManager.login(); //這樣就不用擔心buildType/productFlavor切換導致類找不到的問題了????}}簡單的場景里這個方法是很有效的,場景再復雜一點呢如果BuildVariants選擇cloudDebug,即productFlavor是cloud,buildType是debug,debug也需要有自己的初始化,但是AndroidManifest中Application最終只能有一個。所以稍微復雜點的場景問題會變得很棘手。另外由于存在多環境切換,buildType/productFlavor中的類是不能直接被調用的。
如何解決ServicePool是一個用于組件化通信的神器??梢院苡行У慕鉀Q上述問題。https://juejin.im/post/5e1e76c6518825267f699a3d使用ServicePool初始化Service初始化代替Application初始化,cloud中定義一個CloudInit,debug中定義一個DebugInit.public?class?App?extends?Application?{????@Override????public?void?onCreate()?{????????super.onCreate();????????AndroidServicePool.init(this); //初始化ServicePool????}}@Init(lazy = false) //ServicePool默認所有組件使用懶加載,這里取消掉懶加載模式,讓ServicePool初始化后理解加載這個Service@Servicepublic class CloudInit implements IInitService {????@Override????public void onInit() {????????LoginManager.login();????}}@Init(lazy = false) //ServicePool默認所有組件使用懶加載,這里取消掉懶加載模式,讓ServicePool初始化后理解加載這個Service@Servicepublic class DebugInit implements IInitService {????????@Override????public void onInit() {????????//do something????}}上面已解決了多環境初始化問題,那么如何解決buildType/productFlavor下類又是如何被調用的呢?相信看完ServicePool你一定能找到答案。本文檔涉及demo代碼:https://github.com/luqinx/Documents
如何解決ServicePool是一個用于組件化通信的神器??梢院苡行У慕鉀Q上述問題。https://juejin.im/post/5e1e76c6518825267f699a3d使用ServicePool初始化Service初始化代替Application初始化,cloud中定義一個CloudInit,debug中定義一個DebugInit.public?class?App?extends?Application?{????@Override????public?void?onCreate()?{????????super.onCreate();????????AndroidServicePool.init(this); //初始化ServicePool????}}@Init(lazy = false) //ServicePool默認所有組件使用懶加載,這里取消掉懶加載模式,讓ServicePool初始化后理解加載這個Service@Servicepublic class CloudInit implements IInitService {????@Override????public void onInit() {????????LoginManager.login();????}}@Init(lazy = false) //ServicePool默認所有組件使用懶加載,這里取消掉懶加載模式,讓ServicePool初始化后理解加載這個Service@Servicepublic class DebugInit implements IInitService {????????@Override????public void onInit() {????????//do something????}}上面已解決了多環境初始化問題,那么如何解決buildType/productFlavor下類又是如何被調用的呢?相信看完ServicePool你一定能找到答案。本文檔涉及demo代碼:https://github.com/luqinx/Documents
---END---
?創作不易,點個“在看”總結
以上是生活随笔為你收集整理的android debug bridge tools_如何优雅的管理多环境下的Android代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: visio 形状_分享我Visio经验(
- 下一篇: html 轮播图_JS拖拽专题(二)——