1. ホーム
  2. アンドロイド

android 9.0以降のhideメソッドの反映制限の解析について

2022-02-26 07:07:43

同僚と食事をしたときに、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 にあります。

ソースコードがなければ、直接ウェブで見ることができます

https://android.googlesource.com/platform/prebuilts/runtime/+/master/appcompat/hiddenapi-blacklist.txt

ブラックリストの中核となる考え方は、一部のシステム情報とセキュリティのためのインターフェイスを制限することであり、カスタム Views で使用されるリフレクションなどの他の側面は、ブラックリストについて心配する必要はありません。

良心的なアプリのプログラマーは、ブラックリストを気にする必要はない。