web-dev-qa-db-fra.com

Accès aux avertissements et restrictions logcat de méthode masquée sur les interfaces non SDK

J'ai lu dans Android docs sur "Restrictions sur les interfaces non SDK":

Ces restrictions sont appliquées chaque fois qu'une application fait référence à une interface non SDK ou tente d'obtenir son handle en utilisant la réflexion ou JNI ... La gestion des interfaces non SDK est un détail d'implémentation que l'API résume; il est susceptible de changer sans préavis ... Les interfaces non SDK grisées contiennent des méthodes et des champs qui continuent de fonctionner dans Android 9, mais auxquels nous ne garantissons pas l'accès dans les futures versions de la plate-forme ... Vous pouvez utiliser adb logcat pour accéder à ces messages de journal, qui apparaissent sous le PID de l'application en cours d'exécution ...

Voici les parties pertinentes de mon code fonctionnant sur un émulateur 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());        
}

J'ai trouvé ça avec

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

ma sortie Logcat est:

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)

si je désactive en commentant

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

l'accès au logcat caché disparaît.

Comme avant la sortie Logcat:

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

si je désactive en commentant

//loadRewardedVideoAd();

l'accès au logcat caché disparaît.

Comme vous pouvez voir le code:

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

causé beaucoup d'accès à logcat caché.

Mes questions sont:

  1. Ce sont un problème de l'émulateur?
  2. Est-il possible que j'utilise des interfaces NON-SDK (voir Accès aux méthodes cachées, liste grise claire, réflexion) qui briseront mon application dans les futures versions de la plateforme?
  3. Comment résoudre ce problème?
3
Kostas Trakos

Les interfaces non SDK grisées signifient des méthodes et des champs qui continuent de fonctionner dans Android 9, mais auxquels google ne garantit pas l'accès dans les futures versions de la plateforme. S'il y a une raison pour laquelle vous ne pouvez pas mettre en œuvre une stratégie alternative à une API grisée, vous pouvez déposer un bogue pour demander le réexamen de la restriction.

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

1
Ramesh Yankati