dedecms 网站安装教程,大学生旅游网站策划书,十大软件app排行榜下载,在线设计系统对应官方文档#xff1a; developer.android.com/jetpack/and…
简单点说就是#xff0c;对App开发者而言#xff0c;AndroidX更加友好#xff0c;因为我们引入时#xff0c;只需要关注AndroidX中具体的需要引入的构件版本即可。且大部分具体的构件#xff0c;具有一致的…对应官方文档 developer.android.com/jetpack/and…
简单点说就是对App开发者而言AndroidX更加友好因为我们引入时只需要关注AndroidX中具体的需要引入的构件版本即可。且大部分具体的构件具有一致的版本号。开发者使用起来不再需要关注项目自身的最低支持版本和编译版本了只需要像引入其他的第三方库一样v1.0、v2.0、v3.0这种方式引入即可。
如原有的引入写法 com.android.support:recyclerview-v7:28.0.0 变成了 androidx.recyclerview:recyclerview:1.0.0
官方文档也提供了Androidx版本具体的升级日志记录。 developer.android.com/jetpack/and… developer.android.com/jetpack/and…
三、支持库迁移到AndroidX
3.1 迁移AndroidX的必要性
AndroidX对开发者使用更加友好同时支持库文档上官方已经明确支持库后续不再维护。另外在Android Studio上新建模块时也发现如果没有迁移到AndroidX模块创建不了表明开始有强制性的措施使得开发者必须迁移到AndroidX。 3.2 迁移AndroidX的前置条件
Android Sudio在3.2版本开始对直接迁移到AndroidX进行了支持。在操作路径Refactor Migrate to AndroidX下但使用时会发现可能存在如下提示 这也说明了利用官方内置的迁移方式迁移AndroidX之前工程环境上最好满足如下条件 1Android Studio 3.2及以上。当前时点最新版本已经是3.5稳定版了。 2AGP版本3.2.0及以上对应的Gradle版本4.6及以上。 3项目编译版本28及以上。
如果当前项目没有满足上述条件可以先升级对应的配套。
3.3 迁移过程
Android官方提供了具体的迁移指引。具体参见文档 developer.android.com/jetpack/and…
Just Start
以下主要记录实际项目中的迁移过程以及遇到的问题及解决。
Refactor Migrate to AndroidX操作后AS会有对应的迁移提醒提示你去备份项目文件如有必要可以先备份。但一般而言AS项目都是基于Git进行管理直接单独切一个分支进行迁移操作即可此处备份成zip现实意义不大。 点击Migrate后会出现弹窗Looking for Usages开始在当前项目中搜索所有可能需要迁移的源文件包括代码源文件、XML文件、build.gradle配置文件等最终会列出当前主工程使用到支持库的所有文件列表。 点击Do Refactor确认迁移AS自动执行迁移AndroidX的替换过程。如将对应的支持库类名、包名、构件名等都替换成相应的AndroidX形式。
一点时间后主工程替换完成。此时打开gradle.properties会发现自动添加了如下配置项。
android.useAndroidXtrue android.enableJetifiertrue
android.useAndroidXtrue表示主工程使用AndroidX形式。 android.enableJetifiertrue表示针对主工程中使用到的三方库也会自动执行AndroidX的替换过程。
同时在自动执行三方库的替换时出下了如下报错信息
ERROR: Unable to resolve dependency for ‘:MyCornprodDebug/compileClasspath’: Failed to transform file ‘fingerprint-1.1.1.aar’ to match attributes {artifactTypeprocessed-aar} using transform JetifyTransform
大致的意思是使用JetifyTransform对fingerprint-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 {artifactTypeprocessed-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.enableJetifierfalse 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.standalone.Main.run(Main.kt:156)atcom.android.tools.build.jetifier.standalone.MainCompanion.main(Main.kt:109) at com.android.tools.build.jetifier.standalone.Main.main(Main.kt)
发现出现了同样的错误信息。
显然应该是fingerprint-1.1.1.aar中有字节码有问题。经查fingerprint内部直接以jar方式引入了三星的指纹识别库已经很比较老的版本了经业务同学确认现在已经可以直接去除。
去除fingerprint内部的三星指纹库后升级版本下载对应的aar文件后再次尝试转化
./jetifier-standalone -i ./fingerprint-1.1.3-20190916.092208-1.aar -o mm.aar
执行成功且有转换后的对应文件生成。
主工程更新fingerprint对应依赖版本后重新执行构建出现错误提示
e: /Users/corn/AndroidStudioProjects/MyCorn/base/src/main/java/com/mycorn/base/mvvm/EventLiveData.kt: (13, 5): ‘observe’ overrides nothing e: /Users/corn/AndroidStudioProjects/MyCorn/base/src/main/java/com/mycorn/base/mvvm/EventLiveData.kt: (20, 5): ‘removeObserver’ overrides nothing
原因在于对应的LiveData接口observe、removeObserver中的形参有所改动从原来的
NonNull Observer observer
变成了
NonNull Observer? super T observer
修正EventLiveData类中的重写方法的对应形参与接口保持一致即可。
再次重新构建出现错误信息
/Users/corn/AndroidStudioProjects/MyCorn/trans/src/main/java/com/mycorn/biz/supertrans/v12/slide/ItemSlideHelper.java:566: 错误: 程序包androidx.appcompat.recyclerview.R不存在 .getDimension(androidx.appcompat.recyclerview.R.dimen.item_touch_helper_swipe_escape_velocity);
/Users/corn/AndroidStudioProjects/MyCorn/trans/src/main/java/com/mycorn/biz/supertrans/v12/slide/ItemSlideHelper.java:568: 错误: 程序包androidx.appcompat.recyclerview.R不存在 .getDimension(androidx.appcompat.recyclerview.R.dimen.item_touch_helper_swipe_escape_max_velocity);
/Users/corn/AndroidStudioProjects/MyCorn/trans/src/main/java/com/mycorn/biz/supertrans/v12/slide/ItemSlideHelper.java:2115: 错误: 程序包androidx.appcompat.recyclerview.R不存在 androidx.appcompat.recyclerview.R.dimen.item_touch_helper_max_drag_scroll_per_frame);
核查官方文档对应的替换关系应该是
ndroid.support.v7.recyclerview.R
替换为
androidx.recyclerview.R
此处替换成了
androidx.appcompat.recyclerview.R
按照文档对应修正过来。
再次重新构建可以构建成功。
3.4 核验与发现
此时构建成功是不是就真的都处理好了呢是不是都没问题了呢。显然不是的。
首先分别查看主工程对应的编译时和运行时依赖看看是否都从android.support.* 替换成了androidx.* 。
./gradlew -q MyCorn:dependencies --configuration devDebugAndroidTestCompileClasspath ~/compile.txt
./gradlew -q MyCorn:dependencies --configuration devDebugAndroidTestRuntimeClasspath ~/runtime.txt
仔细对比后发现虽然依赖中都已经被替换成了androidx.* 。但编译时的依赖中含有大量的rc01。如
androi dx.appcompat:appcompat:1.0.0-rc01 androidx.recyclerview:recyclerview:1.0.0-rc01 …
但运行时依赖中却没有rc01。
androidx.appcompat:appcompat:1.0.0 androidx.recyclerview:recyclerview:1.0.0 …
经核查后发现主工程中之前依赖支持库时有两种写法一种是直接写法如
implementation com.android.support:appcompat-v7:28.0.0
另一种是采取统一定义后进行的变量形式引入
api rootProject.ext.dependencies[“appcompat-v7”]
其中具体变量如appcompat-v7被统一定义在了专用的一个dependencies.gradle文件中。 大致形式如下
// 统一配置管理 def supportVersion “28.0.0”
project.ext { android [ “compileSdkVersion”: 28, “minSdkVersion” : 19, “targetSdkVersion” : 26, “javaMaxHeapSize” : “5G” ]
dependencies [ “support-compat” : “com.android.support:support-compat: s u p p o r t V e r s i o n , s u p p o r t − c o r e − u t i l s : c o m . a n d r o i d . s u p p o r t : s u p p o r t − c o r e − u t i l s : {supportVersion}, support-core-utils : com.android.support:support-core-utils: supportVersion,support−core−utils:com.android.support:support−core−utils:{supportVersion}”, “support-core-ui” : “com.android.support:support-core-ui: s u p p o r t V e r s i o n , s u p p o r t − m e d i a − c o m p a t : c o m . a n d r o i d . s u p p o r t : s u p p o r t − m e d i a − c o m p a t : {supportVersion}, support-media-compat: com.android.support:support-media-compat: supportVersion,support−media−compat:com.android.support:support−media−compat:{supportVersion}”, “support-fragment” : “com.android.support:support-fragment: s u p p o r t V e r s i o n , s u p p o r t − a n n o t a t i o n s : c o m . a n d r o i d . s u p p o r t : s u p p o r t − a n n o t a t i o n s : {supportVersion}, support-annotations : com.android.support:support-annotations: supportVersion,support−annotations:com.android.support:support−annotations:{supportVersion}”, “appcompat-v7” : “com.android.support:appcompat-v7:${supportVersion}”, … … ] }
来到对应的文件发现对应的android.support.*并没有被替换成androidx.*。
而在build.gralde中直接引入的写法是被相应替换了的。已经被正确替换成了
implementation ‘androidx.appcompat:appcompat:1.0.0’
也就是说构建时遇到api rootProject.ext.dependencies[appcompat-v7]其实是没有被准确识别的按照编译时的依赖关系最终被识别成了带有rc01的AndroidX版本。
于是才出现了编译时和运行时大量的版本不一致情况。
解决起来很简单直接在dependencies.gradle文件中将android.support.*对应人为替换成androidx.*形式并重新规范命名和版本相应修正对应的被使用到的地方并修正成统一的AndroidX依赖写法。
// 统一配置管理 def androidXVersion “1.0.0”
project.ext { android [ “compileSdkVersion”: 28, “minSdkVersion” : 19, “targetSdkVersion” : 26, “javaMaxHeapSize” : “5G” ]
dependencies [ “androidx-core” : “androidx.core:core: a n d r o i d X V e r s i o n , a n d r o i d x − c o r e − u t i l s : a n d r o i d x . l e g a c y : l e g a c y − s u p p o r t − c o r e − u t i l s : {androidXVersion}, androidx-core-utils : androidx.legacy:legacy-support-core-utils: androidXVersion,androidx−core−utils:androidx.legacy:legacy−support−core−utils:{androidXVersion}”, “androidx-core-ui” : “androidx.legacy:legacy-support-core-ui: a n d r o i d X V e r s i o n , a n d r o i d x − m e d i a : a n d r o i d x . m e d i a : m e d i a : {androidXVersion}, androidx-media : androidx.media:media: androidXVersion,androidx−media:androidx.media:media:{androidXVersion}”, “androidx-fragment” : “androidx.fragment:fragment: a n d r o i d X V e r s i o n , s u p p o r t − a n n o t a t i o n s : a n d r o i d x . a n n o t a t i o n : a n n o t a t i o n : {androidXVersion}, support-annotations : androidx.annotation:annotation: androidXVersion,support−annotations:androidx.annotation:annotation:{androidXVersion}”, “androidx-appcompat” : “androidx.appcompat:appcompat:${androidXVersion}”, … … ] }
重新输出编译时和运行时依赖发现此时支持库版本已经一致。
重新构建项目发现可以构建成功。
但到此时我们依然有四个问题需要进一步确认 1主工程中是否有支持库相关的一些特别的写法结果会跟上面的dependencies.gradle一样不能被自动识别并迁移例如反射字符串甚至字符串拼接等等。
2原有依赖库android.support.*肯定会有一些混淆配置现在迁移成androidx.*后混淆配置这块如何对应处理
droidx-appcompat : “androidx.appcompat:appcompat:${androidXVersion}”, … … ] }
重新输出编译时和运行时依赖发现此时支持库版本已经一致。
重新构建项目发现可以构建成功。
但到此时我们依然有四个问题需要进一步确认 1主工程中是否有支持库相关的一些特别的写法结果会跟上面的dependencies.gradle一样不能被自动识别并迁移例如反射字符串甚至字符串拼接等等。
2原有依赖库android.support.*肯定会有一些混淆配置现在迁移成androidx.*后混淆配置这块如何对应处理