Android P非SDKインタフェース制限

7295 ワード

先頭に書く
Android Pie(API 28)は、非SDKインタフェースの使用開始を制限し始めた.参照非SDKインタフェースを適用するか、反射またはJNIを使用してハンドルを取得しようとすると制限されます.これらの制限は、ユーザの体験と開発者の体験を向上させ、アプリケーションのクラッシュのリスクを低減するとともに、開発者の緊急発行のリスクを低減することを目的とする.
公式サイトは非SDKインタフェースの制限に対する解釈
SDKインタフェースと非SDKインタフェース
SDKインタフェースとは、Androidフレームワークのパッケージインデックスに記録するインタフェースである、非SDKとは、Androidフレームワークのパッケージに含まれないインタフェースである.SDKに列挙されていない方法と属性を取得するために反射を使用すると制限されます.
非SDKインタフェースの使用の影響
互換性保証なし:
  • 非SDKインタフェースは、将来的には、
  • さえ消える可能性がある.
  • は、異なるデバイスにおいて
  • と互換性がない場合がある.
  • 互換性の問題は、実行時になってから
  • が検出される場合があります.
    暗黙的な保護を回避するには、次の手順に従います.
  • ユーザー体験に影響する
  • は、ユーザの暗黙的な
  • を妨げる.
  • Google Play Protectからマルウェアと判定された
  • 非SDKインタフェース分類
    非SDKは全部で3種類に分けられ、ブラックリスト、グレーリスト、ホワイトリストで、その中のグレーリストはまた浅いグレーリストと深いグレーリストに分けられた.(非制限グレーリストの非SDKインタフェースを浅いグレーリストと呼び、制限グレーリストの非SDKインタフェースを深いグレーリストと呼ぶ)
  • ブラックリスト(Blacklist):Androidシステムまたはシステムアプリケーションでのみ使用可能であり、targetSdkValersonのバージョンにかかわらず使用禁止である.開発者がこれらのインタフェースを使用することを禁止することを意味する.
  • グレーリスト(Dark GreylistおよびLight Greylist):ダークグレーブラックリストは、ユーザのtargetSdkVarsionがP(API 28)より小さい場合に使用することができ、P以上の場合には使用できない.薄い灰色のブラックリストは現在もアプリケーションが使用している非SDKインタフェースであり、Googleは後期にこのようなSDKインタフェースの提供を検討する.現在も正常に使用できる.しかしtargetSdkValersonがP以上である場合、システムは警告を投げ出す.
  • ホワイトリスト(Whitelist):このリストのインタフェースはAndroidフレームワークパッケージインデックスに正式に記録されています.Android公開SDKインタフェース自体です.サポートされているインタフェースで、アクセス制限はありません.自由に使用できます.

  • 本物のリストはシステムのコンパイル時に生成され、直接dexファイルの関連フィールドと方法にアクセスフラグを符号化し、システムには個別のリストファイルが存在せず、実行時に効率的に非SDKインタフェースが使用されているかどうかを検査する.
    制限された非SDKインタフェースへのアクセス時に発生する可能性のある予想される動作
    アクセス方法
    結果
    Dalvik命令はフィールドを参照します
    NoSuchFieldErrorを投げ出す
    Dalvik命令はメソッドを参照します
    NoSuchMethodErrorを投げ出す
    Classを通るgetDeplaredField()またはClass.getField()による反射
    NoSuchFieldExceptionを投げ出す
    Classを通るgetDeclaredMethod()、Class.getMethod()による反射
    NoSuchMethodExceptionを投げ出す
    Classを通るgetDeclaredFields()、Class.getFields()による反射
    結果にSDK以外のメンバーは取得されませんでした
    Classを通るgetDeclaredMethods()、Class.getMethods()による反射
    結果にSDK以外のメンバーは取得されませんでした
    env->GetFieldID()によるJNI呼び出し
    NULLを返し、NoSuchFieldErrorを放出
    env->GetMethodID()によるJNI呼び出し
    NULLを返し、NoSuchMethodErrorを投げ出す
    アプリケーションが非SDKインタフェースを使用しているかどうかをテストします.
  • デバッグ可能なアプリケーションを使用してテストするには、Android 9(APIレベル28)以降のデバイスまたはシミュレータ上でデバッグ可能なアプリケーションを構築して実行することで、非SDKインタフェースを使用するかどうかをテストできます.使用するデバイスまたはシミュレータが、適用するターゲットAPIレベルと一致していることを確認してください.アプリケーションでテストを実行すると、一部の非SDKインタフェースにアクセスすると、ログ・メッセージが出力されます.アプリケーションのログ・メッセージを確認して、実行中のアプリケーションのPIDの下に表示されるadb logcatを使用してログ・メッセージを表示できます.

  • Accessing hidden field Landroid/os/Message;->flags:I(light greylist,JNI)//は、JNIメソッドを使用してlight greylistの非SDKインタフェースにアクセスしたことを示します
  • StrictMode API(厳しいモード)を使用してテストすることもできます.また、StrictMode APIを使用して、アプリケーションが非SDKインタフェースを使用するかどうかをテストすることもできます.このAPIを有効にするには、detectNonSdkApiUsageメソッドを使用します.StrictMode APIを有効にすると、penaltyListenerを使用して非SDKインタフェースを使用するたびの動作に対応するコールバックを受信でき、カスタム処理を実行できます.コールバックで提供されるViolationオブジェクトはThrowableから派生し、クローズドスタックトラックは対応する動作を使用するコンテキストを提供します.

  • 非SDKインタフェースの呼び出し時に警告を投げ出すには、detectNonSdkApiUsage()メソッドを使用する.permitNonSdkApiUsage()メソッドを使用して、StrictModeがこれらの呼び出しに警告を投げ出すことを阻止する.
    StrictModeは簡単に使用できます.
    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                     .detectCustomSlowCalls() //API  11,  StrictMode.noteSlowCode
                     .detectDiskReads()
                     .detectDiskWrites()
                     .detectNetwork()   // or .detectAll() for all detectable problems
                     .penaltyDialog() //         
                     .penaltyLog() // Logcat          
                     .penaltyFlashScreen() //API  11
                     .build())
             StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                     .detectLeakedSqlLiteObjects()
                     .detectLeakedClosableObjects() //API  11
                     .penaltyLog()
                     .penaltyDeath()
                     .build())
    
  • veridexツールを使用してテストすると、APKで静的解析ツールveridexを実行することもできます.veridexツールは、APKのすべてのサードパーティ製ライブラリを含むコードライブラリ全体をスキャンし、非SDKインタフェースを使用して発見されたすべての動作をレポートします.veridexツールには、JNIによって実装された呼び出しを検出できないという限界があります.反射によって実装された呼び出しの一部しか検出できません.非アクティブコードパスの分析は、APIレベルのチェックに限られます.

  • 最後に
    Android Pを迂回して非SDKに対する制限方法Android Pが非SDKインタフェースにアクセスするのは実は方法が簡単で、Androidの反射プロセスに干渉して非SDK判断の戻りを修正することにほかならない.あるいは、このような制限を回避するためにサードパーティ製のライブラリを用いる.FreeReflection