Huaweiデバイスのみに影響するアプリの問題をデバッグしています。これをデバッグするために、P20 Lite ANE-LX1を購入しました。コードにいくつかのブレークポイントを設定し、完全なスタックトレースを調査しています。デバイスにはAndroid 8.0がインストールされており、同じSDKがAndroid Studioにダウンロードされています。
デバイスをデバッガーに接続してスタックトレースを調査しようとすると、システムソースファイルに次のエラーが表示されます。
スタックトレースで遊んだ後、実際にソースファイルがデバイスにインストールされているものに対応していないことを確認できます。時々、デバッガーはfunctionA
が呼び出される行をポイントし、スタックトレースで、代わりにfunctionB
が呼び出されることがわかります。この問題の影響を受けることが確認できたファイルは次のとおりです。
VideoView
、MediaPlayer
、ContentProvider
。プロジェクトのクリーンアップ、Android Studio、プロジェクト設定の変更)から追加のSDKを削除するなど、可能な解決策をすべて試しましたが、この問題の解決には役立ちません。
これにより、HuaweiはデバイスにAndroid 8.0の変更されたバージョンをインストールするため、システムファイルのスタックトレースをデバッグできないのはこのためです。これを確認するためにHuaweiに連絡しました。
それまでの間、関連するアイデアをお寄せいただければ幸いです。たぶん、Huaweiがデバイスにインストールするソースファイルの入手先を知っていますか?または、ソースコードとバイトコードの間の不一致を他の方法で修正する方法を知っていますか?
Robertのアドバイスに従って、Android 26のソースコードをアンインストールし、Huaweiでアプリを再度実行しました。VideoView
ファイルにジャンプするとすぐに、次の画像:
「ダウンロード」をクリックすると、ソースファイルのダウンロードが始まりました。
この後、VideoView
に足を踏み入れたところ、問題なく動作したようです。ただし、この行の後、これらのソースファイルも間違っていることが明らかになりました。
requestLayout
関数にステップインしようとすると、次のようになります。
そして、それは明らかに間違った結果です。実際、「Step to the next line」をクリックすると、ソースコードとバイトコードの不一致に関するメッセージが再び表示されます。
どうやら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が導入された後、これらのファイルはしばしば空になります代わりに、システムイメージとプリコンパイル済みフレームワークコードが使用されます。