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

一.  第一次迁移

1.背景:

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

2.如何迁移

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

3.问题1

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

如图的意思,

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文件的形式继续迁移备份项目/p>

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

4.问题2

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

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/p>

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

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

分析正:

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

分析反:

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

5.问题3

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

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

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

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

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

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

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

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

 

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

机器替换后,长这样

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

实际应该长这样

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

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

8.又有一些错误

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

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

9.第三方库中的support包

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

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

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

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

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

10.接下来出现kotlin的问题

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

‘getItemOffsets’ overrides nothing

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

11.编译问题

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

Cause: zip file is empty

直译过来就是

原因:zip文件为空

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

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

> 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-你遇到的和即将遇到的,这里都有

* 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 FilesAndroidAndroid Studiojrebinjava.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-你遇到的和即将遇到的,这里都有

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

 

 

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

 

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-你遇到的和即将遇到的,这里都有

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

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

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

问题依然没有解决

 

二. 第二次迁移

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

屏蔽:

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’.

屏蔽:

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

升级

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

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.<init>(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.<init>(ZipFile.java:225)
    at java.util.zip.ZipFile.<init>(ZipFile.java:279)
    a

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

验证猜想:去掉aspectjx

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

措施:升级aop

问题解决

 

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.<init>(DataBinderMapperImpl.java:5)
        at androidx.databinding.DataBindingUtil.<clinit>(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.<init>(DataBinderMapperImpl.java:5)
        at androidx.databinding.DataBindingUtil.<clinit>(DataBindingUtil.java:32)
   

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

基本确认是因为使用了我们自己封装的未迁移到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

 

来源:Winter_H

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年6月23日
下一篇 2019年6月23日

相关推荐