天天看點

Android 元件化實戰,flutter登入狀态是否需要單獨編譯, 是否是application,true為application,false為library

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) {