【发布时间】: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