web-dev-qa-db-ja.com

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

私は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. これをどのように修正できますか?
3
Kostas Trakos

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

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

1
Ramesh Yankati