A. 排除aar/jar中冗余或者冲突包、类
引入aar的冲突无所不在,通过远程依赖maven的包可以通过 exclude 关键字搭配 mole 和 group 去除某个组,没办法去除具体的类。
那么如果是单独的aar包,想要排除aar下classes.jar包里的某个单独的包或者类怎么办?
需要接入的jar包已经带了腾讯X5核心,当前依赖的已经包含X5核心,冲突又该如何解决呢?
当前的gradle脚本(项键慧目链接: https://github.com/luohongxfb/ExcludeAar )可以解决。
如excludelib/libs/exampleAAR.aar,左边是未去除的包结构,右边是去除 com. 之后的:
如excludelib/libs/exampleJAR.jar:
(1)将需要排除的aar或者jar包放在excludelib/libs下。
(2)更改excludelib/build.gradle
(3)设置排除规则 如果您需要排除aar,那么请更改excludelib/excludeAar.gradle;如果您需要排除jar,那么请更改excludelib/excludeJar.gradle
(4)运行排橡颂除任务
排除后生成的aar在excludelib/build/excludeaar下,排除后生成的jar位于excludelib/build/excludejar。
然后就可以愉快的使用啦~
aar排除步骤:
1、获取到需要排除的原始AAR包
2、解压AAR包(zipTree配合Task Copy)
3、解压AAR包中的class.jar(zipTree配合Task Copy)
4、按照排除规则对解压的class.jar重新打包(Task Jar)
5、重新打包成AAR包(Task Zip)
jar排除步骤
1、获取到需要排除的原始jar包
2、解压jar包(zipTree配合Task Copy)
3、按照排除规则对解压的jar重新打包(Task Jar)
主要原理:zipTree配合Copy,实现解压。
Copy Task官方讲解: https://docs.gradle.org/current/dsl/org.gradle.api.tasks.Copy.html
ziptree源码主要解析:创建一个新的file tree包含原来zip的内容,可以配合Copy实现梁亮郑解压。
这个步骤就是把之前解压的classes.jar文件,按照排除规则用Task Jar重新打包成jar文件。
Task Jar官方讲解: https://docs.gradle.org/current/dsl/org.gradle.jvm.tasks.Jar.html
对classes.jar处理完成的aar重打包,主要用到Task Zip。
Task Zip官方讲解: https://docs.gradle.org/current/dsl/org.gradle.api.tasks.bundling.Zip.html
原文链接
感谢Siy: https://blog.csdn.net/_34012226/article/details/80104771
B. android studio 怎么打aar包
1.aar包是android studio下打包android工程中src、res、lib后生成的aar文件,aar包导入其他android studio 工程后,其他工程可以方便引用源码和资源文件
2.生成aar包步骤:
①.用android studio打开一个工程,然后新建一个Mole,新建Mole时候选择Android Library,后面按新建普通工程操作
3.其他androidstudio工程引用aar包
①.将aar包复制到lib目录下
②.配置build.gradle文件:
加入
repositories {
flatDir {
dirs 'libs'
}
compile(name:'camerascan-1.0', ext:'aar')
完整的配置文件:
详细教程详细教程
C. 打包成aar的工程有第三方jar包,生成aar后,里面的jar无法引用,怎么解决
首先说明我使用的android studio
版本是0.4.因为现在android studio的bug还不较多,所以你的版本能不能正常使用我就不敢说了。
如果你只是单纯的想使用actionbarsherlock的话,引用是十分简单的dependencies {
// compile fileTree(dir: 'libs', include: '*.aar')
compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
compile 'com.android.support:support-v4:18.0.+'
}
不过官方也出了一个兼容包,也非常的不错。so 没必要非得要使用actionbarsherlock。
然后重新编译一下项目就行了。(ps
引用第三方jar包,请看我的第一行注释,你只要新建一个libs的文件夹,然后把想要jar包复制到文件夹下,接着把注释那句复制到build文件中,修改一下(*.aar
-> *.jar)就可以了)。
但是我们要是使用本地的自定义的aar文件,请看我的实现过程,如果你有更好的请转告小弟共同进步
第一步 :生成aar文件
我的方法是通过maven-android-plugin来生成的,如果你使用过actionbarsherlock以前的版本的话,这个工具应该不陌生,如果你连maven
都不知道的话,建议好好学习一下maven,虽然现在gradle很火 ,但是我还是最喜欢maven。
关于具体生成步骤不久不详细说了,文章最后贴出几个网址供大家学习使用,放心我按顺序给你们,只要一步一步的来绝对能成功
1 把你的maven版本提升到3.1.1
2 去github上clone下来
maven-android-sdk-deployer 这个项目
3 通过maven-android-plugin生成一个android项目
mvn archetype:generate \
-DarchetypeArtifactId=android-quickstart \
-DarchetypeGroupId=de.akquinet.android.archetypes \
-DarchetypeVersion=1.0.11 \
-DgroupId=your.company \
-DartifactId=my-android-application
D. 将aar打包进so
前段时间有个项目,需要用c++开发我们自己的sdk,另外,我们的sdk又依赖于另一个aar包,当时想当然的以为生成so的时候会一起把aar打包进去,结果发现调用so的时候,aar里面的类根本找不到,说明aar 并没有一培锋困起打包进so
后来想了下,既然将aar打包进so没法实现,不如把我自己的so库,还有第三方的aar再重新打一次,最终打成aar包,这样就方便多了。步骤如下:
先在原来测试我们自己so库的测试工程上新建一个moudle:配念
下面将上图中的classes.jar还有lib下面的jar包拷贝到新建的mole下的libs目录,并将剩余的jni,AndroidManifest.xml等文件分别拷贝合并到对应的目录内
5.下面就是要把我们aar拆出来的零件以及我们自己的so库基橘重新打包成aar:
工程右侧,找到Gradle,点开后找到我们上面新建的mole,点击Tasks->build->assemble
等构建完成后,aar就生成了,生成目录在我们的moudle目录下面的:
build->outputs->aar下面
okay
E. 升级androidx 报错bug
1、在项目的 gradle.properties 文件中配置如下
2、引入
https://blog.csdn.net/qq_24382363/article/details/87285438
这时候会提示上述错误,宏罩含因为sdk采用了更加严格的aapt编译,正确的用法如下
如果字符串含有%,而不需要格式化可以有三种蔽笑方法解决
这个错误是引闷族用的两个包中的属性名称冲突导致
忽略已存在的框架
jar 包
aar
那 直接 去aar 中删除itemIconTint
解压aar文件到tmpDir目录下
修改后 将tmpDir重新打包成一个新的aar
https://www.jianshu.com/p/f0a267551493
F. Android:多aar打包
我使用的是网上这个 https://github.com/kezong/fat-aar-android
这个github库。
具体配置是再跟gradle中添加:
classpath 'com.kezong:fat-aar:1.2.7'
在需要打包的地方添加:
apply plugin: 'com.kezong.fat-aar'
然后添加需要合并的包,可以是远程包,本地aar,本地project。可以说很完整了。
例如:
怎么看远程依赖呢?下面这里就可以看
最后生成的aar包如下,jni和jar包都有了
反编译看看classes.jar看看,本地项目的类都在这里面了。
后面得看看是怎么打包起来的了,不然后续作者不维护了就蛋疼了。
G. 终极方案:快速解决Android项目依赖冲突
冲突类型无非是类、jar包重复,比如:
在此不多做介绍了,直接上解决方案
1、配置显示冲突依赖详细信息
2、编译,查看控制台详细输出
1、project依赖排除示例
2、远程依赖排除示例
参考链接:如何exclude aar包中的某个jar包
核心:
① 解压aar文件到tmpDir目录下
② 找到classes.jar包,用压缩工具打开,删除目标文件
③ 将tmpDir重新打包成一个新的aar
H. AndroidStudio 打包 Android项目 成 aar
· 打包 Android项目成 aar,有两种方式:
接下来分别列举说明
1.1 点击 File —> New —> New Mole... ,选择 “Android Library” , 最后点击 “Finish” 创建 mole Library。
1.2 编写需要打包成 aar 的库乱碧文件,例如:我测试写团态的 TestUtils 类
1.4 点击 assemble 之后编译完成,bulid->outputs->aar文件夹下会生成“正式”和“测试”aar包。
2.1 修改需要打包的mole项目下的 build.gradle 文件,然后点击 “Sync Now”同步下
2.2 修改需要打包的mole项目下的 AndroidManifest.xml 清单文件
2.4 点击 assemble 之后编译完成,bulid->outputs->aar文件夹下会生成“正式”和“测试”aar包塌陪源
I. 如何将android studio 打包aar
将 Mole 配置为 library 后,构建输出一个 aar 文件,根据渠道和 BuildType 的不同,在相应的目录下可以找到。比如对 BuildType 为 debug 的配置,输出为:[MoleName]/build/outputs/aar/[MoleName]-debug.aar。一份 aar 文件其实就是一份 zip 包,和 jar 不同橡祥的是,它将一些资源文件、第三方库文件、so 文件等等都打包在内,而代码文件编译后压缩在在 classes.jar 中。比如:
3、导入 aar 的方式引用
这种方式比较简单,打开 Project Structure,添加一个新 Mole,然后选择 Import *.JAR or *.AAR Package 的方式导入:
导入后,在你的工程下面,会生成一个文件夹,里面是 aar 文件以及 Android Studio 的配置文梁物搏件。
接着可以蚂衫在 gradle 中配置依赖了,其他 Mole 可以引用这个 Mole 了,依赖方式使用compile project 的方式即可。
缺点:被依赖的 aar 无法 F3 跟进去,无法看到资源文件内容以及目录层级等等缺陷。
4、使用配置依赖的方式引用
gradle 其实还有另一种依赖可以引用 aar:
compile(name: 'xxx', ext: 'aar')。
首先需要将 aar 文件放入引用 Mole 的 libs 目录下,和一般的 jar 文件类似。然后在 gradle 配置文件中把 libs 目录加入依赖:
repositories {
flatDir {
dirs 'libs'
}
}
接着在 gradle 的依赖配置中加入 compile(name: 'xxx', ext: 'aar') 这一句,依赖即可关联完毕。构建一下工程,在 Mole 的 build/intermediates/exploded-aar 目录下,可以看到有一些临时文件生成:
看起来完全是引用 aar 的解压版本。Android Studio 安装反编译插件后,可以通过 F3 跟进到 class 文件里面,如果你有被依赖 Mole 的源代码的话,还可以 Attach Source 关联源代码查看。另外,可以很方便的查看 aar 中的资源文件。
另外,这种依赖方式更新 aar 后,生成的临时文件也会随之变动,不用担心改动不同步的问题。
5、总结
综上,介绍了 aar 文件的生成方式,以及两种 aar 依赖的方式,经过实战检验,第二种通过配置 gradle 依赖的方式简单易用,只需一行代码即可搞定。