Android Studio中架包打包和依赖冲突解决

一、为什么使用aar打包,而不是jar
随着Android Studio的使用越来越广泛,使用aar打包这种方式也越来越可行实际。jar打包只打源代码,像资源文件不会打包,而aar恰恰是jar打包的补充完善,它会把代码和资源统统打包进一个文件。

二、资源命名问题
既然需要打包为sdk提供出来使用,那就要打包得有水准一点。别把常用的第三方的jar集成到aar里面,这样很容易会造成冲突的。

(1)aar中有依赖的架包

①依赖的第三方资源最好是使用jcenter远程仓库的依赖,如果远程仓库上没有;例如下载的类库,直接使用compile进行依赖。
compile 'com.dou361.download:jjdxm-download:1.0.1'复制代码

②自己上传一个到jcenter远程仓库上,学习下打包aar到jcenter也是很有必要的;例如经常用到的微信分享登录的架包libammsdk.jar,打包到jcenter上,以后项目中需要用到就添加以下代码即可:
compile 'com.dou361.winchat:jjdxm-winchat:1.0.0'复制代码

③当然了,如果你实在是嫌麻烦那就直接打包到aar上,如果APP中引用别的aar和你的aar有相同的架包那就悲剧了,不过还是有解决的办法,后面会有相关的处理办法。

(2)资源命名
资源命名最好通通加上你的项目名字前缀,比如图片资源、string、color、dimens、layout等等,反正res目录下所有文件最好都使用统一的加前缀命名,防止跟宿主app下的资源重复,因为aar引用跟源码引用起到的效果一样一样的,所有很容易出现资源重复引用的问题,因此加上前缀非常有必要。可以有效避免架包内部部分内容冲突的尴尬情况。

三、jar第三方库重复引用问题
同一个项目下多次引用同一个第三方jar库会出现重复引用的编译问题,所以只要保证引用一次就ok了,但是如果你的库引用的第三方库比较多时,就会碰到很尴尬的问题。
比如你的aar库引用了一个第三方库,这个库是本地库,宿主app中也引用了这个第三方库,这时你把你的aar库所引用的那个第三方库引用方式设置成provide,provide的意思是不打包进去,这样没问题,但是你想过一个问题没,如果别人使用你的aar,他不知道你的aar库需要包含那个第三方库,如果他在自己的宿主app中没有引用进来那个库,好吧,这会导致运行时崩溃,崩溃的日志提示找不到一些类定义,总不能给别人提供aar库还要额外提供一堆第三库,然后告诉他把这些库添加进主工程里,这种方式可行,但是很不友好。

以下是第三方库重复引用冲突解决方法:
1.本地libs目录中的jar和远程仓库中compile的jar冲突。
解决办法优先删除libs目录中的jar保留compile的引用,也可以删除compile引用保留本地libs目录的。

2.本地libs目录中两个jar,远程仓库compile两个jar或者本地libs目录和远程仓库compile之间的同一jar不同版本冲突。
解决办法优先删除低版本的保留高版本的,其次是优先删除本地libs的保留compile的。这个要根据APP的情况而定,保留高版本的jar可能会引起原来其他地方引用低版本方法变迁或者路径变更出问题,在两者间择优,同步升级其他相关jar的版本,或者同步降级其他相关jar的版本。

3.引用jar和jar、aar和jar或者aar和aar的冲突。
解决办法优先删除jar的引用,保留aar的,如果两个都是aar或者两个都是jar怎么办?当然也是可以删除aar或者jar内部中冲突的

(1)aar中冲突的部分是集成到aar中的,这种情况是比较多,如果是远程仓库的需要下载下来,改为本地引用,有人可能不会下载,其实原来你使用远程仓库引用同步以后已经是下载好在本地的了,这里举一个案例:

compile 'com.dou361.update:jjdxm-update:1.0.3' 复制代码windows系统 C:\Users\你的计算机用户名.gradle\caches\modules-2\files-2.1目录下找到compile的groupId com.dou361.update文件,完整的目录:
C:\Users\Admin.gradle\caches\modules-2\files-2.1\com.dou361.update\jjdxm-update\1.0.3\fb8f27de2ce0371476023b1dcf4a6096d19e5810\jjdxm-update-1.0.3.aar复制代码 复制出来用即可,本地的libs中的aar,其实就是一个压缩包,用解压工具打开把冲突的部分删除即可;引用如下:

repositories {
flatDir {
dirs 'libs'
}
}

compile (name:'jjdxm-update',ext:'aar')复制代码

(2)jar中冲突的部分是jar内部部分内容,和第(1)的处理方法类似,这里要是没有说可能会想不到,jar包其实也是一个压缩包,因此内部的冲突的内容是可以通过解压工具打开去删除的。

(3)如果冲突的jar是采用远程依赖方式引用,那就可以直接使用代码去屏蔽冲突的部分

例如:
compile ('com.dou361.update:jjdxm-update:1.0.3'){
exclude group: 'com.dou361.download',module:'jjdxm-download'
}
复制代码

(4)比较极端的情况,部分类文件目录名称重复,但是两边的方法功能不一样,通过解压工具删除两边重复的内容,然后新建一个目录相同名称相同的类到自己的主应用程序中,把两边的功能都实现在新建的这个类中。

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

推荐阅读更多精彩内容