前言
Module項目,顧名思義就是作為app的獨立的單元模塊的項目。
在小型app項目里因為沒有這么多頁面與java文件,所以模塊意義不大,所以在小型項目里意義更多是用於管理libs,畢竟將所有的第三方庫都放到主項目的libs下,如果第三方庫多了管理這個libs文件夾會特別費勁,因為文件太多了。我們可以將一些重量級的第三方庫獨立用一個Module管理。
而在大型項目里意義就很大了,因為Android開發是不建議在主項目里放入大量的文件來管理各個模塊的,一方面很亂各種依賴,另一方面也違背了插拔模塊與面對對象的思想。所以將一些模塊獨立開放到module里意義重大,這樣在分工開發的時候各自的開發人員只需要關注自己的module項目就行了。 另外各個java文件也可以很平面化管理(只在項目里創建幾個類別文件),而不是根據一個模塊在主項目里創建一個這個模塊名稱的文件夾,然后在里面又創建類別文件夾在來區分放入各種這個模塊的activity、adapter、util、widget、bean。正確做法應該將這個模塊獨立成一個module項目。
添加一個新的Module項目
第一步:在Android studio的菜單欄 找到 > File > New > New Module... 點擊進入 Create New Module
選擇Android Library 點擊 Next
第二步:輸入項目名稱
導入一個舊的Module項目
第一步:在Android studio的菜單欄 找到 > File > New > Import Module... 點擊進入
第二步:導入一個自己需要的項目,並且設置名稱,點擊Finish。我這里選擇了一個叫MyModule的項目
成功導入后我們可以在目錄下面看到這個項目。
第三步,導入完成后並不是結束了,現在需要配置這個項目成為library項目
1.首先我們需要進入我們的app主項目的build.gradle下添加這個項目
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.legacy:legacy-support-v4:1.0.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' implementation project(':MyModule')//在這里引用項目 注意別忘記:號 }
2.修改根目錄下的settings.gradle文件 添加上你導入的項目名稱
include ':app', 'MyModule'
rootProject.name='FragmentDemo'
3.打開MyModule項目下的build.gradle,我們將在這里配置相關屬性,首先我們看看如果沒有配置過的build.gradle是什么樣的並且標注要修改的點
沒有修改過過的build.gradle
apply plugin: 'com.android.application' //這里要修改成 'com.android.library' android { compileSdkVersion 28 defaultConfig { applicationId "com.zh.mymodule" //這個id要去掉 minSdkVersion 27 //注意這里的最低版本,需要與主項目一致 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } }
修改后
apply plugin: 'com.android.library' android { compileSdkVersion 28 defaultConfig { minSdkVersion 27 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } }
4.重新編譯整個項目,就可以看到我們的項目變成library項目了
刪除一個Module項目
1.去掉settings.gradle文件里,需要刪除的項目名稱。 這步很重要如果不刪除這個項目名稱,你無法在Android studio里刪除這個導入的項目,並且就算手動在文件夾里刪除目錄Android studio依然自動生成這個項目的目錄
2.去掉app主項目的build.gradle文件里,implementation project()的項目
3.然后就是重新編譯一下項目,這個時候項目的library屬性就被去除了,然后直接刪除這個項目即可。
設置Module項目的Libs的Jar在主項目里使用
1.在項目里添加libs包,並且加入jar
2.設置這個module項目的build.gradle
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' api files('libs/xxxxxxxx.1.0_L.jar') //關鍵點 api files }
這樣就可以在主項目上使用這個jar包了,而不是jar只局限在這個module項目里
設置Module的github依賴項目可以被其他Module調用
有時候我們會將一些網絡請求或者推送封裝成一個module,但是有個問題怎么將Module依賴的庫給其他Module調用,如下:
dependencies { //略... implementation 'com.squareup.retrofit2:retrofit:2.6.2' implementation 'com.squareup.retrofit2:converter-gson:2.4.0' implementation 'com.squareup.okhttp3:logging-interceptor:4.4.0'//okhttp攔截器 }
上面這個依賴的3個庫是無法提供給外部調用的只要將它們的implementation 修改成 api即可。
implementation這個指令的特點就是,對於使用了該命令編譯的依賴,對該項目有依賴的項目將無法訪問到使用該命令編譯的依賴中的任何程序,也就是將該依賴隱藏在內部,而不對外部公開。
END