天天看点

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