日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android组件化初探

發(fā)布時間:2024/9/30 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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. 需要解決的問題

  • 需要在編譯期間動態(tài)設置自己業(yè)務模塊屬性(app/library)
  • 開發(fā)模式應該存在一個DebugActivity 以作為app啟動頁;發(fā)布模式應該將其忽略不參與打包
  • 為保證資源不與其他模塊存在沖突,應限定自己module所有資源帶有指定前綴
  • 業(yè)務模塊可能會存在依賴其他業(yè)務模塊功能,如何實現?
  • debug模式和發(fā)布模式下清單文件應該單獨區(qū)分
  • 業(yè)務module在運行期間可能會對debug/發(fā)布模式做不同操作處理,java代碼層如何區(qū)分?
  • 當自己業(yè)務模塊代碼增加時,如何提高開發(fā)效率?
  • 4. 實現

    4.1 編輯根目錄gradle.properties文件

    為了能夠區(qū)分開發(fā)模式和發(fā)布模式,我們可以在項目根目錄gradle.properties文件中添加一個屬于自己業(yè)務模塊變量,以區(qū)分是開發(fā)模式還是發(fā)布模式(下面以module1為樣例進行說明)

    #標識MODULE1以app方式啟動,發(fā)布時可改為falseMODULE1_IS_APP = true

    4.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某個路徑下實現該接口

  • 在Module1添加一個類Module1SDK(單例)對象初始化時通過反射實現依賴注入
  • 具體如何實現可以參見末尾代碼鏈接

    依然存在的問題

  • 當自己的業(yè)務module1聯調依賴于其他業(yè)務module功能時,需要以app為主工程啟動,耗費時間,暫時沒找到別的有效辦法
  • 當自己的業(yè)務module1依賴于公共組件/基礎模塊,但未下沉,無法引用,尷尬。。。。只能通過copy(簡單點)/下沉(改動較大)方式來做
  • 思考

    • 如何定義并剝離Module
    • 組件與組件間通訊(Router)

    示例工程鏈接

    總結

    以上是生活随笔為你收集整理的Android组件化初探的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。