【问题标题】:Prepare Android App for Previous SDK Versions为以前的 SDK 版本准备 Android 应用
【发布时间】:2019-08-20 18:49:20
【问题描述】:

我已经使用 Android Studio 构建了一个 Android 应用,并且我一直在使用运行 Android 版本 5.1.1 (API 22) 的平板电脑进行测试。开发完成后,我尝试使用 APK 将相同的应用程序安装到运行 Android 8.0.0 (API 26) 的 S7 上。该应用程序在 S7 上运行时崩溃,但在平板电脑上运行完美。我构建的应用的目标 SDK 版本是 API 29,最低 SDK 版本是 API 22。

我可以将编译 SDK 版本从 29 更改为 28,并且我没有收到任何构建错误。但是,将其更改为 27 会给我以下错误:

Execution failed for task ':app:processDebugResources'.
> Android resource linking failed
  C:\Users\xxxxx\.gradle\caches\transforms-2\files-2.1\9073307f5eb1fdd8dc5b08ac4a3a252e\res\values-v28\values-v28.xml:9:5-12:13: AAPT: error: resource android:attr/dialogCornerRadius not found.

  C:\Users\xxxxx\Desktop\appDev\app_green\myApp\app\build\intermediates\incremental\mergeDebugResources\merged.dir\values-v28\values-v28.xml:11: AAPT: error: resource android:attr/dialogCornerRadius not found.

  C:\Users\xxxxx\.gradle\caches\transforms-2\files-2.1\11ac981ad78c9fd8730f98006e1b2a23\res\values\values.xml:89:5-125:25: AAPT: error: resource android:attr/fontVariationSettings not found.

  C:\Users\xxxxx\.gradle\caches\transforms-2\files-2.1\11ac981ad78c9fd8730f98006e1b2a23\res\values\values.xml:89:5-125:25: AAPT: error: resource android:attr/ttcIndex not found.

  error: failed linking references.

我认为,如果我逐级降低 API 级别并修复任何弹出的错误,我最终会得到一个可以在所有所需 API 上运行的应用程序。这是一个正确的假设吗?

如何修复此类无法链接 Gradle 资源的错误?这似乎是我用来获取用户输入的对话框的错误。

我发现这些错误的所有解决方案都是“更改 API 版本”,但如果我需要这个 API 版本怎么办?

编辑: 应那些试图帮助我解决这个问题的人的要求,我发布了 S7 的崩溃日志。

Process: com.myApp, PID: 15167
    android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/myApp/files/export_a_c.csv exposed beyond app through ClipData.Item.getUri()
        at android.os.StrictMode.onFileUriExposed(StrictMode.java:1958)
        at android.net.Uri.checkFileUriExposed(Uri.java:2356)
        at android.content.ClipData.prepareToLeaveProcess(ClipData.java:944)
        at android.content.Intent.prepareToLeaveProcess(Intent.java:10480)
        at android.content.Intent.prepareToLeaveProcess(Intent.java:10486)
        at android.content.Intent.prepareToLeaveProcess(Intent.java:10465)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1616)
        at android.app.Activity.startActivityForResult(Activity.java:4564)
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:767)
        at android.app.Activity.startActivityForResult(Activity.java:4522)
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:754)
        at com.example.myApp.SecondActivity$onCreate$3$3.onClick(SecondActivity.kt:218)
        at android.view.View.performClick(View.java:6897)
        at android.widget.TextView.performClick(TextView.java:12693)
        at android.view.View$PerformClick.run(View.java:26101)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6944)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

当我尝试创建/写入 csv 文件时发生错误。目的是自动创建此文件,然后提示用户通过电子邮件共享它。

编辑 2: 所以我已经修复了在 S7 上运行时的崩溃问题。如何确保应用程序将针对每个 API 运行?我必须将我的 S7 软件降级为我想要测试的 API 吗?

【问题讨论】:

  • 您不应该更改 sdk 版本。相反,检查它为什么会崩溃并采取相应的行动。在此处添加来自 logcat 的崩溃日志。
  • 这将使它适用于 API 26,但我没有想要支持每个版本的 Android 的设备。那么如何确保它适用于所有这些 API?
  • 如果您的应用在旧版本上运行,它将在新版本上运行。在极少数情况下,某些事情将不起作用。在此处添加崩溃日志,以便所有人查看。
  • 在尝试共享文件之前添加“val openFilePolicy = StrictMode.VmPolicy.Builder()”和“StrictMode.setVmPolicy(openFilePolicy.build())”修复了崩溃

标签: android android-studio gradle sdk


【解决方案1】:

您需要在应用程序中设置文件提供程序。 https://developer.android.com/training/secure-file-sharing/setup-sharing

【讨论】:

  • 在尝试访问文件之前添加“val openFilePolicy = StrictMode.VmPolicy.Builder()”和“StrictMode.setVmPolicy(openFilePolicy.build())”也可以
  • @AlexMarks 您无法将启用的 StrictMode 部署到生产环境。
  • 不能或不应该?
  • 技术上你可以,但实际上它是开发期间的开发工具。默认情况下它是禁用的,需要用户设备启用它才能在开发设置中获得任何好处。
【解决方案2】:

从清单和 build.gradle 中删除 compile.sdk 的声明。 您应该只保留最小和构建 SDK 版本声明。

【讨论】:

  • 我不会更改清单中的任何内容。我在清单中只有最小、最大和目标 SDK 版本。我正在更改应用模块属性,以便 Android Studio 使用 API 27 来构建项目。
  • 如果您声明 max SDK 将默认用于编译。你改变这个的原因是什么?
  • 我解释了为什么我要在问题中更改我的编译 SDK。我有一个我开发的应用程序适用于 API 22,但不适用于 API 26。所以我想使用编译器尝试查找错误,但这不是语法问题。我已经在上面发布了我的崩溃日志
猜你喜欢
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多