android 多model打包成arr文件

github: https://github.com/kezong/fat-aar-android/blob/master/README_CN.md#fat-aar-androidv

以下只是记录,请到GitHub查看文档

fat-aar-android

该插件提供了将library以及它依赖的library一起打包成一个完整aar的解决方案,支持AGP 3.0及以上。(目前测试的版本范围是AGP 3.0 - 4.2.0,Gradle 4.9 - 6.8)

如何使用

第一步: Apply classpath

添加以下代码到你工程根目录下的build.gradle文件中:

JCenter于2021.5.1不再提供服务, 如果你使用了JCenter中的版本,建议更改一下包名切换至Maven central, 比如: 'com.kezong:fat-aar:x.x.x' => 'com.github.kezong:fat-aar:x.x.x'

For Maven Central (The lastest release is available on Maven Central):


buildscript {    

repositories

 {        

    mavenCentral()    

}    

dependencies {        

classpath'com.github.kezong:fat-aar:1.3.6'}}

For JCenter (Deprecated, before 1.3.4):

buildscript {    

    repositories {        jcenter()    }    dependencies {        classpath'com.kezong:fat-aar:1.3.3'}}


第二步: Add plugin

添加以下代码到你的主library的build.gradle中:

applyplugin:'com.kezong.fat-aar'

第三步: Embed dependencies

embed你所需要的工程, 用法类似implementation

代码所示:

dependencies {    implementation fileTree(dir:'libs',include:'*.jar')//java dependencyembed project(path:':lib-java',configuration:'default')//aar dependencyembed project(path:':lib-aar',configuration:'default')//aar dependencyembed project(path:':lib-aar2',configuration:'default')//local full aar dependency, just build in flavor1flavor1Embed project(path:':lib-aar-local',configuration:'default')//local full aar dependency, just build in debugdebugEmbed(name:'lib-aar-local2',ext:'aar')//remote jar dependencyembed'com.google.guava:guava:20.0'//remote aar dependencyembed'com.facebook.fresco:fresco:1.12.0'//don't want to embed inimplementation('androidx.appcompat:appcompat:1.2.0')}

第四步: 执行assemble命令

在你的工程目录下执行assemble指令,其中lib-main为你主library的工程名称,你可以根据不同的flavor以及不同的buildType来决定执行具体的assemble指令

#assemble all./gradlew :lib-main:assemble#assemble debug./gradlew :lib-main:assembleDebug#assemble flavor./gradlew :lib-main:assembleFlavor1Debug

最终合并产物会覆盖原有aar,同时路径会打印在log信息中.

多级依赖

本地依赖

如果你想将本地所有相关的依赖项全部包含在最终产物中,你需要在你主library中对所有依赖都加上embed关键字

比如,mainLib依赖lib1,lib1依赖lib2,如果你想将所有依赖都打入最终产物,你必须在mainLib的build.gradle中对lib1以及lib2都加上embed关键字

远程依赖

如果你想将所有远程依赖在pom中声明的依赖项同时打入在最终产物里的话,你需要在build.gradle中将transitive值改为true,例如:

fataar {/**    * If transitive is true, local jar module and remote library's dependencies will be embed.    * If transitive is false, just embed first level dependency    * Local aar project does not support transitive, always embed first level    * Default value is false*@since1.3.0*/transitive=true}

如果你将transitive的值改成了true,并且想忽略pom文件中的某一个依赖项,你可以添加exclude关键字,例如:

embed('com.facebook.fresco:fresco:1.11.0') {//exclude any group or moduleexclude(group:'com.facebook.soloader',module:'soloader')//exclude all dependenciestransitive=false}

更多使用方式可参考 example.

关于 AAR 文件

AAR是Android提供的一种官方文件形式; 该文件本身是一个Zip文件,并且包含Android里所有的元素; 可以参考 aar文件详解.

支持功能列表:

 支持flavor配置

 AndroidManifest合并

 Classes合并

 Jar合并

 Res合并

 Assets合并

 Jni合并

 R.txt合并

 R.class合并

 DataBinding合并

 Proguard合并

 Kotlin module合并

Gradle版本支持

VersionGradle PluginGradle

1.0.13.1.0 - 3.2.14.4 - 6.0

1.1.63.1.0 - 3.4.14.4 - 6.0

1.1.103.0.0 - 3.4.14.1 - 6.0

1.2.63.0.0 - 3.5.04.1 - 6.0

1.2.83.0.0 - 3.5.94.1 - 6.8

1.2.11 - 1.2.143.0.0 - 3.6.94.1 - 6.8

1.2.15 - 1.2.163.0.0 - 4.0.24.1 - 6.8

1.2.173.0.0 - 4.0.24.9 - 6.8

1.2.18+3.0.0 - 4.1.04.9 - 6.8

1.3.+3.0.0 - 4.1.04.9 - 6.8

1.3.43.0.0 - 4.1.04.9+

Gradle Plugin和所需求的Gradle版本官方文档

更新日志

1.3.6

支持AGP 4.2.0 #290 #304

处理'navigation'资源. #296

1.3.5

修复在仅有jar工程时jar无法合并的问题. #255 #288

修复在使用Gradle 6.0-6.8时的编译错误. #277

1.3.4

支持Gradle 6.8 #274

1.3.3

修复异常"Can not find task bundleDebugAar". #84

修复当工程解析失败时产生的异常.

当AndroidManifest合并时抛出异常.

1.3.1

R.class合并采用Transform,解决大部分R class找不到的问题.

支持consumerProguardFiles合并

支持kotlin_module合并,支持top-level机制

支持flavor中missingDimensionStrategy

修复依赖的flavor产物更名后无法找到的问题

修复AGP 3.0 - 3.1 Jar包无法合并的问题

修复某些情况下AGP版本获取不到的问题

1.2.20

修复获取产物名时的空指针异常. #214

r-classes.jar重命名,加上包名作为前缀.

1.2.19

支持embed没有class.jar的aar #157

支持embed没有AndroidManifest.xml的aar #206

修复上传至maven时,R.class未包含进aar的BUG #200

1.2.18

适配gradle plugin 4.1.0 #201

1.2.17

支持databinding合并 #25 #67 #142

Use Gradle's configuration avoidance APIs #195

Support incremental build #199 #185

Fix wrong directory for aar's jar libs #154

1.2.16

修复gradle plugin版本不在根目录下就找不到的问题 #172

修复在gradle plugin 4.0构建的产物中有可能styleable资源找不到的问题 #163

1.2.15

支持gradle plugin 4.0.0 #147

修复在Android Studio 4.0.0上embed的库无法直接索引源码的问题 #148

修复lint编译错误 #152

1.2.12

添加对buildType以及flavor的支持,例如debugEmbed以及flavorEmbed. #135 #137

修复一些编译时的warning.

1.2.11

修复在gradle plugin 3.6.0下编译variants会error的情况 #126

修复在gradle plugin 3.6.0下编译出来的aar,在编译apk时会出现资源符号对象找不到的问题

1.2.9

适配gradle plugin 3.6.1 #120

1.2.8

适配gradle6.0+版本 #97

1.2.7

修复在3.5.0中androidmafest合并报错的问题 #62 #65

1.2.6

适配gradle plugin 3.5.0 #53#58

1.2.5

修复任务名称重复导致编译错误的问题 #48

如果开启minifyEnabled,所有的jar包将合入classes.jar文件

1.2.4

修复在windows平台上,jni和asset无法打入aar的bug #11 #37

1.2.3

修复未直接依赖的R类找不到的问题 #11 #35

不再需要为需要embed的依赖项主动添加compileOnly

embed的transitive默认值设置成false

1.1.11

修复gradle plugin version有可能判断错误的问题 #28

修复LibraryManifestMerger.java中出现的build warning #29

优化resource、assets、jni等的合并规则,不再合并至"main",而是合并至"variant" #27

修复重复build造成release包下jni丢失的问题 #27

1.1.10

修复使用gradle plugin 3.0.1时的jar合并错误 #24

修复无法正常rebuild(同时使用clean assemble)的问题 #24

1.1.8

弃用旧接口,处理编译时输出的warning #10

将AndroidManifest的合并规则由Application改为Library #21 #23

1.1.7

修复直接publish至maven时,aar的R文件未合并的问题 #7

1.1.6

适配gradle plugin 3.3.0+ #4 #9

适配gadle 4.10.0+ #8

支持子module的flavor编译

修复子module的class文件编译不实时更新的问题

1.0.3

修复assets未合并的问题

1.0.1

支持gradle plugin 3.1.0 - 3.2.1

支持资源合并,R文件合并

常见问题

Application无法直接依赖embed工程: application无法直接依赖你的embed工程,必须依赖你embed工程所编译生成的aar文件

为了调试方便,你可以在选择在打包aar时,在主library工程中使用embed,需要直接运行app时,采用implementation或者api

资源冲突: 如果library和module中含有同名的资源(比如 string/app_name),编译将会报duplication resources的相关错误,有两种方法可以解决这个问题:

考虑将library以及module中的资源都加一个前缀来避免资源冲突;

在gradle.properties中添加android.disableResourceValidation=true可以忽略资源冲突的编译错误,程序会采用第一个找到的同名资源作为实际资源.

关于混淆

如果minifyEnabled设置为true,编译时会根据proguard规则过滤工程中没有引用到的类,导致App集成时找不到对象,因为大多数AAR都是提供接口的SDK,建议大家仔细梳理proguard文件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容