Android已有应用生成aar 并集成到其他应用内部(本地AAR)

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 合并问题

    请参考文章: Android集成其他应用的sdk(aar)如何实现application合并

  • 如何使用module来二次封装aar,并提供demo,更方便的供其他应用调用。

  • 集成多个aar 时 包过大。

  • 主应用访问aar 怎么解决跨进程问题。

  • 如果子应用有多个模块该怎么处理,如果将多个模块依赖打成一个aar 包供其他应用调用

  • 如何管理aar的版本问题

上述问题可能都会在实际项目中遇到,具体问题也要具体分析。

总结

如果想使用此方式进行apk的集成,还是有些复杂的。尤其是子应用过大,或架构复杂时,可能会面临更加复杂的集成问题。如此来说,做好集成还是比较困难的。
上述问题我也会尽快探讨,并实战找出相应的解决方式,期待大家的关注。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

senda66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值