• 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'
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    并引入依赖

    implementation(name:'app-debug',ext:'arr')
    
    • 1

    build 后发现报错:

    Build was configured to prefer settings repositories over project repositories but repository 'flatDir' was added by build file 'build.gradle'
    
    • 1

    上述方式在gradle7 版本以下是没问题的。如果是在gradle7+ 版本,需要如下解决方式:

    dependencies {
        implementation fileTree(include: ['*.jar','*.aar'], dir: 'libs')
        implementation(name:'app-debug',ext:'arr')
    }
    
    • 1
    • 2
    • 3
    • 4

    或:

    implementation fileTree("libs\\sdk_Login.aar")   // 括号内是aar包相对路径
    
    • 1

    不需要写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);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    经过测试aar 内部跳转也没有问题。

    下面贴出来实际apk的合并后的AndroidMenifest清单文件的内容,供大家参考:

    
    <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>
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    至此,一个简单的demo就算结束了,但是经过我的猜想还会出现很多问题

    • 资源冲突问题

    • 加载第三方依赖问题

    • application 合并问题

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

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

    • 集成多个aar 时 包过大。

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

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

    • 如何管理aar的版本问题

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

    总结

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

  • 相关阅读:
    2022年大一学生实训作业【基于HTML+CSS制作中华传统文化传统美德网站 (6页面)】
    前后端分离架构的特点分别是什么?
    Java项目:JSP手机商城管理系统包含前台
    前端面试题目(二十八)
    【Vue】组件化编程
    全志V3S开发板星光闪烁(linux LED驱动)
    weak的实现原理
    【MySQL 安装】基本操作命令
    Python 字符串格式化方法记录
    【Python】保姆级万字讲解:Python中的 pip 和 conda 的理解
  • 原文地址:https://blog.csdn.net/superzhang6666/article/details/126529475