web-dev-qa-db-ja.com

Huaweiのシステムファイルの「ソースコードがバイトコードと一致しません」

Huaweiデバイスのみに影響するアプリの問題をデバッグしています。これをデバッグするために、P20 Lite ANE-LX1を購入しました。コードにいくつかのブレークポイントを設定し、完全なスタックトレースを調査しています。デバイスにはAndroid 8.0がインストールされており、同じSDKがAndroid Studioにダウンロードされています。

デバイスをデバッガーに接続してスタックトレースを調査しようとすると、システムソースファイルに次のエラーが表示されます。

enter image description here

スタックトレースで遊んだ後、実際にソースファイルがデバイスにインストールされているものに対応していないことを確認できます。時々、デバッガーはfunctionAが呼び出される行をポイントし、スタックトレースで、代わりにfunctionBが呼び出されることがわかります。この問題の影響を受けることが確認できたファイルは次のとおりです。

  1. VideoView
  2. MediaPlayer
  3. ContentProvider

プロジェクトのクリーンアップ、Android Studio、プロジェクト設定の変更)から追加のSDKを削除するなど、可能な解決策をすべて試しましたが、この問題の解決には役立ちません。

これにより、HuaweiはデバイスにAndroid 8.0の変更されたバージョンをインストールするため、システムファイルのスタックトレースをデバッグできないのはこのためです。これを確認するためにHuaweiに連絡しました。

それまでの間、関連するアイデアをお寄せいただければ幸いです。たぶん、Huaweiがデバイスにインストールするソースファイルの入手先を知っていますか?または、ソースコードとバイトコードの間の不一致を他の方法で修正する方法を知っていますか?

アップデート1

Robertのアドバイスに従って、Android 26のソースコードをアンインストールし、Huaweiでアプリを再度実行しました。VideoViewファイルにジャンプするとすぐに、次の画像:

enter image description here

「ダウンロード」をクリックすると、ソースファイルのダウンロードが始まりました。

enter image description here

この後、VideoViewに足を踏み入れたところ、問題なく動作したようです。ただし、この行の後、これらのソースファイルも間違っていることが明らかになりました。

enter image description here

requestLayout関数にステップインしようとすると、次のようになります。

enter image description here

そして、それは明らかに間違った結果です。実際、「Step to the next line」をクリックすると、ソースコードとバイトコードの不一致に関するメッセージが再び表示されます。

17

どうやらHuaweiはAOSPを分岐し、そのソースを変更しました。これは多くのメーカーが行っていることであり、ソースが互換性テストスイートに合格する限り、まったく問題ありません。私自身、ROMをカスタマイズするためのアプローチに関連するHuawei P20での暗号化されたビデオ再生の問題を見ました。

しかし、要点に戻ると、/ system/framework/arm/boot.oatまたはboot-framework.oatまたは/system/framework/boot.vdexから、デバイスで実行されている正確なフレームワークコードを取得できます。これらのファイルがどのように構造化されているかは正確にはわかりませんが、Androidバージョン間および製造元によって異なります。adbpullでこれらのファイルを取得したら(これを実行するにはrootが必要です)、次のことを実行できます) oat-> dex、dex->​​ jar、dex2jarまたはその他のツールを使用してソースを取得します。伝統的に、/ system/framework/framework.jarからフレームワークコードを取得することが可能でしたが、ARTが導入された後、これらのファイルはしばしば空になります代わりに、システムイメージとプリコンパイル済みフレームワークコードが使用されます。

1