APP组件化

组件化

最近做的一个项目,从一开始就在赶进度,所以没有仔细的去考虑架构的事情,然后在增加新的业务的时候,发现代码越来越臃肿,很难进行并行开发,模块与模块之间耦合严重,因此就想彻底的重构一下代码。

重构的步骤

1.组件化

重构的目标:各个组件解耦,每一个业务模块在debug模式下能够独立运行,在release模式下能够合并成一个整体的apk。
整个项目的模块如下:

app模块:项目的壳
common模块:所有的模块均需要依赖于common模块,里面存放一些基类,style等等。
secondmodule:业务模块,可单独打包成apk运行
thirdmodule:业务模块,可单独打包成apk运行
业务模块之间互相不耦合,通过Arouter实现模块之间的跳转。
这里写图片描述

2.通过Arouter解耦模块

2.1common模块依赖于Arouter,并在common模块当中添加跳转的url
这里写图片描述
跳转的url
这里写图片描述
2.2业务模块依赖于common模块,并添加跳转注解
这里写图片描述

这里写图片描述
添加跳转注解
这里写图片描述
对于thirdmodule也是同样的处理方式,这样模块之间跳转就不需要相互依赖。

3.实现模块能够作为单独的apk运行

3.1在gradle.properties当中定义一个变量 isModuleDebug 作为是否是debug模式的标志
这里写图片描述
3.2在模块的gradle文件当中加入以下判断
这里写图片描述
如果处于debug模式,那么模块作为application运行,如果不处于debug模式,那么模块作为library。
那么问题就来了,如果作为application运行,就必须要有入口,如果在模块自动生成的AndroidManifest文件当中添加入口,整个app就会有多个入口,是无法编译通过的,因此必须要在模块当中保留两份AndroidManifest文件。
3.3加入debug和release版的AndroidManifest文件
在main目录下分别建立debug和release文件夹,release文件夹下的AndroidManifest文件直接使用默认的即可。
这里写图片描述
debug文件夹下的AndroidManifest文件如下,需要设置一个程序的入口

<manifest xmlns:android="http://schemas.android.com/apk/res/android";
package="linktime.com.secondmodule" >

<application
    android:name="linktime.com.common.BaseApplication"
    android:allowBackup="true"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/Theme.AppCompat.NoActionBar">
    <activity android:name=".SecondActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>

另外还要再模块的配置文件当中加入以下判断,如果是debug版本,就使用debug文件夹下的AndroidManifest,如果是release版本,就使用release文件夹下的Android Manifest,并不要引入debug文件夹下的内容。

sourceSets{
    main{
        if(isModuleDebug.toBoolean()){
            manifest.srcFile 'src/main/debug/AndroidManifest.xml'
        }else{
            manifest.srcFile 'src/main/release/AndroidManifest.xml'
            java{exclude 'debug/**'}
        }
    }
}

4.到这里,已经能够实现组件与组件之间的解耦
但还有一个问题,就是组件单独运行的时候,如果需要引用Application,在debug模式下自己实现一个Application,就会出现debug和release模式引用的Application不同的问题。
可以在common组件当中实现一个BaseApplication,其他组件都继承自这个Application。

public class BaseApplication extends Application{

private static BaseApplication instance;

@Override
public void onCreate() {
    super.onCreate();
    if(BuildConfig.DEBUG){
        ARouter.openLog();
        ARouter.openDebug();
    }
    ARouter.init(this);
    instance = this;
}

public static Context getContext(){
    return instance;
}
}

需要注意的问题

1.版本号的统一管理

在项目的gradle文件当中增加ext变量

ext{
    compileSdkVersion = 26
    buildToolsVersion = "26.0.2"
    minSdkVersion = 19
    targetSdkVersion = 26
    versionCode = 2
    versionName = "v1.2"
    schemaVersion = 17
}

然后在组件的gradle文件当中配置
这里写图片描述

2.资源冲突的问题

在gradle文件当中加入

这里写图片描述
这样是给我们的资源加入了一个限制,就是迫使你必须要以模块前缀命名。

总结

组件化能够很好的满足目前的需求,但是每个组件还需要依赖于其他的组件,如果能够将一个组件做成插件的形式,不依赖于其他的组件,需要什么服务,只需要配置以下,这样组件之间会更加的解耦,这种方式还需要再摸索一下。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值