android debug bridge tools_如何优雅的管理多环境下的Android代码
生活随笔
收集整理的這篇文章主要介紹了
android debug bridge tools_如何优雅的管理多环境下的Android代码
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
秦子帥明確目標(biāo),每天進步一點點.....作者?|? 小碼哥哥地址?|?juejin.im/post/5e1ef261f265da3e0535f10a介紹日常開發(fā)過程中除了主工程代碼,肯定也少不了調(diào)試代碼,如日志、調(diào)試開關(guān)、調(diào)試工具、功能Mock等等,此時就需要一個開發(fā)階段使用的開發(fā)環(huán)境。現(xiàn)在很多項目都使用云測試,三方云測試平臺(如testin, 阿里云等等)測試時往往無法跳過登錄,所以要在云測的安裝包中內(nèi)置登錄token,還要指定云測接口等等一些云測場景下的一些特殊功能,此時就需要一個專為三方云測平臺使用的云測環(huán)境。項目上線當(dāng)然需要有線上環(huán)境 此外AS/Gradle還內(nèi)置了debug環(huán)境和release環(huán)境。那么多不同的環(huán)境,代碼如何去做管理? 又如何把不同環(huán)境的代碼完全隔離開來?我們必須要保證調(diào)試、Mock等等這些業(yè)務(wù)無關(guān)的代碼完全不能影響到線上。首先, 我們使用AS新建一個項目, 我們看看AS/Gradle有什么?如上圖所示, AS已經(jīng)在src目錄下創(chuàng)建三個SourceSet目錄,分別是androidTest, main和test,其中main是主工程目錄,其他兩個是用于單元測試目錄。AS/Gradle只有這三個SourceSet目錄嗎?當(dāng)然不是!我們知道build.gradle配置文件中,可以配置buildTypes.默認已經(jīng)有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'????????}????}}執(zhí)行同步操作后,我們點開AS左側(cè)的"build Variants",我們可以選擇具體使用哪個buildType很多人可能會問, 這有什么用?這真的很有用!上面說過AS已經(jīng)在src目錄下創(chuàng)建了名為"main"的SourceSet目錄和另外兩個test目錄。此時我們可以在src目錄下再創(chuàng)建一個debug/release/custom目錄,目錄下的內(nèi)容和main目錄下內(nèi)容一致。main目錄一直處于激活狀態(tài),但同一時刻只會有一個buildType的SourceSet目錄會被激活,如下圖所示。編譯時,Gradle會自動合并多個SourceSet目錄。AS/Gradle還支持根據(jù)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,內(nèi)容和buildTypes類似,可自行百度這里不再贅述。需要強調(diào)的是Gradle在編譯時可以同時有一個buildType,一個productFlavor和main三個SourceSet共存,編譯過程中會自動合并三個SourceSet目錄.現(xiàn)在,如何使用多環(huán)境已經(jīng)顯而易見了,我們只要按需自定義buildType/productFlavor,然后將調(diào)試或者Mock的代碼放到對應(yīng)的buildType/productFlavor的SourceSet下就可以做到不同環(huán)境代碼分離了。代碼分離就一切順利了嗎?實際操作過程中會發(fā)現(xiàn),buildType/productFlavor是可以直接引用到main下面的代碼,相反卻是不可以的,因為一旦做buildType/productFlavor切換操作的時候,main就可能找不到buildType/productFlavor中的類了。問題來了,既然main無法直接引用buildType/productFlavor中的代碼,那么buildType/productFlavor中的代碼如何初始化?main又如何調(diào)用這些類呢?就以上面說的云測環(huán)境做例子,假設(shè)我為云測創(chuàng)建了一個productFlavor名字叫cloud,我想要在云測環(huán)境app執(zhí)行初始化的時候調(diào)用一次登錄接口,這樣就可以內(nèi)置token而不需要在云測環(huán)境手動登錄了,public?class?LoginManager?{????public?static?void?login()?{????????//do login????}}如何觸發(fā)這個登錄操作是一個問題。通常我們會在自定義Application的onCreate()方法中執(zhí)行初始化。public?class?App?extends?Application?{????????@Override????public?void?onCreate()?{????????LoginManager.login(); //這里不應(yīng)該直接引用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(); //這樣就不用擔(dān)心buildType/productFlavor切換導(dǎo)致類找不到的問題了????}}簡單的場景里這個方法是很有效的,場景再復(fù)雜一點呢如果BuildVariants選擇cloudDebug,即productFlavor是cloud,buildType是debug,debug也需要有自己的初始化,但是AndroidManifest中Application最終只能有一個。所以稍微復(fù)雜點的場景問題會變得很棘手。另外由于存在多環(huán)境切換,buildType/productFlavor中的類是不能直接被調(diào)用的。
如何解決ServicePool是一個用于組件化通信的神器。可以很有效的解決上述問題。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????}}上面已解決了多環(huán)境初始化問題,那么如何解決buildType/productFlavor下類又是如何被調(diào)用的呢?相信看完ServicePool你一定能找到答案。本文檔涉及demo代碼:https://github.com/luqinx/Documents
如何解決ServicePool是一個用于組件化通信的神器。可以很有效的解決上述問題。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????}}上面已解決了多環(huán)境初始化問題,那么如何解決buildType/productFlavor下類又是如何被調(diào)用的呢?相信看完ServicePool你一定能找到答案。本文檔涉及demo代碼:https://github.com/luqinx/Documents
---END---
?創(chuàng)作不易,點個“在看”總結(jié)
以上是生活随笔為你收集整理的android debug bridge tools_如何优雅的管理多环境下的Android代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: visio 形状_分享我Visio经验(
- 下一篇: android libc 有哪些函数_3