美文网首页android开发技巧
记 Android 依赖排除

记 Android 依赖排除

作者: 大队辅导猿 | 来源:发表于2020-08-07 11:29 被阅读0次
    image.png
    项目越来越庞大,业务变的复杂引入的库也多,很容易冲突,记录一次采坑经历

    背景:接入直播依赖,与之前的CC直播冲突,底层都是引用webrtc

    一、运行时报错会提示哪个依赖冲突,先确定下哪个依赖下的模块发生冲突

    Android 查看项目依赖树的方式:

    查看冲突的jar包,可以使用一下命令查看
    Android StudioTerminal下敲 gradlew xxxx:dependencies 命令,查看依赖树

    ./gradlew 模块名:dependencies  //查看单独模块的依赖
    ./gradlew :app:dependencies --configuration compile //查看项目的编译依赖
    

    或者使用 Gradle Project

    Gradle Project.png

    例如引入这个模块的时候会自动帮我们引入com.google.android:support-v4
    当我们其他模块或者当前模块存在依赖,会出现包的冲突,使用exclude排除依赖模块就可以

    compile('org.eclipse.paho:org.eclipse.paho.android.service:1.0.2') {
            exclude(group: 'com.google.android', module: 'support-v4')
        }
    
    如果在不同模块发生冲突,排除后,其他模块的下的依赖引入要用
    使用api ,不能使用 implementation,implementation只允许模块内部访问,导致其他模块访问不到
    
    二、简单的冲突可以上面方法解决,如果引入依赖下的jar包,或者java包下的类与本项目依赖冲突,不能把 mode 整体排除,对比jar下的文件,需要对aar包的重打
    • 在本地找到依赖的aar包
    • 解压.aar文件
    • 使用jd-gui查看源码并定位到代码再修改
    • 解压.aar文件解压后产生的classes.jar文件
    • 打包源码为classes.jar
    • 打包所有文件(res文件、classes.jar、AndroidManifest.xml等)为xxx.aar
    解压.aar文件

    myLib.aar要解压的aar文件,tempFolder解压的文件名
    $ unzip myLib.aar -d tempFolder

    使用jd-gui查看源码并定位到代码再修改
    1. 进入tempFolder把里面的classes.jar复制出来
    2. 再使用jd-gui(mac版下载地址:https://github.com/parcool/resources/blob/master/jd-gui-1.4.0.jar windows自行下载)打开classes.jar找到需要修改的地方,把这个类的代码copy出来,在android studio中新建项目,把这个.aar放到新建libs文件夹里再引用它,把之前copy出来的代码新建一个.java后粘贴到里面(注意包名也得一样,部分报错的代码需要手动修改一下。比如:this关键字之类的删掉),改好后build一下,从/build/intermediates/classes/debug/对应包名找到修改的.class文件。
      注:新版(没研究过具体哪个版本开始)的android studio生成的.class位置变了,在/build/intermediates/javac/debug/对应包名下。
    解压.aar文件解压后产生的classes.jar文件
    1. 解压classes.jar。命令:$ unzip classes.jar -d tempFolderClasses
    2. 把第二步生成的.class文件放到tempFolderClasses文件夹下对应的地方替换掉以前的.class文件(大功即将告成)
    打包源码为classes.jar

    $ jar cvf newClasses.jar -C tempFolderClasses/ .(注意斜杠后面加空格与.)
    再把这个newClasses.jar放回tempFolder并删除之前的,修改文件名为classes.jar

    打包所有文件(res文件、classes.jar、AndroidManifest.xml等)为xxx.aar

    $ jar cvf newAAR.aar -C tempFolder/ .

    关于AAR包的重打再分享给大家一个轮子

    一个用于排除AAR包中冗余或者冲突类的gradle脚本(Jar包也适用)

    重打完aar包依赖引入,再排除冲突依赖就可以解决

    implementation(name: 'newAA', ext: 'aar')
    

    如果类名不同,类里面方法不同,或者引入的so包版本不同,目前没有好的方案,只能去掉一方,或者统一下版本。建议大家不要修改,会引发已有功能的报错

    相关文章

      网友评论

        本文标题:记 Android 依赖排除

        本文链接:https://www.haomeiwen.com/subject/rnqfdktx.html