架构设计的常见问题及解决参考
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)
暂时先写这些,这两天整理出来