1.组件化工程的结构:
1.1 壳工程
壳工程中没有任何业务逻辑,也没有Activity,它的功能如下:
1.app壳工程中声明了Android应用的 Application
2.app壳工程的 AndroidManifest.xml 是Android应用的根表单,应用的名称、图标等在壳工程的manifest中配置,其他组件的manifest文件最终会合并到壳工程的manifest文件中
3.壳工程的build.gradle无论在开发模式,还是集成模式,都使用com.android.application插件,
在组件开发模式下,壳工程只需要依赖common组件;
在集成模式下,壳工程要依赖其他所有组件;
1.2 功能组件和Common组件
普通功能组件:
功能组件一般为业务组件提供一些功能,作用与三方库相同,可以理解为工具类的集合,例如Log工具;
这些组件模块的manifest文件为空,插件始终使用apply plugin: 'com.android.library'
,无法独立运行
common组件:
Common组件的Manifest文件声明应用用到的所有使用权限
Common组件的 build.gradle文件统一依赖业务组件中用到的第三方依赖库
和jar包
Common组件的可以存放公用的资源
文件和工具类
1.3 业务组件和Main组件
业务组建模块的最大特点就是,即可以作为独立的App运行,又可以作为依赖;
普通业务组件:
需要两个mainfest文件
,分别对应组件开发模式
和集成开发模式
在组件开发模式下,业务组件可以独立运行,单独编译,所以需要有自己的Application
在集成开发模式下,业务组件作为依赖被壳工程引用,不需要自己的Application
Main组件:
Main组件和普通的component组件功能类似,只是Main组件向壳工程提供了LaunchActivity
2.实现一个组建化样例:
2.1 建立壳工程:
壳工程是一个空的模块,功能完全依赖业务组件完成;
1.添加公有属性标记当前状态:
首先在需要在gradle.properties
文件中添加一个属性,表明当前工程是否处在组件开发模式,这个属性可以被所有Module的build.gradle访问,从而实现状态切换:
isComponentMode = true //true表示组件开发模式,各个业务组件可以独立运行
2.壳工程的build.gradle文件:
apply plugin: 'com.android.application' //始终使用application,即壳工程始终是一个独立的App
android {
defaultConfig {
applicationId "com.example.mtest" //壳工程需要可独立运行,所以需要applicationId
...
}
... //在壳工程中同一进行混淆
}
dependencies {
...
if (isComponentMode.toBoolean()) { //组件开发模式下,壳工程为空,不引用业务组件
implementation project(":common")
} else { //集成模式下,壳工程引用所有业务组件
implementation project(":module_login")
implementation project(":module_firmware")
}
}
3.壳工程需要在manifest文件管理App图标等属性
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mtest">
<application
android:icon="@mipmap/ic_launcher"
android:name="com.example.common.BaseApplication"
android:theme="@style/AppTheme"/>
</manifest>
2.2 建立功能组件:
这里建立一个common功能组件为例
1.提供Application:
所有的业务组件都要依赖这个common组件,而业务组件独立运行的时候,需要一个共同的Application,这个Application最好由common组件提供:
public class BaseApplication extends Application {
...
}
2.common功能组件的gradle文件:
apply plugin: 'com.android.library' //功能组建只能作为依赖使用
android {
...
}
dependencies { //common组件添加所有的依赖包,普通功能组建不需要
implementation 'io.reactivex.rxjava2:rxjava:2.1.4'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation 'com.github.bumptech.glide:glide:4.10.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0'
...
}
3.common功能组件的manifest只需申请权限:
普通功能组件的manifest的为空
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.common">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
另外common功能组建还可以放一些公用的资源文件和工具类,略;
3.建立业务组件:
1.建立新的manifest文件:
假设原有的manifest文件是独立App的配置:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.loginmoduel">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:name="com.example.common.BaseApplication"
...>
//业务组建中建立一个业务相关的Activity组件,可以看出这是一个Main组件
<activity android:name=".LoginActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
那么需要在另一路径下建立一个新的manifest文件:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.loginmoduel">
<application android:theme="@style/AppTheme">
<activity android:name=".LoginActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
2.业务组件的gradle文件:
if (isComponentMode.toBoolean()) { //如果当前在组件模式下,使用application插件
apply plugin: 'com.android.application'
} else { //如果当前在集成模式下,使用library插件
apply plugin: 'com.android.library'
}
android {
sourceSets {
main {
if (isComponentMode.toBoolean()) { //根据当前组件模式更换manifest文件
manifest.srcFile 'src/main/module/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
}
}
}
defaultConfig {
if (!isComponentMode.toBoolean()) { //只有在集成模式下,这个模块才可以有applicationId
applicationId "com.example.module_login"
}
...
}
}
dependencies {
implementation project(":common") //依赖common功能组件,其他三方库通过common组件间接依赖
}
3.组建化过程中遇到的问题:
1.组件模式和集成模式切换:通过gradle.properties中添加共有属性,并在各个模块的gradle文件中判断当前组件模式;
2.业务组件manifest文件切换:写两个manifest文件,通过当前组件模式选择使用的manifest文件
3.避免多个业务组件重复依赖远程库:在common中统一添加所有依赖
4.组建之间通信:通过路由库,例如 ARouter
5.资源名冲突:每个业务组件的资源名都用组件特有的共同前缀
https://blog.csdn.net/u010897392/article/details/80449431