迁移到AndroidX-你遇到的和即将遇到的,这里都有

一.  第一次迁移

1.背景:

AndroidX 会将原始支持库 API 软件包映射到 androidx 命名空间。只有软件包和 Maven 工件名称发生了变化;类、方法和字段名称没有改变。

2.如何迁移

这里推荐借助 Android Studio 3.2 及更高版本,您可以通过从菜单栏中依次选择 Refactor > Migrate to AndroidX,快速迁移现有项目以使用 AndroidX。

3.问题1

迁移到AndroidX-你遇到的和即将遇到的,这里都有_第1张图片

如图的意思,

before proceeding,we recommend that you make a backup of your project depending on your project dependencies,you might need to manually fix some errors after the refactoring in order to successfully compile your project. do you want to proceed with the migration backup project as zip file

在继续之前,我们建议您根据项目依赖性备份项目,您可能需要在重构之后手动修复一些错误,以便成功编译项目。是否要以zip文件的形式继续迁移备份项目?

很明确的指出,可能一键迁移后,依然有些错误,需要手动修复,建议大家备份,以便用来还原。好吧,做好踩坑准备!开干~

4.问题2

迁移到AndroidX-你遇到的和即将遇到的,这里都有_第2张图片

cannot perform refactoring operation.there were changes in code after usages have been found.please perform usage search again. would you like to rerun the search now?

好了,第二个问题来了,直译过来意思就是

无法执行重构操作。找到用法后代码中有更改。请再次执行用法搜索。是否立即重新运行搜索?

分析正:

既然studio提示,走到了这一步,那我们就按提示继续Rerun search,看看后况如何

分析反:

既然已经运行了一遍,估计就是自动迁移有问题的点,那我们就不强求,先试一试,若不行,待会儿就再Rerun search

5.问题3

迁移到AndroidX-你遇到的和即将遇到的,这里都有_第3张图片

973 usages found so far.are you sure you wish to continue?
直译过来就是

迄今为止发现的973种用法。您确定要继续吗?

我们点击continue,问题再多也要继续啊,迎难而上才是王道

6.重复:多次使用机器迁移,直至完全替换所有相关类

迁移到AndroidX-你遇到的和即将遇到的,这里都有_第4张图片

多来几遍这个过程,直至所有相关类替换完成,表现为下图

迁移到AndroidX-你遇到的和即将遇到的,这里都有_第5张图片

 

7.漏网之鱼:解决一些机器犯的错

机器替换后,长这样

迁移到AndroidX-你遇到的和即将遇到的,这里都有_第6张图片

实际应该长这样

具体的更改映射关系可点击这里查看

8.又有一些错误

迁移到AndroidX-你遇到的和即将遇到的,这里都有_第7张图片

看报错,不难发现,其实手动迁移依然存在很多未替换完全的包,我们手动替换,可通过上一条中给出的映射关系表,找正确的完整包名。

9.第三方库中的support包

因为butterknife未升级,导致生成的所有XXX

xxxActivity_ViewBinding文件都是support包

迁移到AndroidX-你遇到的和即将遇到的,这里都有_第8张图片

迁移到AndroidX-你遇到的和即将遇到的,这里都有_第9张图片

迁移到AndroidX-你遇到的和即将遇到的,这里都有_第10张图片

如何解决:在butterknife github项目中,果然看到了Androidx没迁移的issue,点击这里查看,看情况官方已经迁移,我们项目用的8.4.0版本,最新的版本是10.1.0,先看看issue中提到的9.0.0-SNAPSHOT能不能解决问题

10.接下来出现kotlin的问题

迁移到AndroidX-你遇到的和即将遇到的,这里都有_第11张图片

'getItemOffsets' overrides nothing

直译过来就是“GetItemOffsets”不重写任何内容,应该就是这段代码在Androidx包不存在,复写了一个不存在的方法,管他呢,业务逻辑,先注释

11.编译问题

Cause: zip file is empty

直译过来就是

原因:zip文件为空

备注:发现混淆开关被关闭

迁移到AndroidX-你遇到的和即将遇到的,这里都有_第12张图片

> Task :main.yunjiv2:transformClassesAndResourcesWithR8ForRelease FAILED
R8 is the new Android code shrinker. If you experience any issues, please file a bug at
https://issuetracker.google.com, using 'Shrinker (R8)' as component name. You can
disable R8 by updating gradle.properties with 'android.enableR8=false'.
Current version is: 1.4.94 (build 390954928f0db9c3b888a367f7f128ce3bbfb160 from go/r8bot (luci-r8-ci-archive-0-5g74)).

迁移到AndroidX-你遇到的和即将遇到的,这里都有_第13张图片

* What went wrong:
Execution failed for task ':main.yunjiv2:transformClassesAndResourcesWithR8ForRelease'.
> Zip error while reading archivezip file is empty
R8是谷歌的压缩代码的一个实验属性,可能存在不稳定。可以通过在 gradle.properties 文件中定义'android.enableR8=false'将其禁用。

12.将glide替换成4.9.0,glide中BitmapTransformation构造方法api有变动,兼容之

GlideCircleTransform中super(context);改成super();
GlideBlurTransformation中super(context);改成super();

13.编译报Process 'command 'C:\Program Files\Android\Android Studio\jre\bin\java.exe'' finished with non-zero exit value 1

将compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }加入app/build.gradle下面

完美解决问题

14.编译问题解决,成功打包。但打包后apk体积由原81m变成51m,且启动崩溃

迁移到AndroidX-你遇到的和即将遇到的,这里都有_第14张图片

迁移到AndroidX-你遇到的和即将遇到的,这里都有_第15张图片

 

 

迁移到AndroidX-你遇到的和即将遇到的,这里都有_第16张图片

 

2019-07-30 17:46:07.421 28362-28362/? E/LoadedApk: Unable to instantiate appComponentFactory
    java.lang.ClassNotFoundException: Didn't find class "androidx.core.app.CoreComponentFactory" on path: DexPathList[[zip file "/system/framework/org.apache.http.legacy.boot.jar", zip file "/data/app/com.imaginer.yunji-ZIwlEcykiG8qTv96zoQCIA==/base.apk"],nativeLibraryDirectories=[/data/app/com.imaginer.yunji-ZIwlEcykiG8qTv96zoQCIA==/lib/arm, /data/app/com.imaginer.yunji-ZIwlEcykiG8qTv96zoQCIA==/base.apk!/lib/armeabi, /system/lib, /product/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at android.app.LoadedApk.createAppFactory(LoadedApk.java:261)
        at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:778)
        at android.app.LoadedApk.getClassLoader(LoadedApk.java:857)
        at android.app.LoadedApk.getResources(LoadedApk.java:1108)
        at android.app.ContextImpl.createAppContext(ContextImpl.java:2655)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6436)
        at android.app.ActivityThread.access$1900(ActivityThread.java:267)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1963)
        at android.os.Handler.dispatchMessage(Handler.java:109)
        at android.os.Looper.loop(Looper.java:207)
        at android.app.ActivityThread.main(ActivityThread.java:7470)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:958)
2019-07-30 17:46:07.458 28362-28362/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.imaginer.yunji, PID: 28362
    java.lang.RuntimeException: Unable to instantiate application com.imaginer.yunji.YunJiApplication: java.lang.ClassNotFoundException: Didn't find class "com.imaginer.yunji.YunJiApplication" on path: DexPathList[[zip file "/system/framework/org.apache.http.legacy.boot.jar", zip file "/data/app/com.imaginer.yunji-ZIwlEcykiG8qTv96zoQCIA==/base.apk"],nativeLibraryDirectories=[/data/app/com.imaginer.yunji-ZIwlEcykiG8qTv96zoQCIA==/lib/arm, /data/app/com.imaginer.yunji-ZIwlEcykiG8qTv96zoQCIA==/base.apk!/lib/armeabi, /system/lib, /product/lib]]
        at android.app.LoadedApk.makeApplication(LoadedApk.java:1164)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6529)
        at android.app.ActivityThread.access$1900(ActivityThread.java:267)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1963)
        at android.os.Handler.dispatchMessage(Handler.java:109)
        at android.os.Looper.loop(Looper.java:207)
        at android.app.ActivityThread.main(ActivityThread.java:7470)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:958)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "com.imaginer.yunji.YunJiApplication" on path: DexPathList[[zip file "/system/framework/org.apache.http.legacy.boot.jar", zip file "/data/app/com.imaginer.yunji-ZIwlEcykiG8qTv96zoQCIA==/base.apk"],nativeLibraryDirectories=[/data/app/com.imaginer.yunji-ZIwlEcykiG8qTv96zoQCIA==/lib/arm, /data/app/com.imaginer.yunji-ZIwlEcykiG8qTv96zoQCIA==/base.apk!/lib/armeabi, /system/lib, /product/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at android.app.AppComponentFactory.instantiateApplication(AppComponentFactory.java:50)
        at android.app.Instrumentation.newApplication(Instrumentation.java:1127)
        at android.app.LoadedApk.makeApplication(LoadedApk.java:1156)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6529) 
        at android.app.ActivityThread.access$1900(ActivityThread.java:267) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1963) 
        at android.os.Handler.dispatchMessage(Handler.java:109) 
        at android.os.Looper.loop(Looper.java:207) 
        at android.app.ActivityThread.main(ActivityThread.java:7470) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:958) 
2019-07-30 17:46:07.466 1146-4380/? E/ReportTools: This is not beta user build

第一,怀疑是multidex的问题,去看gradle中的依赖,发现确实一键迁移没有迁移成Androidx

没有解决,再怀疑是混淆的问题

发现混淆文件中,确实没有迁移成Androidx,替换之

问题依然没有解决

 

二. 第二次迁移

1.自动迁移,然后报警告

The option 'android.useDexArchive' is deprecated and should not be used anymore.

屏蔽:

android.useDexArchive=true

2.编译error

ERROR: Java 8 language support, as requested by 'android.enableD8.desugaring= true' in your gradle.properties file, is not supported when 'android.useDexArchive= false'.

屏蔽:

#android.enableD8=true
#android.enableD8.desugaring=true

3.编译报错,butterknife生成的类中报出support库找不到

升级

butterknife至
10.2.0

4.编译报错:Minimum supported Gradle version is 4.10.1. Current version is 4.6.

Please fix the project's Gradle settings.
Fix Gradle wrapper and re-import project
Open Gradle wrapper properties
Gradle settings

升级至 4.10.1

5.编译报错,ERROR: Unable to resolve dependency for ':base.yunjipush@debug/compileClasspath': Could not download gssdk.aar (com.getui:gssdk:2.2.8.0)
Show Details
Affected Modules: base.yunjipush

误报,clean后消失

6.transformClassesWithBoosterForRelease步骤时ZipException 

org.gradle.initialization.ReportedException: org.gradle.internal.exceptions.LocationAwareException: Execution failed for task ':main.yunjiv2:transformClassesWithBoosterForRelease'.
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:154)
    at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:124)
    at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:77)
Caused by: org.gradle.internal.exceptions.LocationAwareException: Execution failed for task ':main.yunjiv2:transformClassesWithBoosterForRelease'.
    at org.gradle.initialization.DefaultExceptionAnalyser.transform(DefaultExceptionAnalyser.java:74)
Caused by: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':main.yunjiv2:transformClassesWithBoosterForRelease'.
Caused by: java.lang.RuntimeException: java.util.zip.ZipException
Caused by: java.util.zip.ZipException
    at com.didiglobal.booster.gradle.BoosterTransformInvocation$doFullTransform$1.accept(BoosterTransformInvocation.kt:123)
    at com.didiglobal.booster.gradle.BoosterTransformInvocation$doFullTransform$1.accept(BoosterTransformInvocation.kt:37)
    at com.didiglobal.booster.gradle.BoosterTransformInvocation.doFullTransform$booster_gradle_plugin(BoosterTransformInvocation.kt:116)
    at com.didiglobal.booster.gradle.BoosterTransform.transform(BoosterTransform.kt:42)
    at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:239)
    at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:235)
    at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102)
    ... 44 more
Caused by: java.util.zip.ZipException: zip file is empty
    at com.didiglobal.booster.transform.util.TransformKt.transform(transform.kt:35)
    at com.didiglobal.booster.gradle.BoosterTransformInvocation$doFullTransform$1$2.accept(BoosterTransformInvocation.kt:125)
    at com.didiglobal.booster.gradle.BoosterTransformInvocation$doFullTransform$1$2.accept(BoosterTransformInvocation.kt:37)

注释掉booster

apply plugin: 'com.didiglobal.booster'

7.不报错。打出了包,但是包大小由107m变成71m,启动崩溃

多次尝试未果,仔细查看编译日志,虽说编译成功,但是编译阶段有这么一段隐藏的日志

at org.aspectj.weaver.AjAttribute.read(AjAttribute.java:137)
    at org.aspectj.weaver.bcel.Utility.readAjAttributes(Utility.java:101)
    at org.aspectj.weaver.bcel.BcelMethod.unpackAjAttributes(BcelMethod.java:198)
    at org.aspectj.weaver.bcel.BcelMethod.(BcelMethod.java:91)
    at org.aspectj.weaver.bcel.BcelObjectType.getDeclaredMethods(BcelObjectType.java:291)
    at org.aspectj.weaver.ReferenceType.getDeclaredMethods(ReferenceType.java:864)
    at org.aspectj.weaver.ResolvedType.getDeclaredAdvice(ResolvedType.java:977)
    at org.aspectj.weaver.ResolvedType.getDeclaredShadowMungers(ResolvedType.java:1017)
    at org.aspectj.weaver.ResolvedType.collectShadowMungers(ResolvedType.java:843)
    at org.aspectj.weaver.ResolvedType.collectCrosscuttingMembers(ResolvedType.java:770)
    at org.aspectj.weaver.CrosscuttingMembersSet.addOrReplaceAspect(CrosscuttingMembersSet.java:113)
    at org.aspectj.weaver.CrosscuttingMembersSet.addOrReplaceAspect(CrosscuttingMembersSet.java:68)
    at org.aspectj.weaver.bcel.BcelWeaver.addLibraryJarFile(BcelWeaver.java:239)
    at org.aspectj.ajdt.internal.core.builder.AjBuildManager.initBcelWorld(AjBuildManager.java:878)
    at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performBuild(AjBuildManager.java:251)
    at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild(AjBuildManager.java:187)
    at org.aspectj.ajdt.ajc.AjdtCommand.doCommand(AjdtCommand.java:112)
    at org.aspectj.ajdt.ajc.AjdtCommand.runCommand(AjdtCommand.java:60)
    at org.aspectj.tools.ajc.Main.run(Main.java:371)
    at sun.reflect.GeneratedMethodAccessor845.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoCachedMethodSite.invoke(PojoMetaMethodSite.java:192)
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:136)
    at com.hujiang.gradle.plugin.android.aspectjx.internal.AJXTask.call(AJXTask.groovy:99)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at

> Task :main.yunjiv2:transformClassesWithDexBuilderForRelease FAILED
java.util.zip.ZipException: zip file is empty
    at java.util.zip.ZipFile.open(Native Method)
    at java.util.zip.ZipFile.(ZipFile.java:225)
    at java.util.zip.ZipFile.(ZipFile.java:279)
    a

猜测:呐,找到了,大胆猜测aspectjx与Androidx不兼容

验证猜想:去掉aspectjx

apply plugin: 'android-aspectjx'

发现成功打包,体积正常,确认是这里问题。

措施:升级aop

"xaop"                              : "com.yunji.android:xaop-runtime:3.0.1",

com.yunji.androidx:xaop-runtime:1.0.0

问题解决

 

8.去掉aspectjx之后,打包成功

启动失败,发现有业务空指针

2019-11-05 11:04:20.146 11136-11136/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.imaginer.yunji, PID: 11136
    java.lang.RuntimeException: Unable to instantiate application com.imaginer.yunji.YunJiApplicationLike: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.AssetManager android.content.ContextWrapper.getAssets()' on a null object reference
        at android.app.LoadedApk.makeApplication(LoadedApk.java:1046)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6125)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:515)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:837)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.AssetManager android.content.ContextWrapper.getAssets()' on a null object reference
        at com.imaginer.yunjicore.hook.ResChecker.checkRes(ResChecker.java:23)
        at com.imaginer.yunji.YunJiApplicationLike.attachBaseContext(YunJiApplicationLike.java:146)
 

9.启动成功,进主页失败,databing生成的类中,有support包找不见

崩溃日志如下
    Process: com.imaginer.yunji, PID: 13335
    java.lang.NoClassDefFoundError: Failed resolution of: Lcom/android/databinding/library/baseAdapters/DataBinderMapperImpl;
        at com.imaginer.utils.DataBinderMapperImpl.collectDependencies(DataBinderMapperImpl.java:71)
        at androidx.databinding.MergedDataBinderMapper.addMapper(MergedDataBinderMapper.java:58)
        at androidx.databinding.MergedDataBinderMapper.addMapper(MergedDataBinderMapper.java:60)
        at androidx.databinding.DataBinderMapperImpl.(DataBinderMapperImpl.java:5)
        at androidx.databinding.DataBindingUtil.(DataBindingUtil.java:32)
        at androidx.databinding.DataBindingUtil.bind(DataBindingUtil.java:152)
        at com.yunji.imaginer.base.fragment.BaseYJFragment.onViewCreated(BaseYJFragment.java:99)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1471)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)

     Caused by: java.lang.ClassNotFoundException: Didn't find class "com.android.databinding.library.baseAdapters.DataBinderMapperImpl" on path: DexPathList[[zip file "/data/app/com.imaginer.yunji-Z_WAENMMwuT1dqHNR0y0Cg==/base.apk"],nativeLibraryDirectories=[/data/app/com.imaginer.yunji-Z_WAENMMwuT1dqHNR0y0Cg==/lib/arm, /data/app/com.imaginer.yunji-
            ... 62 more
2019-11-05 11:14:53.377 2104-2462/? E/InputDispatcher: channel '2665045 com.imaginer.yunji/com.imaginer.yunji.activity.main.ACT_Main (server)' ~ Channel is unrecoverably broken and will be disposed!

注意看加黑部分:com.imaginer.utils.DataBinderMapperImpl

措施:迁移at com.imaginer.utils.DataBinderMapperImpl.collectDependencies(DataBinderMapperImpl.java:71)和  at com.yunji.imaginer.base.fragment.BaseYJFragment.onViewCreated(BaseYJFragment.java:99)到AndroidX,,报错变为

    java.lang.NoClassDefFoundError: Failed resolution of: Lcom/android/databinding/library/baseAdapters/DataBinderMapperImpl;
        at com.video.mrecord.DataBinderMapperImpl.collectDependencies(DataBinderMapperImpl.java:71)
        at androidx.databinding.MergedDataBinderMapper.addMapper(MergedDataBinderMapper.java:58)
        at androidx.databinding.MergedDataBinderMapper.addMapper(MergedDataBinderMapper.java:60)
        at androidx.databinding.MergedDataBinderMapper.addMapper(MergedDataBinderMapper.java:60)
        at androidx.databinding.DataBinderMapperImpl.(DataBinderMapperImpl.java:5)
        at androidx.databinding.DataBindingUtil.(DataBindingUtil.java:32)
   

at com.video.mrecord.DataBinderMapperImpl.collectDependencies(DataBinderMapperImpl.java:71)报错改变了,说明自动迁移工具

Jetifier是有问题的,需要手动迁移部分与databing有关的库

基本确认是因为使用了我们自己封装的未迁移到AndroidX的maven仓库中,使用了databing, 将maven仓库全部迁移至AndroidX,命名为2.0.0的版本,刚刚的错误消失

这期间爆出两个找不到日志的情况:

1.第一,部分崩溃会因为crashhandler而无法被抓取

2.第二,部分华为手机无法抓取日志,*#*#2846579#*#*打开log开关也无法抓取

 

10. vlayout实现的列表,滑动异常

措施:加入混淆文件

-keep class org.apache.http.** { *; }

-keep class com.google.android.material.** {*;}
-keep class androidx.** {*;}
-keep public class * extends androidx.**
-keep interface androidx.** {*;}
-dontwarn com.google.android.material.**
-dontnote com.google.android.material.**
-dontwarn androidx.**

 

11.clean编译YjMarketNewListVideoItemNormalBinding中还有support包找不见

在构造方法中可以看到对应哪个xml

 

@NonNull
public static YjMarketNewListVideoItemNormalBinding inflate(@NonNull LayoutInflater inflater,
    @Nullable ViewGroup root, boolean attachToRoot, @Nullable DataBindingComponent component) {
  return DataBindingUtil.inflate(inflater, com.yunji.found.R.layout.yj_market_new_list_video_item_normal, root, attachToRoot, component);
}

报错误: 程序包android.support.constraint不存在

android.support.constraint.ConstraintLayout

,这时候你要看看com.yunji.found.R.layout.yj_market_new_list_video_item_normal中jertifier是不是自动迁移报错了

全局搜索,全局替换android.support.constraint.ConstraintLayout 至 androidx.constraintlayout.widget.ConstraintLayout

 

12.发现全部改完还有butterknife生成的注解类报错,查看butterknife包,发现有8.4.0版本和10.2.0,说明有第三方项目依赖。发现found模块有没有统一维护的第三方库

 

通过(./)gradlew lib.yjfound:dependencies --configuration releaseRuntimeClasspath查看到

bscomponent中引用了8.4.0的库

打开maven仓库替换之,替换所有Androidx我们自己封装的库

 

 

13.跑起来进入ACT_AccountLogin崩溃,报错如下java.lang.RuntimeException:UnabletostartactivityComponentInfo{com.imaginer.yunji/com.yunji.imaginer.login.ACT_AccountLogin}:android.view.InflateException:BinaryXMLfileline#11:BinaryXMLfileline#11:Errorinflatingclassandroidx.core.widget.Space#

 

androidx.core.widget.Space布局中路径报错,更改成androidx.legacy.widget.Space

 

14.跑起来进入首页崩溃

Causedby:android.view.InflateException:BinaryXMLfileline#7:.yunji.imaginer.item.widget.popu.GoodSortPopupWindow.\u003cinit\u003e(SourceFile:35)#atcom.yunji.imaginer.item.widget.view.FilterBarView.initView(SourceFile:118)#atcom.yunji.imaginer.item.widget.view.FilterBarView.\u003cinit\u003e(SourceFile:64)#atcom.yunji.imaginer.item.widget.view.FilterBarView.\u003cinit\u003e(SourceFile:59)#...67more#Causedby:android.view.InflateException:BinaryXMLfileline#1:Errorinflatingclassandroidx.appcompat.widget.RecyclerView#atandroid.view.LayoutInflater.createViewFromTag(LayoutInflater.java:803)#atandroid.view.LayoutInflater.parseInclude(LayoutInflater.java:968)#atandroid.view.LayoutInflater.rInflate(LayoutInflater.java:858)#atandroid.view.LayoutInflater.rInflateChildren(LayoutInflater.java:825)#atandroid.view.LayoutInflater.inflate(LayoutInflater.java:537)#...76more#Causedby:java.lang.ClassNotFoundException:Didn\u0027tfindclass\"androidx.appcompat.widget.RecyclerView\"onpath:DexPathList[[zipfile\"/data/app/com.imaginer.yunji-1/base.apk\"],nativeLibraryDirectories\u003d[/data/app/com.imaginer.yunji-1/lib/arm,/data/app/com.imaginer.yunji-1/base.apk!/lib/armeabi,/vendor/lib,/system/lib]]#atdalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)#atjava.lang.ClassLoader.loadClass(ClassLoader.java:511)#atjava.lang.ClassLoader.loadClass(ClassLoader.java:469)#atandroid.view.LayoutInflater.createView(LayoutInflater.java:605)#atandroid.view.LayoutInflater.createViewFromTag(LayoutInflater.java:791)#...80more#Suppressed:java.lang.ClassNotFoundException:androidx.appcompat.widget.RecyclerView##atjava.lang.Class.classForName(NativeMethod)##atjava.lang.BootClassLoader.findClass(ClassLoader.java:781)##atjava.lang.BootClassLoader.loadClass(ClassLoader.java:841)##atjava.lang.ClassLoader.loadClass(ClassLoader.java:504)##...83more#Causedby:java.lang.NoClassDefFoundError:Classnotfoundusingthebootclassloader;nostacktraceavailable#"

 

androidx.appcompat.widget.RecyclerView找不到 ,替换成androidx.recyclerview.widget.RecyclerView,自动迁移工具还是相当不好用的

到这里,基本上迁移已完全成功,不再报错。

 

15.AndroidX混淆规则


#AndroidX混淆规则
-keep class com.google.android.material.** {*;}
-keep class androidx.** {*;}
-keep public class * extends androidx.**
-keep interface androidx.** {*;}
-dontwarn com.google.android.material.**
-dontnote com.google.android.material.**
-dontwarn androidx.**

## ----------------------------------
##     引入keep注解,可用@Keep方式保持对应内容
## ----------------------------------
-printconfiguration
-keep,allowobfuscation @interface androidx.annotation.Keep
-keep @androidx.annotation.Keep class *
-keepclassmembers class * {
    @androidx.annotation.Keep *;
}

你可能感兴趣的:(迁移到AndroidX-你遇到的和即将遇到的,这里都有)