Android组件化初探
Android組件化初探
1. 現狀
隨著業(yè)務增加,代碼量急劇增加,大大延長了編譯時間,短則3min,長則7、8min;很多同學為節(jié)省開發(fā)時間,自己新建新的app,完成開發(fā)后,再合并到project中;組件化的目的就是為了解耦,將業(yè)務模塊獨立出來,自成一個apk,這樣開發(fā)期間能提高效率
2. 原理
編譯期間動態(tài)設置自己業(yè)務Module屬性(app/library)
在開發(fā)期間,只需要編譯自己的業(yè)務模塊代碼,并將自己業(yè)務模塊Module設置app;這樣能很大程度上提高編譯速度,提高開發(fā)效率;在發(fā)版期間將自己業(yè)務Module設置為libray模式即可
3. 需要解決的問題
4. 實現
4.1 編輯根目錄gradle.properties文件
為了能夠區(qū)分開發(fā)模式和發(fā)布模式,我們可以在項目根目錄gradle.properties文件中添加一個屬于自己業(yè)務模塊變量,以區(qū)分是開發(fā)模式還是發(fā)布模式(下面以module1為樣例進行說明)
#標識MODULE1以app方式啟動,發(fā)布時可改為falseMODULE1_IS_APP = true4.2 編輯settings.gradle文件
讓gradle動態(tài)指定需要參與編譯的module
if(MODULE1_IS_APP.toBoolean()){include ':module1', ':framework', ':baseresource' }else{include ':app', ':module1', ':framework', ':baseresource' }4.3 編輯moudle1工程中build.gradle文件
為能在編譯期間動態(tài)設置通通花module是以app還是library需要添加如下代碼:
//解決問題1 if (MODULE1_IS_APP.toBoolean()) {apply plugin: 'com.android.application'//解決問題7,關于如何集成freeline//參見(http://blog.csdn.net/dbs1215/article/details/64166592)此處不再闡述請參考//apply plugin: 'com.antfortune.freeline' } else {apply plugin: 'com.android.library' }android {compileSdkVersion 23buildToolsVersion "23.0.3"defaultConfig {minSdkVersion 14targetSdkVersion 23versionCode 1versionName "1.0"if (MODULE1_IS_APP.toBoolean()) {multiDexEnabled true}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}buildTypes.each {//解決問題6 代碼中可以通過BuildConfig.MODULE1_IS_APP獲取it.buildConfigField "boolean", "MODULE1_IS_APP", MODULE1_IS_APP}//解決問題3 (只能做到布局文件,字符串等資源前綴,java類,圖片需要自己處理)resourcePrefix "module1_"sourceSets {main {//解決2、5問題if (MODULE1_IS_APP.toBoolean()) {//如果是app啟動,使用該清單文件manifest.srcFile 'src/main/xml/app/AndroidManifest.xml'} else {manifest.srcFile 'src/main/xml/library/AndroidManifest.xml'java{//debug包不參與打包exclude '**/debug/**'}}}}configurations {all*.exclude group: 'com.android.support', module: 'support-v4'all*.exclude group: 'com.android.support', module: 'support-annotations'} }dependencies {//業(yè)務module需要依賴的相關庫compile fileTree(dir: 'libs', include: ['*.jar'])compile project(':framework')compile project(':baseresource') }4.4 問題4如何解決?
可以通過依賴注入來實現
首先可以聲明一個接口IDependService
添加Module1需要依賴其他Module的方法
在依賴方Module某個路徑下實現該接口
具體如何實現可以參見末尾代碼鏈接
依然存在的問題
思考
- 如何定義并剝離Module
- 組件與組件間通訊(Router)
示例工程鏈接
總結
以上是生活随笔為你收集整理的Android组件化初探的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AndroidStudio 常用配置
- 下一篇: Android-带你从源码角度理解Sha