本文主要是介绍记AGP3.2.0与androidx的一个bug,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
环境
AGP版本:3.2.0
项目support library:Androidx
gradle版本:4.6
起因
接入某广告时发现安卓编译报了一个错误
* What went wrong:Could not resolve all files for configuration ':app:slidemeDebugCompileClasspath'.> Failed to transform file 'adslib-hongkongjoygenesis-release-2.3.2168.aar' to match attributes {artifactType=processed-aar} using transform JetifyTransform> Failed to transform 'E:\android\home\caches\modules-2\files-2.1\com.iqzone\adslib-hongkongjoygenesis-release\2.3.2168\7077b626befc92f49bce4cad784977c150d66b82\adslib-hongkongjoygenesis-release-2.3.2168.aar' using Jetifier. Reason: The type does not support '.' as package separator! Received '.first(".LM_replay").parentNode.removeChild(L.first(".LM_replay"))'.. (Run with --stacktrace for more details.) To disable Jetifier, set android.enableJetifier=false in your gradle.properties file.
查找资料发现是AGP3.2.0版本问题中jetifier的bug
获得的解决方案是:1.升级AGP版本 2.修改jetifier的默认引用版本
但使用方案1的话修改成本太高了 :AGP 除了 DSL 之外并没有公开的文档,内部 API 经常变动
因此打算使用方案2 此时发现按照解决方案2在build.gradle配置classpath jetifier版本未生效
处理经过
怀疑classpath配置使用插件没生效 测试去掉了AGP的引用发现还能打包
此时怀疑环境变量导致 或 缓存使其可以正常打包 ,经过排查测试,可以确定与这问题无关
最后在buildSrc中发现有使用AGP3.2.0的依赖 猜测可能与这个有关
于是将主包导入AS中发现确实引用有异常的jetifier版本并且是AGP3.2.0自带的
此时将修复的jetifier版本引入buildSrc中 问题解决
处理方法
如果没有使用本地插件或本地插件中未使用AGP的可以在项目中的build.gradle中加入如下代码
dependencies {// NOTE: Do not place your application dependencies here; they belong// in the individual module build.gradle files...//TODO: Fix for new jetifier issue. Not be needed in gradle version 3.2.2classpath 'com.android.tools.build.jetifier:jetifier-processor:1.0.0-beta02'classpath 'com.android.tools.build.jetifier:jetifier-core:1.0.0-beta02'}
若有使用本地插件且插件中使用了AGP的就在buildSrc的build.gradle加入如下代码
dependencies {...implementation 'com.android.tools.build:gradle:3.2.0'//AGP3.2.0中的jetifier有bug 1.0.0-beta02版本修复implementation 'com.android.tools.build.jetifier:jetifier-processor:1.0.0-beta02'implementation 'com.android.tools.build.jetifier:jetifier-core:1.0.0-beta02'
}
扩展
那么我们主包中buildSrc具体是做什么的呢?与主包build.gradle中的classpath使用有什么关系呢?
什么是buildSrc
摘自 Gradle 文档:当运行 Gradle 时会检查项目中是否存在一个名为 buildSrc 的目录。然后 Gradle 会自动编译并测试这段代码,并将其放入构建脚本的类路径中, 对于多项目构建,只能有一个 buildSrc 目录,该目录必须位于根项目目录中,buildSrc 是 Gradle 项目根目录下的一个目录,它可以包含我们的构建逻辑,与脚本插件相比,buildSrc 应该是首选,因为它更易于维护、重构和测试代码
buildSrc与classpath的关系
在安卓中编译apk过程中需要修改字节码如:加密静态字符串、修改xml文件等操作 就需要使用插件,自定义的本地插件就在buildSrc中进行,而我们更常见的是直接引用classPath使用别人的插件(远程插件)
优先级的话是会先处理本地插件编译测试,此时远程插件的修改就不会生效
参考:
https://juejin.im/post/5ed3ef906fb9a047bf7070b6
https://github.com/f2prateek/dart/issues/230
这篇关于记AGP3.2.0与androidx的一个bug的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!