1. ホーム

AndroidXへの移行-今まで遭遇したこと、これから遭遇すること、ここにあり

2022-02-24 06:01:44

I.  最初の移行

1. 背景

AndroidXは、生のサポートライブラリAPIパッケージのマッピングを  androidx  名前空間を使用します。パッケージと Maven アーティファクト名のみが変更され、クラス名、メソッド名、およびフィールド名は変更されていません。

2. マイグレート方法

Android Studio 3.2以降を使用することが推奨されており、その場合は順次  リファクタリング > AndroidX への移行 を使えば、既存のプロジェクトを素早くAndroidXに移行することができます。

3. 課題1

画像から想像できるように

プロジェクトの依存関係によっては、リファクタリング後にいくつかのエラーを手動で修正する必要があるかもしれません。

プロジェクトを正常にコンパイルするために、リファクタリング後にいくつかのエラーを手動で修正する必要がある場合があります。マイグレーションバックアッププロジェクトをZIPファイルとして進めますか?

ワンクリックで移行した後も、手作業で修正しなければならないエラーが発生する可能性があることがよくわかりますので、復元に使えるようにバックアップしておくことをおすすめします。さて、穴に足を踏み入れる覚悟はできているのでしょうか! さあ、やりましょう!

4. 質問2

使用法が見つかった後にコードに変更がありました。使用法検索をもう一度実行してください。

さて、2つ目の質問ですが、これは直訳すると

はリファクタリング操作を行えません。使用法を見つけた後、コードに変更があります。もう一度、用途別検索を実行してください。すぐに検索をやり直した方がいいのでしょうか?

解析中です。

スタジオからここまで促されたので、促されるままに再検索を続け、何が起こるか見てみましょう。

逆行列を解析する

すでに一度実行しているので、自動移行に問題がある点だと思われるので、無理に実行せず、まずは試してみて、うまくいかなければ、後で検索を再実行する

5. 問題点3

973件の使用例が見つかりました。本当に続けますか?
直訳すると

これまでに見つかった973件の使用例。本当に続けますか?

続けるをクリックしよう!問題が多くても続けることが大事だ!それが道理だ。

6. 繰り返し:関連するすべてのクラスが完全に置き換わるまで、マシンマイグレーションを数回使用する

次の画像のように、関連するすべてのクラスが置換されるまで、この処理を数回繰り返します。

7. リーク:いくつかのマシンミスの修正

マシン交換後、以下のようになります。

実際には次のように表示されます。

具体的なチェンジ・マッピングの関係としては ここをクリック 表示

8. さらにいくつかのエラー

エラーレポートを見ると、実はまだ手動移行で完全に置き換えられていないパッケージがたくさんあることが簡単に分かります。前回の記事であげたマッピング関係表を使って、正しい完全なパッケージ名を見つけることで、手動で置き換えることができます。

9. サードパーティライブラリへのパッケージ対応

butterknifeがアップグレードされていないために生成されたすべてのXXX

xxxActivity_ViewBinding files are all support packages

<イグ

修正方法 butterknifeのgithubプロジェクトで、Androidxが移行されないという問題を見かけました。 こちらをクリックしてご覧ください 私たちのプロジェクトではバージョン8.4.0を使っていますが、最新バージョンは10.1.0です。問題にある9.0.0-SNAPSHOTで問題が解決するか見てみましょう

10. 次はkotlinの問題

getItemOffsets' は何もオーバーライドしません。

直訳すると "GetItemOffsets" overrides nothing となり、このコードは Androidx パッケージに存在せず、存在しないメソッドをオーバーライドしていることを意味します、どうでもいいですがビジネスロジック、まずはコメントをどうぞ

11. コンパイルの問題

原因:ZIPファイルが空です

直訳すると

理由: zip ファイルが空です

備考:難読化スイッチがオフになっていることが判明

タスク :main.yunjiv2:transformClassesAndResourcesWithR8ForRelease FAILED
R8は新しいAndroidのコードシュリンカーです。もし何か問題が発生した場合は、以下のアドレスにバグを報告してください。
https://issuetracker.google.com、コンポーネント名として 'Shrinker (R8)' を使用してください。以下のことが可能です。
gradle.properties を 'android.enableR8=false' に更新することで、R8を無効にすることができます。
現在のバージョンは: 1.4.94 (build 390954928f0db9c3b888a367f7f128ce3bbfb160 from go/r8bot (luci-r8-ci-archive-0-5g74))です。

* 何が問題だったのか
タスク ':main.yunjiv2:transformClassesAndResourcesWithR8ForRelease' の実行に失敗しました。
archivezipファイルを読み込む際にZipエラーが発生しました。
R8はGoogleのzipコードの実験的なプロパティであり、不安定になる可能性があります。gradle.properties ファイルで 'android.enableR8=false' を定義することで無効にできます。

12. glideを4.9.0に置き換える。glideのBitmapTransformationのコンストラクタのapiが変更され、互換性があります。

GlideCircleTransform super(context); を super() に変更しました。
super(context)のGlideBlurTransformation;をsuper()に変更。

13. コンパイル・レポート プロセス 'command 'C:\Program FilesAndroid', 'Android Studio', 'jrebin.exe' finished with non-zero exit value 1

コンパイルオプションの設定 { <未定義
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.
    } app/build.gradle の下に追加しました。

問題解決に最適

14. コンパイルの問題は解決し、パッケージ化に成功しました。しかし、パッケージング後、apkのサイズが元の81mから51mになり、スタートアップがクラッシュしてしまう

2019-07-30 17:46:07.421 28362-28362/? E/LoadedApkです。appComponentFactoryをインスタンス化できません。
    java.lang.ClassNotFoundException: クラス "androidx.core.app.CoreComponentFactory" がパス上で見つかりませんでした。DexPathList[[zipファイル " ;/system/framework/org.apache.http.legacy.boot.jar", zipファイル "/data/app/com.imaginer.yunji-ZIwlEcykiG8qTv96zoQCIA==/base.Factory;/system/framework/jar" ]。apk"],nativeLibraryDirectories=[/data/app/com.imaginer.yunji-ZIwlEcykiG8qTv96zoQCIA==/lib/arm, /data/app/com.imaginer.yunji- ZIwlEcykiG8qTv96zoQCIA==/base.apk!/lib/armeabi, /stem/lib, /product/lib]]], /data/app/com.imagenji-yunjiのziwlEncykiG8qtv96zoQCIA==/Base.
        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: メイン
    プロセス:com.imaginer.yunji、PID:28362
    RuntimeException: Unable to instantiate application com.imaginer.yunji.YunJiApplication: java.lang.ClassNotFoundException.Unable to instantiate application com.imaginer.yunji.YunJiApplication: java.lang.ClassNotFoundException: クラス "com.imaginer.yunji.YunJiApplication" がパス上で見つかりませんでした。DexPathList[[zipファイル "/system/framework/org.apache.http.legacy.boot.jar", zipファイル "/data/app/com.imaginer.yunji-ZIwlEcykiG8qTv96zoQCIA==/base.YunjiApplication;/system/framework/org.apache.http.legacy.boot.jar"]]. apk"],nativeLibraryDirectories= [/data/app/com.imaginer.yunji-ZIwlEcykiG8qTv96zoQCIA==/lib/arm, /data/app/com.imaginer.yunji-ZIwlEcykiG8qTv96zoQCIA==/base.apk!/lib /armeabi, /system/lib, /product/lib]]], /data/app/com.imaginer.yunjiZIwlEcykiG8qTv96zoQCIA===/ベースとなるファイル。
        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)
     原因:java.lang.ClassNotFoundException: クラス "com.imaginer.yunji.YunJiApplication" がパス上で見つかりませんでした。DexPathList[[zipファイル "/system/framework/org.apache.http.legacy.boot.jar", zipファイル "/data/app/com.imaginer.yunji-ZIwlEcykiG8qTv96zoQCIA ==/base.YunJiApplication" ]。 apk"],nativeLibraryDirectories=[/data/app/com.imaginer.yunji-ZIwlEcykiG8qTv96zoQCIA==/lib/arm, /data/app/com.imaginer. yunji-ZIwlEcykiG8qTv96zoQCIA==/base.apk!/lib/armeabi, /stem/lib, /product/lib]]], /data/app.imaginer.yunjiZIwlEcykiG8qTv96zoQCIA==/dbas.ipk"/data/app/com.imaginer.yunjiZIwlEcykiG8qTv96zQCIA==/lib/arm/arm
        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です。これはベータユーザービルドではありません

まず、マルチデックスの問題を疑い、gradleで依存関係を見に行くと、確かにワンクリックマイグレーションではAndroidxにマイグレーションされないことが判明しました

解決策なし、再び混乱が疑われる

難読化ファイルがAndroidxに移行しないことを発見し、次のように置き換えた。

問題は未解決のまま

II. 第二次移住

1. 自動的にマイグレーションを行い、警告を報告する

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

ブロックする。

android.useDexArchive=true

2. コンパイルエラー

ERROR: gradle.properties ファイルの 'android.enableD8.desugaring= true' で要求される Java 8 言語サポートは、 'android.useDexArchive= false' ではサポートされません。

マスキングです。

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

3. コンパイルエラー、butterknifeが生成したクラスがサポートライブラリが見つからないと報告された。

アップグレード

butterknife to
10.2.0

apply plugin: 'com.didiglobal.booster'

4. コンパイルエラーです。Gradleの最小サポートバージョンは4.10.1です。現在のバージョンは4.6です。

プロジェクトのGradle設定を修正してください。
Gradle ラッパーの修正とプロジェクトの再インポート
Gradleラッパーのプロパティを開く
Gradleの設定

4.10.1へのアップグレード

5. コンパイルエラー, ERROR: Unable to resolve dependency for ':base.yunjipush@debug/compileClasspath': gssdk.aar をダウンロードできませんでした (com.getui:gssdk:2.2. 8.0)
詳細を表示
影響を受けるモジュール: base.yunjipush

誤報、クリーンアップ後に消える

6. ZipException時のtransformClassesWithBoosterForReleaseのステップ 

org.gradle.initialization.ReportedException: org.gradle.internal.exceptions.LocationAwareException: タスク ':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)
原因: org.gradle.internal.exceptions.LocationAwareException: タスク ':main.yunjiv2: transformClassesWithBoosterForRelease' の実行に失敗しました。
    at org.gradle.initialization.DefaultExceptionAnalyser.transform(DefaultExceptionAnalyser.java:74))です。
原因: org.gradle.api.tasks.TaskExecutionException: タスク ':main.yunjiv2:transformClassesWithBoosterForRelease' の実行に失敗しました。
原因:java.lang.RuntimeException: java.util.zip.
ZipException
原因:java.util.zip.ZipException
    at com.didiglobal.boosters.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
原因:java.util.zip.ZipException: zip ファイルが空です。
    at com.didiglobal.booster.transform.util.TransformKt.transform(transform.kt:35)
    at com.didiglobal.boosters.gradle.BoosterTransformInvocation$doFullTransform$1$2.accept(BoosterTransformInvocation.kt:125)
    at com.didiglobal.booster.gradle.BoosterTransformInvocation$doFullTransform$1$2.accept(BoosterTransformInvocation.kt:37)

ブースターのコメントアウト

apply plugin: 'android-aspectjx'


7. エラーは報告されません。パッケージは作成されますが、パッケージのサイズが107mから71mに変わり、スタートアップがクラッシュしてしまいます

何度か失敗した後、コンパイルログをよく見ると、コンパイルは成功しているのですが、コンパイル段階でこのようなログが隠されています。

at org.aspectj.weaver.AjAttribute.read(AjAttribute.java:137)
    at org.aspectj.weaver.bcel.Utility.readAjAttributes(Utility.java:101)
    org.aspectj.weaver.bcel.BcelMethod.unpackAjAttributes(BcelMethod.java:198)にて。
    at org.aspectj.weaver.bcel.BcelMethod.<init>(BcelMethod.java:91)
    org.aspectj.weaver.bcel.BcelObjectType.getDeclaredMethods(BcelObjectType.java:291)にて確認。
    org.aspectj.weaver.ReferenceType.getDeclaredMethods(ReferenceType.java:864)にて。
    at org.aspectj.weaver.ResolvedType.getDeclaredAdvice(ResolvedType.java:977)
    org.aspectj.weaver.ResolvedType.getDeclaredShadowMungers(ResolvedType.java:1017)にて。
    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)
    で

タスク :main.yunjiv2:transformClassesWithDexBuilderForRelease FAILED
java.util.zip.ZipException: zip ファイルが空です。
    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を削除する

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

正常なボリュームでパッケージングに成功しているのを発見し、ここが問題であることを確認しました。

対策:aopのアップグレード

com.yunji.androidx:xaop-runtime:1.0.0

への

Measures:
Migration

問題解決

8. aspectjxを取り外した後、パッケージングに成功する

起動に失敗し、ビジネスのヌルポインターが見つかりました。

2019-11-05 11:04:20.146 11136-11136/? E/AndroidRuntime: FATAL EXCEPTION: メイン
    プロセス:com.imaginer.yunji、PID:11136
    RuntimeException: Unable to instantiate application com.imaginer.yunji.YunJiApplicationLike: java.lang.NullPointerException: NULLオブジェクト参照で仮想メソッド 'android.content.res.AssetManager android.content.ContextWrapper.getAssets()' を呼び出そうとしました。
        at android.app.LoadedApk.makeApplication(LoadedApk.java:1046)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6125)
        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)
     原因:java.lang.NullPointerException。Android.content.res.AssetManager android.content.AssetManager を呼び出そうとしています。ContextWrapper.getAssets()' を、ヌル・オブジェクト参照で呼び出そうとしました。
        at com.imaginer.yunjicore.hook.ResChecker.checkRes(ResChecker.java:23)
        at com.imaginer.yunji.YunJiApplicationLike.attachBaseContext(YunJiApplicationLike.java:146)

9. 起動は成功し、ホームページは失敗し、データベース化で生成されたクラスからサポートパッケージが欠落している

クラッシュログは以下の通りです。
    プロセス:com.imaginer.yunji、PID:13335
    java.lang.NoClassDefFoundError: の解決に失敗しました。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)
     原因:java.lang.ClassNotFoundException: クラス "com.android.databinding.library.baseAdapters.DataBinderMapperImpl& quot; がパス上で見つかりませんでした。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件以上
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 dispose!

太字の部分に注意してください:com.imaginer.utils.DataBinderMapperImpl

and the error message becomes     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) reported an error changed, indicating that the automatic migration tool Jetifier is problematic and requires manual migration of some of the libraries related to databasing
at com.imaginer.utils.DataBinderMapperImpl.collectDependencies(DataBinderMapperImpl.java:71) and com.yunji.imaginer.base.fragment.BaseYJFragment.onViewCreated(BaseYJFragment.java:99) でAndroidX.BaseYJFragment.onViewCreated(BaseYJFragment.java)に変更しました。

In the constructor method you can see which xml corresponds
@NonNull
public static YjMarketNewListVideoItemNormalBinding inflate(@NonNull LayoutInflater inflater,
    @Nullable ViewGroup root, boolean attachToRoot, @Nullable DataBindingComponent component) {
  return DataBindingUtil.<YjMarketNewListVideoItemNormalBinding>inflate(inflater, com.yunji.found.R.layout.yj_market_new_list_ video_item_normal, root, attachToRoot, component);
}

基本的には、AndroidXに移行していない独自のmavenリポジトリでdatabingを使っていることが確認され、すべてのmavenリポジトリをAndroidXに移行し、2.0.0というバージョンにしたところ、エラーがそのまま消えてしまったのです

この間、ログが見つからないケースが2件飛び出しました。

1. まず、crashhandlerのため、いくつかのクラッシュは捕捉されません。

2. 第二に、いくつかのHuaweiの携帯電話は、ログをキャプチャすることはできません**#2846579#*#*ログスイッチをオンにすることもキャプチャできません。

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. クリーン コンパイル YjMarketNewListVideoItemNormalBinding サポート パッケージが不足しています。

android.support.constraint.ConstraintLayout

Error: パッケージ android.support.constraint が存在しません。

The 8.4.0 library is referenced in bscomponent

この時に必要なのが 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があることがわかった、サードパーティ製のプロジェクトの依存関係があることを示す。見つかったモジュールは、サードパーティ製のライブラリのない統一されたメンテナンスを持っていることがわかった

(. /)gradlew lib.yjfound:dependencies --configuration releaseRuntimeClasspath で依存関係を確認することができます。

The 8.4.0 library is referenced in bscomponent

maven リポジトリを開き、自分たちでパッケージ化したすべての Androidx ライブラリで置き換えます。

13. に駆け上がる。 ACT_AccountLogin がクラッシュし、次のエラーが報告されます。 RuntimeException:UnabletostartactivityComponentInfo{com.imaginer.yunji/com.yunji.imaginer.login.ACT_AccountLogin} が発生しました。Android.view.InflateException: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.\u003cinitu003e( SourceFile:35)#atcom.yunji.imaginer.item.widget.view.FilterBarView.initView(SourceFile:118)#atcom.yunji.imaginer.item.widget.view.FilterBarView.initView(sourceFile:118). FilterBarView.\(SourceFile:64)#. atcom.yunji.imaginer.item.widget.view.FilterBarView。 . \u003cinit\u003e(SourceFile:59)#... .67more#. 原因: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.java(LayoutInflater.java:956)#atandroid.view.LayoutInfater.java(LayoutInfater.java)#ATandoid.view.LayoutInflater.java(LayoutInflater.java) rInflateChildren(LayoutInflater.java:825)#atandroid.view.LayoutInflater.inflate(LayoutInflater.java:537)#... .76more#Causedby:java.lang.ClassNotFoundException:Didnu0027tfindclass"androidx.appcompat.widget.RecyclerView\"onpath.All Rights Reserved: DexPathList[[zipfile"/data/app/com.imaginer.yunji-1/base.apk"],nativeLibraryDirectories[/data/app/com.imaginer.yunji-1/lib/arm,/data/app/com.imaginer.yunji-1/lib/arm]],nativeLibraryLest[/data/app/com.image/jp/jp],/data/app/com.image/jp/jp imaginer.yunji-1/base.apk!/lib/armeabi,/vendor/lib,/system/lib]]#atdalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.BaseDexClassLoader.FindClass) 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.ClassLoader.findClass(NativeMethod) ##atjava.lang.ClassLoader.findClass(NativeMethod.java:781) .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 というアノテーションを導入する。
## ----------------------------------
-printconfiguration
-keep,allowobfuscation @interface androidx.annotation. <キープ
-keep @androidx.annotation.Keepクラス *.
-keepclassmembers クラス * {... <未定義
    @androidx.annotation.Keepの*;
}