【问题标题】:Unsupported API warnings in Google Play StoreGoogle Play 商店中不支持的 API 警告
【发布时间】:2019-09-28 23:44:29
【问题描述】:

我在 Google Play 的发布前测试报告中收到以下警告。

我不知道如何纠正这些问题。感谢任何帮助或建议我在这里遇到了很多问题:

Android compatibility
 We’ve detected that your app is using unsupported APIs. Tests may not have found all unsupported APIs. Learn more
 
 Unsupported
  12 warnings identified
 The following APIs are greylisted and Google can’t guarantee that they will work on existing versions of Android. Some may be already be restricted for your target SDK
 
 
 API Ljava/lang/invoke/MethodHandles$Lookup;-><init>(Ljava/lang/Class;I)V
 11 occurrences identified. Only unique stack traces are shown.
  
 API Landroid/content/Context;->bindServiceAsUser(Landroid/content/Intent;Landroid/content/ServiceConnection;ILandroid/os/Handler;Landroid/os/UserHandle;)Z
 1 occurrence identified
  
 API Landroid/media/AudioSystem;->getPrimaryOutputFrameCount()I
 1 occurrence identified
  
 API Landroid/media/AudioSystem;->getPrimaryOutputSamplingRate()I
 1 occurrence identified
  
 API Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionAction(III)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;
 1 occurrence identified
  
 API Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionAction(IIILandroid/view/textclassifier/TextClassification;)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;
 1 occurrence identified
  
 API Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionModified(II)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;
 1 occurrence identified
  
 API Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionModified(IILandroid/view/textclassifier/TextClassification;)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;
 1 occurrence identified
  
 API Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionModified(IILandroid/view/textclassifier/TextSelection;)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;
 1 occurrence identified
  
 API Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionStarted(I)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;
 1 occurrence identified
  
 API Landroid/view/textclassifier/logging/SmartSelectionEventTracker;-><init>(Landroid/content/Context;I)V
 1 occurrence identified
  
 API Landroid/view/textclassifier/logging/SmartSelectionEventTracker;->logEvent(Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;)V
 1 occurrence identified

【问题讨论】:

  • 我遇到了同样的问题,也不知道如何在我的代码中找到这些不受支持的调用。我已经在我的app/src/main/java/* 目录中搜索了来自错误的各种文本 sn-ps,但在我的源代码中根本找不到任何东西。如何追踪这些以纠正它们?
  • 我有同样的问题,但所有此类 API 调用都在添加为我的 apk 依赖项的库中。奇怪的是它们都来自 Google - Google Play Games 和 Firebase:\
  • 我也有同样的问题,而且我的应用程序是 99% C++,所以我想所有的警告都来自我通过 gradle 支持的 Google API。
  • 有没有人想出这些来自谷歌礼仪的地方。我也有同样的情况,并且正在使用任何 3rd 方 API 调用。

标签: android unity3d


【解决方案1】:

这些警告是指使用受限的非 SDK 接口。 https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces

这些调用可能会导致错误行为或应用崩溃。建议避免使用它们。所有用途都属于黑名单、灰名单或白名单。如果您无法摆脱这些用法,请检查从属关系以列出。只有列入黑名单的呼叫才会导致崩溃。另外,提醒一下,Android Q (targetSDK=29) 已更新黑名单 https://developer.android.com/preview/non-sdk-q

【讨论】:

  • 我在 Google Developers 的页面上找到了这个确切的信息,但它并不能真正帮助 OP 或我自己以及像我们这样努力寻找这些调用的位置的其他人。我们知道不应进行调用,但如果我们无法在代码中找到调用,我们甚至无法着手解决如何更正它们。
  • 关于信息,我正在使用 Android Studio,并且在构建或调试期间通过 Long 没有收到任何警告。我只在开发者的控制台发布前报告中看到这些错误。
  • 我的 2 个应用程序中有 23 个此类问题,所有这些问题都源自谷歌的 androidx 库,例如 ViewUtils 和诸如此类。谈论讽刺
  • 我有一些警告。一个是Landroid/widget/PopupWindow;-&gt;setTouchModal,看起来像Google one
  • 我的 Alpha 版发布前发布报告中也有类似的警告。我想知道这样的警告一旦升级到生产环境,是否会导致您的应用被拒绝?
【解决方案2】:

我遇到了类似的问题,我通过在 MainActivity 的 onCreate() 中添加以下代码获得了 NonSdkApiUsedViolation 日志,它为我提供了导致它的 API 调用的精确位置。

if (BuildConfig.BUILD_TYPE.contentEquals("debug")) {
    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy
        .Builder()
        .detectAll()             // Checks for all violations
        .penaltyLog()            // Output violations via logging
        .build()
    );

    StrictMode.setVmPolicy(new StrictMode.VmPolicy
        .Builder()
        .detectNonSdkApiUsage()  // Detect private API usage
        .penaltyLog()            // Output violations via logging
        .build()
    );
}

在运行您的应用程序时,如果任何代码的执行触发了 StrictMode 违规,您应该会在日志输出中看到一个堆栈跟踪,指出是什么触发了它:

D/StrictMode: StrictMode policy violation; ~duration=28 ms: android.os.strictmode.DiskReadViolation
  at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1596)
  ...

在手动测试您的应用程序后,在您的日志输出中搜索StrictMode 应该可以帮助您轻松找到这些内容。

Google's documentation on StrictMode 还提供了一些额外的指导:

如果您发现您认为有问题的违规行为,有多种工具可以帮助解决它们:线程、处理程序、AsyncTask、IntentService 等。但不要觉得有必要修复 StrictMode 发现的所有问题。特别是,在正常的活动生命周期中,许多磁盘访问情况通常是必要的。使用 StrictMode 查找您不小心做的事情。不过,UI 线程上的网络请求几乎总是一个问题。

【讨论】:

  • 我不明白,结果中的一个 APK 在启动前出现 0 个错误,12 小时后重新发布(我只更改了一个图像的同一个 apk)现在返回 9 个非 SDK 接口错误。 ..嗯。此外,游戏控制台上的日志报告并没有提供任何方法来检测应该替换什么和谁以及用什么......他们还有一个工具可以清楚地表明我应该改变什么吗?
  • 赞成,因为这可以帮助您找到代码中的问题所在,即使它是通过第三方库调用的。
  • 请原谅我的幼稚,但这究竟有什么帮助?如果我将上述内容添加到我的代码中,是否有可以检查的日志或者还有其他内容?
【解决方案3】:

如果您使用的是 Xamarin,我相信相当于 Kailash 的回答是:

#if DEBUG
    StrictMode.SetThreadPolicy(
        new StrictMode.ThreadPolicy.Builder()
            .DetectAll()
            .PenaltyLog()
            .Build());

    StrictMode.SetVmPolicy(
       new StrictMode.VmPolicy.Builder()
            .DetectNonSdkApiUsage()
            .PenaltyLog()
            .Build());
#endif // DEBUG

【讨论】:

    猜你喜欢
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多