组件化

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值