Android Studio上创建带Activity的arr包并集成到其它项目

(;´д`)ゞ啊,荒废好久了,果然不写下来很多东西都忘了...

       关于 aar 包的编译网上资料少就不说了,更不用说带 Activity 的 aar 包,当初因客户需要直接集成我方app到他的项目中,为了弄这个可是掉了不少头发的。言归正传,开始正文了。

 

一、关于.jar以及.aar文件的概述。

 1. *.jar,JAR 包的全称是 Java Archive File,意思就是 Java 档案文件。*.jar 文件只包含了 class 文件与清单文件,不包含资源文件,如图片等所有res中的文件。找一个 JAR 文件,然后修改后缀名为 ‘zip’ 或者 ‘rar’ 格式后解压,打开解压后的文件夹:

jar包

ps:像 ‘org’ 或 ‘com’ 之类的文件夹中都为项目 .class 文件。

 

2. *.aar,AAR 包的全称是 Android Archive,是一个 Android 库项目的二进制归档文件。 *.aar 文件中包含所有资源,class 以及 res 资源文件。我们随便找一个 aar 文件,然后修改后缀名为 ‘zip’ 或者 ‘rar’ 格式后解压,打开解压后的文件夹:(每个 aar 解压后的内容可能不完全一样,但是都会包含 AndroidManifest.xml,classes.jar,res,R.txt)

 

二、生成AAR包。

       jar 文件的生成这里就不赘述了,网上打包资料基本都有,这里主要讲解如何打带 Activity 的 aar 包。

1. 生成 aar 文件。

在 Android Studio 中,在某一个 Module 的 Gradle 脚本开头声明

apply plugin: 'com.android.library' 

然后编译该 Module,编译完成之后aar包会出现在 Module 的 build->outputs->aar->xxx.aar 。

到这里都没问题,aar 包相较 jar 包也就是多出资源文件,其实现在大部分人也就是用用 jar 包够了。但是,当碰到特殊需求,比如要将一个完整的项目集成到另一个项目中,这时候 aar 包就很有必要了。

 

2. 生成带Activity的aar文件。

作为一个完整的项目 A,其肯定是有包括 Activity 在内的所有东东的,这样想直接打成 arr 包是不可能了。

首先,我们要在 Gradle 中修改

apply plugin: 'com.android.application'

改成

//apply plugin: 'com.android.library'

然后去掉 applicationId,当然manifest中主Activity的 <intent-filter> 标签需要注释掉。

这当然是打包的前提,但这时候还会有一些错误,比如switch就不能用了,R.id 会报错,同理像注入框架 ButterKnife 等也用不了,等等..

之前碰到这个我还以为所有R都不能用了,花了大力气全改掉结果发现不用!!!

*同时要注意项目 A 和项目 B 的资源文件需要不同名,否则会出错。(如 activity_main.xml 之类,到时候会默认使用项目 B 中的资源)

 

三、使用 AAR 包直接集成项目。

1. 使用 aar 包。

在项目 B 中将 aar 包放入 Module 下 libs 文件夹中,

项目 Gradle 中 allprojects {} 下添加

flatDir {
    dirs 'libs'
}

Module 的 Gradle 中 dependencies{} 下添加

compile(name: 'app-release', ext: 'aar')

 

2. 集成到项目B。

接下来要在 manifest 中声明需要用到的项目 A 中的Activity,注意用完整的 包名+Activity

同时,为避免误调用,需在 application 标签下添加 replace 属性 

tools:replace="android:icon,android:name,android:label,android:theme,android:allowBackup"

(若 application 标签无 name 属性则去除 android:name ,以此类推)

 

3. 在项目 B 中使用项目 A 的 Activity(前提是此 Activity 前一步中已声明)。

Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
// packetname 为调用方的 packetname,因为 aar 最终会被合并到调用方的 manifest 文件
intent.setComponent(new ComponentName("xxx.xxx.xxx.xxx", // packagename
         "xxx.xxx.MainActivity")); // classname
// startActivity(intent);
int requestCode = 0;
startActivityForResult(intent, requestCode);

除去两个包名外,与普通 Intent 使用相同。

另外,Android Studio 对 aar 包的支持还存在许多 BUG,其中最大的就是在替换 aar 包时,External Libraries 中无法更新甚至出现对应 library 直接消失的情况,而这个时候什么 make 啊 clean 啊都然并卵。需要用一下的方法:

首先找到 Gradle -> Module -> Tasks -> build 下的 cleanBuildCache,点击会清除 External Libraries。

然后注释掉 aar 包的引用,即 compile(name: 'app-release', ext: 'aar'),同步后打开注释再同步一次。

这时候编译运行应该就没有问题了,当然可能还看得到很多飘红,甚至都找不到 aar 对应的 library,对这就是歧视,当然 reBuild一下应该就会消失了而且也不影响。

写到这里就结束了,其实都不知道写了什么,而且写着写着才发现当初弄了那么久的最难最麻烦的部分居然没!有!必!要!狗带。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值