Java 访问非SDK接口上的隐藏方法logcat警告和限制

Java 访问非SDK接口上的隐藏方法logcat警告和限制,java,android,android-9.0-pie,Java,Android,Android 9.0 Pie,我在Android文档中读到了“非SDK接口的限制”: 每当应用程序引用非SDK时,就会应用这些限制 接口或尝试使用反射或JNI获取其句柄。。。 非SDK接口的处理是 API抽象化了;如有更改,恕不另行通知。。。 Greylisted非SDK接口包含 继续在Android 9中运行,但我们不能保证 在平台的未来版本中访问。。。您可以使用adb logcat 访问这些日志消息,这些消息显示在运行 应用程序 以下是我在API 28仿真器上运行的代码的相关部分: public void onCreat

我在Android文档中读到了“非SDK接口的限制”:

每当应用程序引用非SDK时,就会应用这些限制 接口或尝试使用反射或JNI获取其句柄。。。 非SDK接口的处理是 API抽象化了;如有更改,恕不另行通知。。。 Greylisted非SDK接口包含 继续在Android 9中运行,但我们不能保证 在平台的未来版本中访问。。。您可以使用adb logcat 访问这些日志消息,这些消息显示在运行 应用程序

以下是我在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)
隐藏的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

我的问题是:

  • 这是仿真器的问题吗
  • 我是否可能使用非SDK接口(请参阅访问隐藏方法、light greylist、reflection) 这将破坏我的应用程序在未来版本的平台
  • 如何解决这个问题

  • Greylisted非SDK接口是指在Android 9中继续运行的方法和字段,但google不保证在未来版本的平台中访问这些方法和字段。如果由于某种原因,您无法实现greylisted API的替代策略,那么您可能会提交一个bug,请求重新考虑该限制


    看起来无论您使用的是什么移动广告库都在这样做。这是一个风险,这意味着如果新版本的android破坏了这个库,你需要保持该库的更新。看看它实际上在做什么——看起来他们正试图通过反射来使用Android9的功能,这些功能在之前可能已经存在。这是相当安全的。他们正在做的是试图操纵文本分类子系统来更改上下文操作栏中显示的内容(如复制、粘贴等)。Hello@Gabe,我使用:
    implementation'com.google.android.gms:play services ads:9.8.0'
    和其他一些google play服务。如果我更新到当前的16.0.0,我可以毫无问题地构建和运行,除了得到71个lint不推荐的API使用警告,但访问隐藏的logcat与google play services保持相同:9.8.0您能告诉我,如果我更新到GooglePlayServices:16.0.0并替换不推荐的API用法71警告,这个问题将得到解决?我不会担心警告。就像我说的-看起来这个功能在Android 9之前就已经存在了,在Android 9中公开了,但是他们正在尝试在一些旧版本中使用它。这是一种安全的用法。当安卓9.1或10问世时,你应该仔细检查它们是否出现故障,但我认为这是不可能的。当安卓9.1或10问世时,如果它们出现故障,哪些步骤可以修复?
    MobileAds.initialize(this,  "ca-app-pub-3940256099942544~3347511713");
    adView.loadAd(adBuilder());
    interstitial.loadAd(adBuilder());
    loadRewardedVideoAd();