Android app组件化示例
- 创建一个空项目
在gradle.properties里添加下面变量
#是否把模块设置成library IsBuildMudle = true 为是 false 为否
IsBuildMudle=true
- 在app模块的build.gradle,修改如下
plugins {
id 'com.android.application' //作为启动的主程序模块
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.dlrj.test.modulemodeapp" //主启动模块需保留
minSdkVersion 16
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
//检查项目依赖的全部module包括module依赖的module(没有页面的module也算),在每个module的 build.gradle中加上下面的代码。
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName :project.getName() ]
} }
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
//添加模块
implementation project(':game')
implementation project(':sports')
implementation project(':health')
//添加alibaba:arouter模块
compile'com.alibaba:arouter-api:1.3.1'
annotationProcessor'com.alibaba:arouter-compiler:1.1.4'
}
- 在app模块,新创建一个类,继承Application,如下
package com.dlrj.test.modulemodeapp;
import android.app.Application;
import com.alibaba.android.arouter.launcher.ARouter;
public class MyApplication extends Application {
private boolean isDebugARouter = true; //是否是debug模式下的路由信息
@Override
public void onCreate() {
super.onCreate();
if (isDebugARouter) {
ARouter.openLog(); //打开日志
ARouter.openDebug(); //打开debug
}
ARouter.init(MyApplication.this); //路由初始化
}
}
- 在app模块下,修改MainActivity,如下
@Route(path="/app/MainActivity") //设置路由路径
public class MainActivity extends Activity
路由到其他模块的activity,使用方法如下
ARouter.getInstance().build("/game/GameMainActivity").navigation();
- 创建一个子模块
如果是复制其他项目的模块进来的,请在settings.gradle里面添加对应的模块名
include ':xxx'
include ':app'
rootProject.name = "ModuleModeApp"
xxx即为对应的模块名 hotspot
- 在app模块的build.gradle 里面,把新创建的模块,加到dependencies,代码如下
dependencies {
//添加模块
implementation project(':game')
implementation project(':sports')
implementation project(':health')
implementation project(':hotspot') //添加新的模块
//添加alibaba:arouter模块
compile'com.alibaba:arouter-api:1.3.1'
annotationProcessor'com.alibaba:arouter-compiler:1.1.4'
}
- 打开新创建的module模块hotspot build.gradle,修改后如下
if (IsBuildMudle.toBoolean()) { //如果需要编译模块,则该模块需要设置成library
apply plugin: 'com.android.library'
} else {
apply plugin: 'com.android.application'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
//做为module这里不需要配置applicationId
minSdkVersion 16
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName :project.getName() ]
} }
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
sourceSets {
main {
if (IsBuildMudle.toBoolean()) {
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
java.srcDirs += "src/main/debug/java/";
} else {
manifest.srcFile 'src/main/release/AndroidManifest.xml'
java.srcDirs += "src/main/release/java/";
}
}
}
resourcePrefix "module4_"
}
dependencies {
//添加alibaba:arouter路由模块
compile'com.alibaba:arouter-api:1.3.1'
annotationProcessor'com.alibaba:arouter-compiler:1.1.4'
}
- 在新建的hotspot模块E:\AndroidStudioProjects\ModuleModeApp\hotspot\src\main目录下添加debug,release文件夹
把当前目录下的java文件下目录及目录下所有子目录与文件与Androidmanifest.xml,复制到debug和release文件夹下
- 复制app模块的MyApplication,到新模块hotspot的debug,release目录E:\AndroidStudioProjects\ModuleModeApp\hotspot\src\main\debug\java\com\dlrj\test\hotspot的
改名为HotspotApplication
- 新模块hotspot的release 目录下的E:\AndroidStudioProjects\ModuleModeApp\hotspot\src\main\release
在applicaion节点上添加android:name=".HotspotApplication"
ARouter路由 there's no route matched解决方法
在app模块的build.gradle dependencies 添加 implementation project(':xxx'),xxx即缺失的模块名字
ARouter::Compiler >>> No module name, for more information, look at gradle log.解决办法
在每个模块的build.gradle android defaultConfig 加上 javaCompileOptions 里面的语句
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [ AROUTER_MODULE_NAME : project.getName() ]
}
}
}
Manifest merger failed : Attribute application@name value=(com.dlrj.test.modulemodeapp.MyApplication) from AndroidManifest.xml:11:9-38
is also present at [:hotspot] AndroidManifest.xml:12:9-64 value=(com.dlrj.test.hotspot.HotspotApplication).
Suggestion: add 'tools:replace="android:name"' to <application> element at AndroidManifest.xml:5:5-19:19 to override.
解决办法
按照第10点处理,debug下的AndroidManifest.xml不需要添加android:name=".HotspotApplication"