AndroidXへの移行-今まで遭遇したこと、これから遭遇すること、ここにあり
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.imaginer.utils.DataBinderMapperImpl.collectDependencies(DataBinderMapperImpl.java:71) and
com.yunji.imaginer.base.fragment.BaseYJFragment.onViewCreated(BaseYJFragment.java:99) でAndroidX.BaseYJFragment.onViewCreated(BaseYJFragment.java)に変更しました。
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
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の*;
}
関連
-
react error TypeError: 未定義のプロパティ 'setState' を読み取ることができません。
-
Uncaught TypeError: document.getElementsByClassName("xxx").addEventListener is not a function.
-
TensorFlowのネイティブランタイムソリューションのロードに失敗しました。
-
AssertionError [ERR_ASSERTION]: タスク関数を指定しなければならない、gulpのバージョンが一致しない
-
configparserモジュールがインポートできない、import configparserエラー解決法
-
Application_Webservice の Global.asax ファイルの開始をトリガーすることはできません。
-
アンドロイド開発(21)ビープ音とバイブレーション警告の実装。
-
警告 警告: ポインタから異なるサイズの整数へのキャスト [-Wpointer-to-int-cast].
-
macのターミナルでコマンドが見つからない場合の解決策
-
githubからダウンロードしたコードをコンパイルし、プラグインを適用します。com.github.dcendents.android-maven' を適用します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Run prompt error ImportError: cannot import name 'Imputer' from 'sklearn.preprocessing' Solution
-
画像ダウンロードの問題
-
Pythonラーニングノートです。TypeError: cannot use a string pattern on a bytes-like object とその解決法
-
リクエストの処理中に処理されない例外が発生した
-
セレン使用時の問題点
-
アンドロイド エントリーの利用
-
ServiceStarterのコマンドラインを短くする、またはアプリケーションエラーのコマンドラインも短くする
-
ディープラーニングノートカタログ(Enda Wu) - ついに翻訳版登場
-
docker-compose up ボリューム 外部ファイルの呼び出し、パーミッションの問題でディレクトリ xxxxx を開けない : パーミッション拒否
-
.addEventListenerは、ある理由でイベントを追加します。