1、假设已经有了项目A打算将A项目生成aar
(1)在主app的build.gradle下 将 apply plugin: ‘com.android.application’ 修改为 apply plugin: ‘com.android.library’
(2)在主app的build.gradle下 将 defaultConfig {} 中的applicationId 去掉
如下图:
(3)处理插件应用中的AndroidMenifest.xml 文件。将启动activity去掉,其他activity 不用屏蔽,直接保留即可。这里必须屏蔽掉,因为应用加载aar时会自动合并AndroidMenifenst文件到主应用的清单文件中。否则就会在主应用的清单文件中出现两个启动activity。
按上述步骤修改完成后,重新rebuild 项目即可,之后会生成aar文件
路径如下:
需要注意的是我的demo中,添加了aar内部页面跳转,主要是为了测试一下aar是否和安装apk一样,能不能自行跳转,有没有完整的生命周期。
2、使用aar
新建一个demo主应用项目
(1)在app/libs 下放置刚刚的aar文件
(2)在app/build.gradle 下 android{} 节点中添加:
repositories {
flatDir {
dirs 'libs'
}
}
并引入依赖
implementation(name:'app-debug',ext:'arr')
build 后发现报错:
Build was configured to prefer settings repositories over project repositories but repository 'flatDir' was added by build file 'build.gradle'
上述方式在gradle7 版本以下是没问题的。如果是在gradle7+ 版本,需要如下解决方式:
dependencies {
implementation fileTree(include: ['*.jar','*.aar'], dir: 'libs')
implementation(name:'app-debug',ext:'arr')
}
或:
implementation fileTree("libs\\sdk_Login.aar") // 括号内是aar包相对路径
不需要写firDir。
(3)build 出现them 冲突问题。在application标签中添加:
(4)打包apk,分析apk 可发现aar中的AndroidMenifest 全部合并到了主应用的清单中。
启动apk测试出现问题:
- 主apk打开首页跳转到了aar的首页
- aar内部跳转页面后出现crash。
解决:分析apk发现:主应用中的布局文件和aar中的布局文件重名了,导致在打包成为apk后,aar的布局文件将主apk的布局文件给覆盖了。所以此时修改了一下主应用的布局文件名即可。
主应用的首页:
点击“点击”跳转到aar的首页:
主页面到aar页面跳转代码如下:其中 com.dic.firstandroidproject.MainActivity为aar的首页
public void go(View view) {
Intent intent = new Intent();
intent.setClassName(this,"com.dic.firstandroidproject.MainActivity");
startActivity(intent);
}
经过测试aar 内部跳转也没有问题。
下面贴出来实际apk的合并后的AndroidMenifest清单文件的内容,供大家参考:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0"
android:compileSdkVersion="32"
android:compileSdkVersionCodename="12"
package="com.hzs.plguin"
platformBuildVersionCode="32"
platformBuildVersionName="12">
<uses-sdk
android:minSdkVersion="21"
android:targetSdkVersion="32" />
<application
android:theme="@ref/0x7f0f01d3"
android:label="@ref/0x7f0e001b"
android:icon="@ref/0x7f0c0000"
android:debuggable="true"
android:testOnly="true"
android:allowBackup="true"
android:supportsRtl="true"
android:fullBackupContent="@ref/0x7f110000"
android:roundIcon="@ref/0x7f0c0001"
android:appComponentFactory="androidx.core.app.CoreComponentFactory"
android:dataExtractionRules="@ref/0x7f110001">
<activity
android:name="com.hzs.plguin.MainActivity"
android:exported="true">
<intent-filter>
<action
android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
// 以下是aar的
<activity
android:name="com.dic.firstandroidproject.DisplayMessageActivity"
android:parentActivityName="com.dic.firstandroidproject.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
</activity>
<activity
android:name="com.dic.firstandroidproject.SecondActivity"
android:parentActivityName="com.dic.firstandroidproject.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
</activity>
<activity
android:name="com.dic.firstandroidproject.MainActivity" />
</application>
</manifest>
至此,一个简单的demo就算结束了,但是经过我的猜想还会出现很多问题
-
资源冲突问题
-
加载第三方依赖问题
-
application 合并问题
-
如何使用module来二次封装aar,并提供demo,更方便的供其他应用调用。
-
集成多个aar 时 包过大。
-
主应用访问aar 怎么解决跨进程问题。
-
如果子应用有多个模块该怎么处理,如果将多个模块依赖打成一个aar 包供其他应用调用
-
如何管理aar的版本问题
上述问题可能都会在实际项目中遇到,具体问题也要具体分析。
总结
如果想使用此方式进行apk的集成,还是有些复杂的。尤其是子应用过大,或架构复杂时,可能会面临更加复杂的集成问题。如此来说,做好集成还是比较困难的。
上述问题我也会尽快探讨,并实战找出相应的解决方式,期待大家的关注。