非表示メソッドへのアクセス logcat 警告と非 SDK インターフェースの制限 質問する

非表示メソッドへのアクセス logcat 警告と非 SDK インターフェースの制限 質問する

Android ドキュメントで「非 SDK インターフェースの制限」について読みました。

これらの制限は、アプリが非 SDK インターフェースを参照するか、リフレクションまたは JNI を使用してそのハンドルを取得しようとするたびに適用されます... 非 SDK インターフェースの処理は、API によって抽象化される実装の詳細であり、予告なく変更される可能性があります... グレーリストに登録された非 SDK インターフェースには、Android 9 でも引き続き機能するメソッドとフィールドが含まれますが、プラットフォームの将来のバージョンではアクセスが保証されません... adb logcat を使用して、実行中のアプリの PID の下に表示されるこれらのログ メッセージにアクセスできます...

以下は、API 28 エミュレーターで実行されているコードの関連部分です。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 

           ................       

    MobileAds.initialize(this,  "ca-app-pub-3940256099942544~3347511713");

           ................

    adView = new AdView(this);

    adView.setAdUnitId("ca-app-pub-3940256099942544/6300978111");
    adView.setAdSize(AdSize.BANNER);
    adView.setBackgroundColor(Color.TRANSPARENT);
    adView.setVisibility(View.GONE);            
    adView.loadAd(adBuilder());

           ................

    interstitial = new InterstitialAd(GLGame.this);            
    interstitial.setAdUnitId("ca-app-pub-3940256099942544/1033173712");
    interstitial.loadAd(adBuilder());        

    mRewardedVideoAd = MobileAds.getRewardedVideoAdInstance(this);
    mRewardedVideoAd.setRewardedVideoAdListener(this);        
    loadRewardedVideoAd();        
}

AdRequest adBuilder() {
    return new AdRequest.Builder().build();
}
public void loadRewardedVideoAd() {        
    mRewardedVideoAd.loadAd("ca-app-pub-3940256099942544/5224354917", new AdRequest.Builder().build());        
}

私はそれを見つけました

MobileAds.initialize(this,  "ca-app-pub-3940256099942544~3347511713");
adView.loadAd(adBuilder());
interstitial.loadAd(adBuilder());

私のLogcat出力は次のとおりです:

W: Accessing hidden method Landroid/view/textclassifier/logging/SmartSelectionEventTracker;-><init>(Landroid/content/Context;I)V (light greylist, reflection)
W: Accessing hidden method Landroid/view/textclassifier/logging/SmartSelectionEventTracker;->logEvent(Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;)V (light greylist, reflection)
W: Accessing hidden method Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionStarted(I)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent; (light greylist, reflection)
W: Accessing hidden method Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionModified(II)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent; (light greylist, reflection)
W: Accessing hidden method Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionModified(IILandroid/view/textclassifier/TextClassification;)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent; (light greylist, reflection)
W: Accessing hidden method Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionModified(IILandroid/view/textclassifier/TextSelection;)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent; (light greylist, reflection)
W: Accessing hidden method Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionAction(III)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent; (light greylist, reflection)
W: Accessing hidden method Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionAction(IIILandroid/view/textclassifier/TextClassification;)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent; (light greylist, reflection)

コメントで無効にした場合

//MobileAds.initialize(this,  "ca-app-pub-3940256099942544~3347511713");
//adView.loadAd(adBuilder());
//interstitial.loadAd(adBuilder());

非表示の logcat へのアクセスがなくなります。

以前と同じように、Logcat 出力を取得しました:

W: Accessing hidden method Landroid/media/AudioTrack;->getLatency()I (light greylist, reflection)

コメントで無効にした場合

//loadRewardedVideoAd();

非表示の logcat へのアクセスがなくなります。

ご覧のとおり、コードは次のようになります。

MobileAds.initialize(this,  "ca-app-pub-3940256099942544~3347511713");
adView.loadAd(adBuilder());
interstitial.loadAd(adBuilder());
loadRewardedVideoAd();

隠し logcat へのアクセスが多数発生しました。

私の質問は次のとおりです:

  1. これらはエミュレータの問題ですか?
  2. プラットフォームの将来のバージョンでアプリが動作しなくなるような非 SDK インターフェース (非表示メソッド、ライト グレーリスト、リフレクションへのアクセスを参照) を使用する可能性はありますか?
  3. これをどうすれば修正できますか?

ベストアンサー1

グレーリストに登録された非 SDK インターフェースとは、Android 9 では引き続き機能しますが、Google がプラットフォームの将来のバージョンでのアクセスを保証していないメソッドとフィールドを指します。グレーリストに登録された API に代わる戦略を実装できない理由がある場合は、バグを報告して制限の再検討をリクエストできます。

https://issuetracker.google.com/issues/new?component=328403&template=1027267

おすすめ記事