isapplicationmodule1=false
isapplicationmodule2=false
isapplicationmodule3=false
然後在module中的build.gradle中改變 application 還是 library
(1) 區分 application 還是 library
if (isapplicationmodule1.toboolean()){
apply plugin: 'com.android.application'
}else{
apply plugin: 'com.android.library'
}
(2) 增加 applicationid
defaultconfig {
applicationid "com.demo.myapplication.module1"
(3) androidmanifest 啟動入口
sourcesets {
main {
if (isapplicationmodule1.toboolean()) {
manifest.srcfile 'src/main/module/androidmanifest.xml'
} else {
manifest.srcfile 'src/main/androidmanifest.xml'
)4. 在主 app module 中引入其他module
要注意的一點是每個元件如果是獨立運作的話,那它是不能作為依賴庫供app子產品使用的,是以在app子產品下的build.gradle檔案中需要進行依賴判斷
if (!isapp
licationmodule1.toboolean()){
implementation project(':module1')
if (!isapplicationmodule2.toboolean()){
implementation project(':module2')
if (!isapplicationmodule3.toboolean()){
implementation project(':module3')
implementation project(':common')
在子產品 module中引入 common module
至此通過修改配置,每個module就可以單獨運作。
)5. 引入arouter
由于需要子產品之間的解耦,平時的intent跳轉需要導包,而arouter引入之後,就能在跳轉的同時不用導包。
內建arouter
(1) 引入依賴
common中添加
api("com.alibaba:arouter-api:$rootproject.ext.arouterlibversion") { exclude group: 'com.android.support' }
annotationprocessor "com.alibaba:arouter-compiler:$rootproject.ext.arouterannotationlibversion"
在每個module下都需要添加注解
(2) 每個引入arouter的module的build.gradle中加入下面代碼
...
//arouter
javacompileoptions {
annotationprocessoroptions {
arguments = [modulename: project.getname()]
(3) 在application中進行初始化
if (isdebug) {
arouter.openlog();
arouter.opendebug();
arouter.init(this);
(4)使用arouter跳轉
定義路由
@route(path = "/app/main")
public class mainactivity extends appcompatactivity {
跳轉路由
arouter.getinstance().build("/app/main").navigation();
)6. butterknife 的坑
單工程使用這個庫是沒有問題的,但是在元件化使用的時候就報錯了。 除了一系列的配置之外,還有個難受的地方就是需要把library中的r改成r2,但當你想把library改成application時,又要将r2改成r,這豈不是很難受。
!!! 是以我目前放棄在library中使用butterknife
)7. switch (view.getid()) 的坑
由于 library中的view.getid 可能是個變量,是以需要把 switch 改成 if。
快捷操作:
光标移至switch這行代碼上,同時按下 alt + enter, 此時點選 replace switch to if
)8. 資源重複的坑
no static field xxx of type i in class lcom/xxx/r$id錯誤
出現這個問題是layout 和 主布局名字重複了,養成習慣,在library中資源檔案前加上辨別,比如 library_layout
另外有一種方法隻是幫忙增加限制,提醒。
android {
compilesdkversion rootproject.ext.compilesdkversion
buildtoolsversion rootproject.ext.buildtoolsversion
// 增加資源的限制,提醒
if (toolsislibrary.toboolean()) {
resourceprefix "${project.name}_"
為了保證不與其他module沖突,建議在string、style、color、dimens 等資源檔案都加上字首。
)六、踩坑
)1. arouter 元件化打包不成功
出現問題:program type already present: com.alibaba.android.arouter.routes.aroutergroupgroupservice
在modulea 和 moduleb 中不能使用相同的 group。
根據提示報錯 service 就是重複的group,全局搜尋,于是發現在modulea 和 moduleb中都存在以下代碼。
package com.bp.tech.common.util;
import android.content.context;
import com.alibaba.android.arouter.facade.annotation.route;
import com.alibaba.android.arouter.facade.service.serializationservice;
import java.lang.reflect.type;
@route(path = "/service/json")
public class jsonserviceimpl implements serializationservice {
@override
public void init(context context) {