Android 支持库迁移到AndroidX,看完不会的来打我

本文详细介绍了在Android项目中将支持库迁移到AndroidX过程中遇到的问题及解决方案,包括ASM字节码转换异常、混淆配置的调整,以及手动检查和修正主工程中的特殊写法。通过对第三方库的处理、混淆规则的更新,确保了迁移的成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击Migrate后,会出现弹窗Looking for Usages,开始在当前项目中搜索所有可能需要迁移的源文件,包括代码源文件、XML文件、build.gradle配置文件等,最终会列出当前主工程使用到支持库的所有文件列表。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GcYruPAh-1638157865685)(https://user-gold-cdn.xitu.io/2019/9/18/16d4260bea42a53f?imageView2/0/w/1280/h/960/ignore-error/1)]

点击Do Refactor确认迁移,AS自动执行迁移AndroidX的替换过程。如将对应的支持库类名、包名、构件名等都替换成相应的AndroidX形式。

一点时间后,主工程替换完成。此时打开gradle.properties,会发现自动添加了如下配置项。

android.useAndroidX=true
android.enableJetifier=true

android.useAndroidX=true,表示主工程使用AndroidX形式。
android.enableJetifier=true,表示针对主工程中使用到的三方库,也会自动执行AndroidX的替换过程。

同时,在自动执行三方库的替换时,出下了如下报错信息:

ERROR: Unable to resolve dependency for ‘:MyCorn@prodDebug/compileClasspath’: Failed to transform file ‘fingerprint-1.1.1.aar’ to match attributes {artifactType=processed-aar} using transform JetifyTransform

大致的意思是使用JetifyTransformfingerprint-1.1.1.aar进行替换过程中,出现了问题。但具体问题没有进一步的提示信息。于是,直接通过命令执行下构建看一下:

./gradlew assembleDevDebug

1: Task failed with an exception.

  • What went wrong:
    Could not resolve all files for configuration ‘:MyCorn:devDebugCompileClasspath’.

Failed to transform file ‘fingerprint-1.1.1.aar’ to match attributes {artifactType=processed-aar} using transform JetifyTransform
Failed to transform ‘/Users/corn/.gradle/caches/modules-2/files-2.1/com.corn.feature/fingerprint/1.1.1/ae2da4c824fb2923eac7a1340222d50d6308f7ea/fingerprint-1.1.1.aar’ using Jetifier. Reason: 8. (Run with --stacktrace for more details.) To disable Jetifier, set android.enableJetifier=false in your gradle.properties file.

进而,带上–stacktrace看看。

./gradlew assembleDevDebug --stacktrace


Caused by: java.lang.ArrayIndexOutOfBoundsException: 8
at org.objectweb.asm.ClassReader.readFrameType(ClassReader.java:2313)
at org.objectweb.asm.ClassReader.readFrame(ClassReader.java:2269)
at org.objectweb.asm.ClassReader.readCode(ClassReader.java:1448)
at org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1126)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:698)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:500)
at com.android.tools.build.jetifier.processor.transform.bytecode.ByteCodeTransformer.runTransform(ByteCodeTransformer.kt:39)
at com.android.tools.build.jetifier.processor.Processor.visit(Processor.kt:328)
at com.android.tools.build.jetifier.processor.archive.ArchiveFile.accept(ArchiveFile.kt:41)
at com.android.tools.build.jetifier.processor.Processor.visit(Processor.kt:316)
at com.android.tools.build.jetifier.processor.archive.Archive.accept(Archive.kt:66)
at com.android.tools.build.jetifier.processor.Processor.visit(Processor.kt:316)
at com.android.tools.build.jetifier.processor.archive.Archive.accept(Archive.kt:66)
at com.android.tools.build.jetifier.processor.Processor.transformLibrary(Processor.kt:312)
at com.android.tools.build.jetifier.processor.Processor.transform(Processor.kt:175)
at com.android.build.gradle.internal.dependency.JetifyTransform.transform(JetifyTransform.kt:199)
… 39 more

我们发现,JetifyTransform内部使用了ASM,在对aar进行ClassReader的过程中抛出了异常。并且从错误栈信息上看,应该有一类叫jetifier的工具,是在这个工具中调用的ASM操作。

官方文档搜索下,果然发现了jetifier的踪迹。
developer.android.com/studio/comm…

同样的,Google Source上也找到了其对应的实现。
android.googlesource.com/platform/fr…

下载对应的jetifier-standalone,解压后,执行命令对fingerprint-1.1.1.aar执行AndroidX转化。

➜ bin ./jetifier-standalone -i ./fingerprint-1.1.1.aar -o 11.aar
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 8
at org.objectweb.asm.ClassReader.readFrameType(ClassReader.java:2313)
at org.objectweb.asm.ClassReader.readFrame(ClassReader.java:2269)
at org.objectweb.asm.ClassReader.readCode(ClassReader.java:1448)
at org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1126)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:698)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:500)
at com.android.tools.build.jetifier.processor.transform.bytecode.ByteCodeTransformer.runTransform(ByteCodeTransformer.kt:40)
at com.android.tools.build.jetifier.processor.Processor.visit(Processor.kt:539)
at com.android.tools.build.jetifier.processor.archive.ArchiveFile.accept(ArchiveFile.kt:53)
at com.android.tools.build.jetifier.processor.Processor.visit(Processor.kt:521)
at com.android.tools.build.jetifier.processor.archive.Archive.accept(Archive.kt:76)
at com.android.tools.build.jetifier.processor.Processor.visit(Processor.kt:521)
at com.android.tools.build.jetifier.processor.archive.Archive.accept(Archive.kt:76)
at com.android.tools.build.jetifier.processor.Processor.transformLibrary(Processor.kt:517)
at com.android.tools.build.jetifier.processor.Processor.transform2(Processor.kt:291)
at com.android.tools.build.jetifier.processor.Processor.transform2 d e f a u l t ( P r o c e s s o r . k t : 251 ) a t c o m . a n d r o i d . t o o l s . b u i l d . j e t i f i e r . s t a n d a l o n e . M a i n . r u n ( M a i n . k t : 156 ) a t c o m . a n d r o i d . t o o l s . b u i l d . j e t i f i e r . s t a n d a l o n e . M a i n default(Processor.kt:251) at com.android.tools.build.jetifier.standalone.Main.run(Main.kt:156) at com.android.tools.build.jetifier.standalone.Main default(Processor.kt:251)atcom.android.tools.build.jetifier.standalon

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值