查看依赖库和隐含依赖导致的问题

Android Studio使用gradle来管理项目,使用依赖库也很简单,在build.gradle中配置一下就可以了。但是这么方便的工具也隐含很多坑,隐含依赖问题就是其中之一。

例如如果同一个jar包却有两个版本,导致ClassLoader加载出错,或者干脆生成dex的时候就报错,让你编译都不过。就是说这类错误可能发生在编译期,也可能发生在运行期(例如加载多个dex)。错误提示也是多种多样。

查看依赖库的命令行工具

$gradle <host_module_name>:dependencies 可以看到指定module的所有的间接依赖库,也就是依赖库的依赖库

$gradle showAllCache 可以看到所在module的所有依赖库的路径

前提是在module的build.gradle中加入showAllCache的task,如下

task showAllCache << {
   configurations.compile.each { println it }
}

遇到版本依赖问题总是很烦,需要仔细看log,有了查看依赖的方法就能省很多时间。

怎么定位是依赖库的问题?

错误提示多种多样,没有统一的log。如果是没见过的错误,可以google一下,一般都会有人遇到,然后说这是依赖库的版本冲突或干脆就说是依赖库的问题,但是也就到这里为止了(可能因为错误一般都是自己项目特有的,不好写总结)。

下边举两个例子,都是我遇到的。

错误举例

1 隐含依赖导致混淆出错 :app:transformClassesWithMultidexlistForDebug

在打包过程中报错,详细的log见我在stackoverflow上的问题

看log里有提示

“Error:Uncaught translation error: com.android.dex.util.ExceptionWithContext: name already added: string{"a"}”

这是我在注音输入法里遇到的,build.gradle中加上使用

minifyEnabled = false

打包成功;

minifyEnabled = true

打包失败。很显然跟混淆有关。

问题是怎么定位到具体是哪个库没做混淆或者不应该混淆呢?
build.gradle中用到的所有库我都在proguard中加了keep,为啥还有问题?

我当时用了笨办法,一个个排除。结果花了很长时间才找到出问题的依赖库。根本原因就是com.squareup.retrofit2依赖fastxml,后者没在proguard中被keep

后来在网上找到上边查看间接依赖的方法,试了一下,果然很好使。早知道这个方法的话我就能省很多时间了:-(

2 隐含依赖导致版本冲突
W/art: Incompatible structural change detected: Structural change of android.support.v4.app.FragmentActivity is hazardous (/data/user/0/<package_name>/files/dexOpt/com.tugele.expression.odex/plugin_doutu-debug.dex at compile time, /data/app/<package_name>-1/oat/arm/base.odex at runtime): Virtual method count off: 45 vs 46
W/art: Landroid/support/v4/app/FragmentActivity; (Compile time):

这个错误是在通过输入法启动图个乐插件(单独的apk包)时发生的。排除各种错误后把问题定位到android.support.v4的版本上,host和plugin使用了不同版本的support-v4版本上。

分析过程

第一步:验证一下错误原因是否属实。分别把host(主工程)和plugin(插件)的dex反编译成jar,然后用jd-gui查看FragmentActivity.class,发现确实不一样。

那问题就来了,host和plugin中指定的android-support-v4.jar的版本是一样的,build.gradle中写的都是“compile 'com.android.support:support-v4:23.1.1'”,版本一样为啥看到的代码不一样呢?

第二步:验证一下项目实际依赖的库。

怎么验证?

到host和plugin目录下,分别在命令行下执行 $gradle
host的依赖输出:

...................
<SDK_PATH>/extras/android/m2repository/com/android/support/support-v4/23.2.1/support-v4-23.2.1.aar
....................

plugin的依赖输出:

...................
<SDK_PATH>/extras/android/m2repository/com/android/support/support-v4/23.1.1/support-v4-23.1.1.aar
....................

发现问题木有?
host和plugin实际依赖的版本不一样!!!

为什么会这样?host为什么不用指定的版本23.1.1 ?

原因就是其它依赖库间接的依赖android-support-v4-23.2.1。那么是谁间接依赖它呢?

要查明原因就要用这个命令:$gradle <host_module_name>:dependencies
它能把所有库的依赖关系都展示给你。

看我的结果:

+--- project :zhushou_sdk
| +--- com.android.support:recyclerview-v7:23.2.1
| | +--- com.android.support:support-v4:23.2.1 (*)
| | --- com.android.support:support-annotations:23.2.1

看到了吗?com.android.support:recyclerview间接依赖到com.android.support:support-v4:23.2.1

再多看一点:

+--- project :explore_base_module
| --- com.android.support:support-v4:23.1.1 -> 23.2.1 (*)

这个module本来是依赖23.1.1的,gradle要照顾到版本兼容问题,所以就该成了23.2.1

这就是问题的根本原因。

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

推荐阅读更多精彩内容