前两篇文章都是插件化的理论知识,但是正在的运用在项目中,会遇到各种各样的问题,这样需要整个完成一个组件化开发的实例。
第一步:创建一个新项目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') } }
完毕!!!!!!!!!