android 9.0以降のhideメソッドの反映制限の解析について
同僚と食事をしたときに、android 9.0から@hideメソッドの使用が制限され、リフレクションを使ってもhideメソッドが使えなくなったことを知りました。汗だくでビビりました。特にフレームワークに慣れている人なら、アプリでリフレクションを使いまくるのは当たり前のことなんですけどね。
職場に戻り、早速アンドロイドの公式ドキュメントを見てみました。 https://developer.android.com/about/versions/pie/restrictions-non-sdk-interfaces
その仕組みは、ホワイトリストとブラックリストの2つのフィルタリング方式で、携帯電話メーカーにとってはホワイトリストが有効ですが、アプリを書く人にとってはそうではなく、ブラックリストに注力すればよいことがわかりました。実際には、4種類のリストがあります。
- ホワイトリスト SDK
- 薄い灰色のリスト:まだアクセス可能な非SDKの関数/フィールド。
-
濃いグレーのリスト
- ターゲットSDKがAPIレベル28以下のアプリケーションでは、deep graylistインターフェースが許可されます。
- 対象SDKがAPIレベル28以上のアプリケーションの場合:ブラックリストの場合と同じ動作となります。
-
ブラックリストに登録されています。ターゲットSDKに関係なく、制限されている。プラットフォームは、そのインターフェイスが存在しないかのように動作する。例えば、アプリケーションがそのインターフェースを使用しようとすると、プラットフォームは、そのインターフェースが存在しないかのように動作します。
NoSuchMethodError
/NoSuchFieldException
アプリケーションが特定のクラスのフィールド/関数のリストを知りたがっていても、プラットフォームはインターフェイスを含めない。
しがない国産アプリプログラマーにとっては、今は本当にブラックリストに集中すればいいだけで、apiレベルを28まで書くのはあまり現実的ではなく、数年後にグレーリストと向き合うことになるかもしれません。
ブラックリストは、ソースコードの platform/prebuilts/runtime/appcompat/hiddenapi-dark-greylist.txt にあります。
ソースコードがなければ、直接ウェブで見ることができます
ブラックリストの中核となる考え方は、一部のシステム情報とセキュリティのためのインターフェイスを制限することであり、カスタム Views で使用されるリフレクションなどの他の側面は、ブラックリストについて心配する必要はありません。
良心的なアプリのプログラマーは、ブラックリストを気にする必要はない。
関連
-
adb devices OffLine Solution(オフラインソリューション
-
GIF、Lottie、SVGA
-
Androidで発生した問題、解決策とヒント
-
アンドロイドプロジェクトのパッケージングにgradleを使用する際の問題点
-
ArrayAdapter は、リソース ID が TextView であることが必要です。
-
IllegalStateException。ArrayAdapter は、リソース ID が TextView である必要があります。
-
アンドロイドスタジオでJunitのエラー問題を解決する
-
アプリケーションがメインスレッドで過剰に作業している可能性があります。
-
Android TextViewは、テキスト内容が表示省略記号を超えているかどうかを判断する
-
AndroidManifest.xmlの最も完全な詳細な説明
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
armeabi-v7a armeabi arm64-v8a パラメータの意味説明
-
Gradle のエラーです。gradle-core.jar (com.android.tools.build:gradle-core:x.x.x) を見つけられませんでした。
-
AndroidStudio reports Could not resolve all artifacts for configuration ':app:classpath'.
-
アンドロイドスタジオのエラーを解決する --> Error:(1, 0) id 'com.android.application' を持つプラグインが見つかりません。
-
telnet'が内部コマンドまたは外部コマンドとして認識されない 解決方法
-
Android ProgressBarの色を変更する
-
アンドロイドシェイプ、グラデーション、角丸、ボーダーラインの設定
-
アンドロイドの遅延実行のいくつかの方法
-
adb connection appears device not found 問題が解決された
-
Android自動テストフレームワーク Robotium