美文网首页
架构设计的常见问题及解决参考

架构设计的常见问题及解决参考

作者: 码农朱同学 | 来源:发表于2018-09-27 06:12 被阅读0次

    1,引进的第三方库中所依赖的库与主工程中同时存在且版本不同。

    例如:XImageView主项目与应用ximageviewlib moudle都引用了并使用了

        implementation 'com.android.support:appcompat-v7:28.0.0'
    

    我们打出的包为 1424KB


    项目与module引用第三方库版本相同时包的大小

    现在我们将ximageviewlib中引用的库改为:

        implementation 'com.android.support:appcompat-v7:27.1.0'
    
    项目与module引用第三方库版本不同时包的大小

    发现打出的包大小一样

        同时将ximageviewlib的targetSdkVersion 28 改为 27后再试试
    

    结果仍然是1424KB

    同时将ximageviewlib的targetSdkVersion 28 和 compileSdkVersion 28够改为27后

    结果仍然是1424KB

    我们将主项目


    主项目配置
    Android dependency 'com.android.support:support-core-utils' has different version for the compile (27.1.0) and runtime (28.0.0) classpath. You should manually set the same version via DependencyResolution
    

    2,compileOnly与runtimeOnly应用场景的不同与对apk大小的影响

    3,support包与第三方依赖库版本不一致的问题

    解决方法(同样的适用于其他的依赖冲突。)

    1)修改自己项目中的com.android.support的版本号,与所依赖的库版本号一致,但是当我们依赖的库中的com.android.support版本号有好几个版本就不行了。(不推荐)

    2)常见方法

    api("com.afollestad.material-dialogs:core:0.9.4.7") {
          exclude group: 'com.android.support', module: 'support-v13'
      }
    

    比如对于 Gradle 远程依赖的两个第三方库,他们内部同时依赖相同的另一个辅助第三方库。这个时候我们就没办法像第一种情况那样手动删除本地文件。好在 Gradle 插件提供了相应的解决方案,即使用 exclude 语法,如:

    compile 'com.yifeng.example:example-1:1.0'
    compile ('com.yifeng.example:example-2:1.0') {
        exclude group: 'com.android.support', module: 'support-v4'
    }
    

    如例子中所示,远程依赖的第三方库 example-1 与 example-2 内部同时引入 support-v4 包,那么只需要在其中一个的引入地方添加 exclude 语句,根据 group 和 module 过滤规则,将相同引入的 v4 包剔除在外即可。

    当需要在一个依赖中去除多个递归依赖项时,可以使用多条 exclude 语句,比如:

    compile ('com.wdullaer:materialdatetimepicker:3.2.2') {
        exclude group: 'com.android.support', module: 'support-v4'
        exclude group: 'com.android.support', module: 'design'
    }
    

    还有一种更简单的写法,使用 Groove 语言的循环语句,模板如下(同样适用于 module 规则):

    compile() { dep ->
        [group1, group2].each{ group -> dep.exclude group: group }
    }
    

    对于上面的例子,便可以改造成:

    compile() { dep ->
        ['support-v4', 'support-v13', 'design'].each{ module -> dep.exclude module: module }
    }
    

    推荐这种方法,如果发生冲突了,依赖第三方库时候排除掉对com.android.support包的依赖,这样自己的项目随便依赖什么版本都可以。

    另外还有一个建议,在我们自己创建library给别人使用时,如果需要依赖com.android.support的话,建议用provided的方式依赖,这样只会在编译时有效,不会参与打包。避免给使用者带来不便。

    provided 'com.android.support:appcompat-v7:26.1.0'
    provided 'com.android.support:design:26.1.0'
    provided 'com.android.support:support-vector-drawable:26.1.0'
    

    4,嵌套库依赖的版本控制问题怎么解决

    比如

    Manifest merger failed : uses-sdk:minSdkVersion 15 cannot be smaller than version 16 declared in library [com.zhxh:xbuttonlib:3.8] C:\Users\zhxh.gradle\caches\transforms-1\files-1.1\xbuttonlib-3.8.aar\fae3e2f73319b4c37bfc7b235d694cf6\AndroidManifest.xml as the library might be using APIs not available in 15
    Suggestion: use a compatible library with a minSdk of at most 15,
    or increase this project's minSdk version to at least 16,
    or use tools:overrideLibrary="com.zhxh.xbuttonlib" to force usage (may lead to runtime failures)

    暂时先写这些,这两天整理出来

    相关文章

      网友评论

          本文标题:架构设计的常见问题及解决参考

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