概述
组件化
最近做的一个项目,从一开始就在赶进度,所以没有仔细的去考虑架构的事情,然后在增加新的业务的时候,发现代码越来越臃肿,很难进行并行开发,模块与模块之间耦合严重,因此就想彻底的重构一下代码。
重构的步骤
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文件当中加入
这样是给我们的资源加入了一个限制,就是迫使你必须要以模块前缀命名。
总结
组件化能够很好的满足目前的需求,但是每个组件还需要依赖于其他的组件,如果能够将一个组件做成插件的形式,不依赖于其他的组件,需要什么服务,只需要配置以下,这样组件之间会更加的解耦,这种方式还需要再摸索一下。
最后
以上就是纯情黑裤为你收集整理的APP组件化的全部内容,希望文章能够帮你解决APP组件化所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复