Доступ к скрытому методу logcat предупреждений и ограничений на интерфейсы не SDK - PullRequest
0 голосов
/ 07 октября 2018

Я читал в документации для 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. Возможно ли, что я использую интерфейсы NON-SDK (см. AОбработка скрытых методов (светлый серый список, отражение), которые сломают мое приложение в будущих версиях платформы?
  3. Как это можно исправить?

1 Ответ

0 голосов
/ 07 октября 2018

Серый список не SDK-интерфейсов означает методы и поля, которые продолжают функционировать в Android 9, но к которым Google не гарантирует доступ в будущих версиях платформы.Если есть причина, по которой вы не можете реализовать альтернативную стратегию для серого списка API, вы можете отправить сообщение об ошибке с просьбой пересмотреть ограничение.

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

...