目录
一、AAR包与JAR包的区别
二、AAR包、JAR包打包步骤
三、AAR打包需要注意的地方
欢迎评论留言,文章持续更新优化
一、AAR包与JAR包的区别
aar包含所有资源,class,xml布局文件以及res资源文件全部包含。注意是全部。
jar只包含了class文件与清单文件,不包含资源文件,如图片等所有res中的文件。
二、AAR包、JAR包打包步骤
1.首先新建一个library
File->New->New Module

选择Android Library

2.生成aar与jar
aar生成路径:build/outputs/aar/
jar包生成路径,不同AndroidStudio版本可能不一样:
- build/intermediates/bundles/release/
- build/intermediates/packaged-classes/release


3.把aar复制到想要复制的位置并重命名
//copy生成的原aar到指定路径并修改名称
task makeAar(type: Copy) {
//aar生成的路径,这里有可能有变化
System.println("makeAar")
from('/build/outputs/aar/')
into('release')
include('konkanlp-release.aar')
rename('konkanlp-release.aar', 'konkanlp-' + gitCurrentTag + '.aar')
}
makeAar.dependsOn(build)
//copy生成的原class.jar到指定路径并修改名称
task makeJar(type: Copy) {
//classes.jar生成的路径,这里有可能有变化
System.println("makeJar")
from('build/intermediates/packaged-classes/release/')
into('release')
include('classes.jar')
rename('classes.jar', 'konkanlp-' + gitCurrentTag + '.jar')
}
makeJar.dependsOn(build)
build.doLast {
makeAar
makeJar
}
gradle.projectsEvaluated {
assembleRelease.doLast {
//复制aar并重命名,下面是指定原aar生成的路径,原aar通过执行assembleRelease 任务或者build可生成
File aarDir = new File(project.buildDir, "/outputs/aar")
File[] aar = aarDir.listFiles()
if (aar.length > 0) {
for (File file : aar) {
if (file.name.endsWith("aar")) {
System.println("apk:" + file.name)
delete("$rootDir/app/libs")
copy {
from file
//直接复制到demo里面
into "$rootDir/app/libs"
rename(file.name, "konkanlp-release.aar")
}
copy {
from file
into "$rootDir/konkanlp/release"
rename(file.name, "konkanlp-" + gitCurrentTag + ".aar")
}
}
}
}
//复制jar并重命名
File jarDir = new File(project.buildDir, "/intermediates/packaged-classes/release")
File[] jar = jarDir.listFiles()
if (jar.length > 0) {
for (File file : jar) {
if (file.name.endsWith("jar")) {
System.println("apk:" + file.name)
copy {
from file
into "$rootDir/konkanlp/release"
rename(file.name, "konkanlp-" + gitCurrentTag + ".jar")
}
}
}
}
}
}
4.aar与jar引用
implementation project(':youaarlibrary')//既可以直接依赖开发
implementation (name: 'youaarlibrary-release', ext: 'aar')//也可以添加aar方式开发
implementation files('libs/jar包名称.jar')
三、AAR打包需要注意的地方
1、原有项目所依赖的jar包会被正常打包进aar中,但原项目依赖的aar则不会打包进aar
1.1以外部compile形式所依赖的包,也不会被打包进aar,就是aar内引用的第三方库
例:aar类库中包含远程依赖volley, 此时按照如上方法打包出的aar,在目标工程中是无法调用volley使用的
compile 'com.mcxiaoke.volley:library:1.0.19'
解决方法:
- 在应用aar的项目内去依赖aar本身需要依赖的库(写好aar的使用说明)
- https://blog.csdn.net/u011840744/article/details/50608677
1.2.记得不要重复引用,避免壳工程引用的jar与打包好的aar冲突,就是要必要引用jar包冲突
2、 声明具体支持的so库类型
暂未接触到,后续补充
3、需要做混淆(jar包的打包也要做混淆)
aar包也可以指定混淆方式,在提供给对方时,我们需要将代码混淆,在厂商发布时,也需要混淆,这样就存在二次混淆后,AAR包找不到相应类的问题。
解决方法可以让厂商在二次混淆时,keep住我们aar相关代码
混淆参考:
Android 混淆介绍
第三篇:AAR 混淆
androidStudio 打包与混淆
4、路径获取
留意相关路径的获取,在普通的Appliaction中,数据默认存储在 /data/data/packageName/中,当aar内嵌在其他应用中,存储路径跟随主工程, 在获取数据时路径切记不能写死
5、第三方登录
因为微信微博等三方登录需要使用PackageName申请APPID,APPKEY, 需要使用壳工程的packageName。
6、常见BUG
6.1主项目需要依赖AAR中所依赖的远程库,否则会出现ClassNotFound异常
这里也许某个依赖库你们的版本会发生冲突,这就需要你们协调了。
6.2 jar包引用重复
6.3 资源或布局找不到
资源和布局文件命名最好统统加上你的项目名字前缀,比如图片资源、string、color、dimens、layout等等,反正res目录下所有文件最好都使用统一的加前缀命名,防止跟宿主app下的资源重复,因为aar引用跟源码引用起到的效果一样一样的,所有很容易出现资源重复引用的问题,所以加上前缀非常有必要
拓展:成型的项目(有依赖)如何快速打包AAR
将原先module下的Application改为Library,正常调用assembleDebug 或 assembleRelease时就会在该module下的build/output目录下生成aar文件。
1.模块是library不是 application
//apply plugin: 'com.android.application'
apply plugin: 'com.android.library'
2.注释掉 applicationId
// applicationId "com.cmcc.iot.gatewaycloud"
3.manfiest文件修改,去掉applicationname属性和以下内容
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/ColorTranslucentTheme"
网友评论