jar、aar、sdk打包以及app module生成 Library Module

jar、aar、sdk打包以及app module生成 Library Module

jar包只包含 class文件和manifest清单文件

aar一定包含/classes.jar、/AndroidManifest.xml /R.txt 和资源文件(/res)
也可以包含 /libs/.jar /assets /proguard.txt /jni/< abi>/.so
aar生成目录:build/outputs/aar/*.aar

aar的代码可能被混淆过了,可以通过mapping.txt文件进行查找
其中列出了经过混淆处理的类、方法和字段名称与原始名称的映射关系。此映射文件还包含用于将行号映射回原始源文件行号的信息 在<module- name>/build/outputs/mapping/release 目录下
而通过usage.txt文件可以查看被resourceShrink被remove掉的文件

将.so加入到aar中
在aar的library module中添加目录src/main/jniLibs/<abi>将so放到该目录下即可


module打包成jar:
1 将要打成jar包的 module 设置为 android-library模式

2 在主module中 用api project(’:要打成jar包的 module’)

3 你编译完工程后 所有java文件会在build/bundle/release或者debug目录下会生成classes.jar包

4 在 要打成jar包的 module 的 build.gradle中加入 将classes.jar 导出到library的build/libs/下,并修改名字为mysdk.jar(自定义名字)

//Copy类型
task makeJar(type: Copy) {
    //删除存在的
    delete 'build/libs/mysdk.jar'
    //设置拷贝的文件
    from('build/intermediates/bundles/release/')
    //打进jar包后的文件目录
    into('build/libs/')
    //将classes.jar放入build/libs/目录下
    //include ,exclude参数来设置过滤
    //(我们只关心classes.jar这个文件)
    include('classes.jar')
    //重命名
    rename ('classes.jar', 'mysdk.jar')
}

makeJar.dependsOn(build)

可能会遇到:

com.android.dex.DexException: Multiple dex files define

因此可以在上方的gradle中 过滤掉一些类

task makeJar(type: Jar) {
    from file('build/intermediates/classes/release')
    archiveName = 'sdk.jar'
    destinationDir = file('build/libs')
    //过滤不需要的class
    exclude "**/**/BuildConfig.class"
    exclude "**/**/BuildConfig\$*.class"
    exclude "**/R.class"
    exclude "**/R\$*.class"

    //指定打包的class
    include "com/test/**/*.class"
}

java文件打包为jar

task makeJar(type: Jar) {
    baseName 'test_interface'
    from('src/main/java')

}
makeJar.dependsOn(build)

只对TestInterface.java文件打包为jar (带上包名路径)
点击as右侧的gradle 相应的module下 的Tasks 中的 others 看到 makeJar 双击运行
即可在 build/libs下 查看生成的test_interface.jar包

引入jar包
1 将 jar包放入module的libs里
2

compile fileTree(dir: 'libs', include: ['*.jar'])

app module生成 Library Module

library module和app module的区别是:
apply plugin: 'com.android.library'apply plugin: 'com.android.application'

1 直接创建 module的时候选择library

2 或者将现有app module转换成 library module
因此直接将 apply plugin: 'com.android.application’改成 apply plugin: ‘com.android.library’ 即可

当然 最好将 module 名字改成 XXlib
然后包名 目录结构改改 也改改 再改成 lib

1 project的 settings.gradle 引入 include ‘:xxx’ 即可
要使用该 library 则 api project(':XXXLib')/implements 'xxxlib即可

2 删掉library build.gradle的 applicationId
applicationId 是指定进程名
packageName 是用于四大组件等的包名
默认applicationId 为 packageName

3 app module层的 manifest的配置可以直接设置一个空壳
但是若提供sdk能力 application标签得修改
将android.intent.category.LAUNCHER、MAIN标签去掉 上层加
不需要改manifest和application 会进行merge操作到上层app module里 若要自定义一些merge操作 则可以通过tools:node定义

对于资源 若只有单独一份 则直接打包到apk 但是若多个位置(src/main buildType aar)具有相同类型(drawable layout)和限定符(hdpi en) merge的优先级为:

1 build variant (Build Variant 即build type与product flavor的排列组合)>
2 build type 构建类型 如release debug >
3 product flavor 如可以分不同的上架的应用商城 分不同的资源 分不同的target API 各种产品的自定义特征 >
4 main source set > 
如:
src/main/
src/<buildType>/
src/<productFlavor>/
src/<productFlavorBuildType>/
5 library dependencies

library被其它module使用时 将默认使用release构建类型
也可以在library中配置由宿主控制:
android {
publishNonDefault true
}
宿主:api project(path:’:library’, configuration:‘demoDebug’)

而对于 manifest 也是会merge操作
优先级也是和上面的一样
对于aar中的manifest文件会先进行合并至主资源集中的manifest文件中,然后主资源集的再合并至构建变体的manifest文件中,而这个构建变体的manifest为最终的manifest文件,将打包至apk中

注意:
对于< manifest>标签中的内容 不进行合并 而是直接使用高优先级的

对于没冲突则直接merge 有属性值冲突的会打tag提示

对于 < intent-filter> 则直接merge所有

可以在相应标签中使用tools:node 进行合并策略的自定义

查看合并后的Manifest
Merged Manifest工具 选择最高优先级的清单文件进行查看

4 各种res文件也可以放在library层

5 application.java也可以直接用library的 上层则不设置
但是若提供sdk能力
application.java代码得封装好接口 上层的application.java直接调用一个接口即可实现相关初始化操作

6 build.sh 或者其他配置文件是否有一些路径需要修改


module打包成打包aar:
1 将要打成aar包的 module 设置为 android-library模式

2 在主module中 用

    api project(':moduleName')

3 编译工程完 会在主module的build/output/aar目录下 生成.aar包
对于AndroidStudio3.0以上 不会得到aar目录 而是去选中你要build的module 然后点击make module xx 在build/output/aar中可以得到 若要得到release包 则在Build->select Build variant 将这个module以及它依赖的module设置为release版本

注意:通过以上方式进行的aar打包或通过脚本进行的build 本地打的只能是每个module的aar aar中不包括他引用的module的内容
只能通过上marven库

aar的引用:
4 将aar文件拷贝到app/libs目录下
在 module的 build.gradle中加入

repositories {
    flatDir {
        dirs 'libs', '../模块名/libs'
    }
}

最后

api(name:'aar名字', ext:'aar')

**这里的aar名字 不能带 aar后缀 **

注意:
1 aar中不能使用原始资源文件(/assets目录下) 只能放在应用层中
2 应用模块的 minSdkVersion 必须大于或等于aar中定义的minSdkVersion版本
3 aar 的混淆 参考: https://blog.csdn.net/weixin_37577039/article/details/79680754
4 android studio 打的aar包 不会将so库 和 第三方库给打进去
可以上传到marven库使用
aar上传到marven库后,会生成 一个 .pom 文件,记录 library Module 的依赖。当 Gradle 依赖 Maven 上的这个库时,会通过 pom 文件下载对应依赖

问题:
1 有时 aar上面有个?号 aar中的文件还是用不了
则删掉 再导入一次 然后点击 sync project 按钮


常见修改:
一、一个lib中设置 Activity 上层不同的app module设置不同的 资源 如图片 string color等

自定义ids.xml 去找资源
可以 在 lib中的value 设置 id
然后 app module层 设置资源

R.drawable.xxx 会通过 id 与具体的资源相连

二、 上层app module 定不同的值 而底层根据这个值去设置
用继承的思想
上层继承lib层 去override 这些属性 以及 override一些轻量级的方法


app module可以完全是一个空壳的
app module进行mainfest配置 lib中进行activity配置 lib中设置application

也可以上层 application 进行初始化 传入一些配置信息给底层
然后Activity还是底层 只是 图片 颜色等资源是上层
但是若涉及到 布局的变化较大 则最好还是把Activity抽上去


常见问题:
1 Resource IDs cannot be used in a switch statement in Android library modules. Constant expression required.
将switch换成 if else

2 new module失败,new出来的module并没有加入当前project 右上角的运行那里也带错误
1 之前删除的同名module 没清干净,或者as中有缓存 清一清缓存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值