前两篇文章都是插件化的理论知识,但是正在的运用在项目中,会遇到各种各样的问题,这样需要整个完成一个组件化开发的实例。
第一步:创建一个新项目PlugProject,等待项目构建完成
第二步:创建两个基础模块(baseResLib和baseUtilsLib),
1)baseResLib是放置项目使用的资源文件,例如图片和文字等。
2)baseUtilsLib是放置项目使用的公共类库
因为基础模块是没有界面的,所以不需要过多的设置,只要将其在gradle中设置成library即可。
apply plugin: 'com.android.library'其他业务模块使用该基础模块的方式:
compile project(':basereslib') compile project(':baseutilslib')
第三步:创建业务模块(carByBuyApp和carBySellApp)
1)carByBusApp 是买车业务模块
2)carBySellApp 是卖车业务模块
因为是业务模块,与基础模块不同,在debug模式下,业务模块是可以独立编译和运行的,在release模式下,它又变成一个library模块。这样我们就要在业务模块的gradle中进行动态的设置处理:
if(isDebug.toBoolean()){ apply plugin: 'com.android.application' }else{ apply plugin: 'com.android.library' }而其中的isDebug参数,是一个全局的变量。我们可以在gradle.propertes中手动设置:
#trueΪdebug falseΪrealse isDebug=false
所有的业务模块需要依赖基础模块的支持,我们需要在gradle中进行引入基础模块:
dependencies {
compile project(':basereslib')
compile project(':baseutilslib')
}
业务模块既然可以在debug模式下独立运行,说明是它在debug模式下是一个独立的apk,这样我们就需要对AndroidManifest.xml文件进行特殊处理
我们需要在main包下,新建两个包debug和release,来分别存放配置文件。
然后通过在gradle中设置属性来根据不同模式下,选择相应的配置文件
android {
sourceSets {
main {
if(isDebug.toBoolean()) {
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/release/AndroidManifest.xml'
java{
exclude 'debug/**'
}
}
}
}
}
release/AndroidManifes.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.malei.carbybuyapp" > <application> <activity android:name=".CarBuyActivity"> </activity> </application> </manifest>debug/AndroidMainifes.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.malei.carbybuyapp"> <application android:name=".MyApplication" android:allowBackup="true" android:label="@string/app_name" android:supportsRtl="true"> <activity android:name=".CarBuyActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>第四步:以上一个组件化架构就完成了,我们现在还要在不同的模块之间进行跳转,这个时候,我们就需要 Arouter插件了。
引入插件的方式:在业务组件中添加引入
android {
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName: project.getName()]
}
}
}
}
dependencies {
compile 'com.alibaba:arouter-api:1.2.1'
annotationProcessor 'com.alibaba:arouter-compiler:1.1.2'
compile project(':basereslib')
compile project(':baseutilslib')
}
然后对Aroutter进行初始化在Applicaton中
/** * @author by malei on 2018/3/9. */ public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); if(BuildConfig.DEBUG){ ARouter.openLog(); // 打印日志 ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险) } ARouter.init( this ); // 尽可能早,推荐在Application中初始化 } }在我们需要跳转的页面添加注解
@Route(path = "/com/main") public class CarBuyActivity extends Activity{然后就可以在其他业务模块的Activity中跳转到CarBuyActivity了。
ARouter.getInstance().build("/com/main").navigation();这样一个debug模式下的组件化就完成了
第五步:在realse模式下,运行组件化框架
想要在realse模式下运行,我们就要对项目进行签名
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.malei.plugproject"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true //必须写
}
signingConfigs {
debug {
keyAlias 'xxx'
keyPassword '666666'
storePassword '666666'
storeFile file('kes.jks')
}
release {
keyAlias 'xxx'
keyPassword '666666'
storePassword '666666'
storeFile file('kes.jks')
}
}
buildTypes {
release {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
minifyEnabled false
}
}
}
然后在依赖包中根据不同模式,也要进行处理
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
if (isDebug.toBoolean()) {
compile project(':basereslib')
compile project(':baseutilslib')
} else {
compile project(':carbybuyapp')
compile project(':carbysellapp')
}
}
完毕!!!!!!!!!