当从已安装的 APK 运行该应用程序时,我遇到了问题,但当直接从 Android studio 运行该应用程序时,该应用程序运行良好。在物理设备和模拟器上进行了测试,并且还使用构建模式调试、配置文件和发布(其中发布和配置文件模式当然仅适用于物理设备)
概括:
a) 共享首选项、路径提供程序和权限处理程序生成MissingPluginException
。
b) Android 后退按钮不起作用。
这些可能是单独的问题,但我强烈怀疑它们是相关的,因为只有当应用程序从不是直接从 Android Studio 安装的 APK 启动时才会发生。
需要非常明确的是,如果我从 Android Studio 中“安装”应用程序,即使没有连接 AS,我也可以继续使用该应用程序。但是,当我构建 APK、手动安装它并尝试运行该应用程序时,我会遇到由上述错误引起的各种症状。如果我随后通过 Android Studio 连接 Logcat,问题将持续存在,直到我使用 AS 安装新版本。
更多细节:
- 在发布模式的 APK 构建过程中,gradle 抱怨缺少“libs.jar”文件,例如:
Execution failed for task ':app:lintVitalQaRelease'.
> Could not resolve all artifacts for configuration ':app:devProfileRuntimeClasspath'.
> Failed to transform libs.jar to match attributes {artifactType=processed-jar, org.gradle.libraryelements=jar, org.gradle.usage=java-runtime}.
> Execution failed for JetifyTransform: /home/johan/AndroidStudioProjects/teacher_app/build/app/intermediates/flutter/devProfile/libs.jar.
> Transform's input file does not exist: /home/johan/AndroidStudioProjects/teacher_app/build/app/intermediates/flutter/devProfile/libs.jar. (See https://issuetracker.google.com/issues/158753935)
搜索上述问题的解决方案会出现几个记录在案的案例,但它们通常没有风味,因此:app:lintVitalRelease
代替:app:lintVitalQaRelease
正如我所得到的。此外,错误将显示缺少的中间体为.../flutter/Profile/libs.jar
在报道的情况下,同样没有口味。
就我而言,额外的Qa
and dev
分别是两种不同的口味。在其他情况下,解决方法是“构建调试和配置文件模式 apk 来解决问题”,在我的情况下,解决方法是“构建调试和配置文件并为所有其他版本发布 APK,而不仅仅是您正在尝试的版本”来建造”。
因此,我在尝试构建风味“Qa”模式“发布”和它抱怨的任何一种之间切换,一遍又一遍,直到它满意并生成 APK。必须构建一堆不相关的风格和模式很烦人,但至少这是一个让我获得 APK 的解决方法。
此后,我可以安装和取消 APK,但出现问题。 logcat 显示发生了一些 MissingPlugin 异常:
MissingPluginException(No implementation found for method getApplicationDocumentsDirectory on channel plugins.flutter.io/path_provider)
and....
MissingPluginException(No implementation found for method getAll on channel plugins.flutter.io/shared_preferences)
最后:
在调查这一切时,我尝试了来自的权限处理程序示例https://pub.dev/packages/permission_handler/example。我刚刚将其作为新的“页面”添加到我的应用程序中。导航到此页面时,我遇到另一个异常:
MissingPluginException(No implementation found for method checkPermissionStatus on channel flutter.baseflow.com/permissions/methods)
应用程序中与这些插件相关的许多功能都无法正常工作 - 照片不显示,用户需要在每次重新启动时进行身份验证,等等。这些显然依赖于上述插件。
我尝试将 WRITE_EXTERNAL_STORAGE 添加到 AndroidManifest 中,甚至将其添加到每种风格的单独清单中。 (我通常只将共享配置添加到主 AndroidManifest.xml 中)
我已经实现了发布模式签名,以防 Android 不喜欢向未签名的 APK 授予权限。
编辑:
为了消除导致问题的应用程序 ID,我已将所有实例更改回创建项目时使用的原始包名称。这意味着我的设备上一次只能安装一种风格。然而,这没有任何区别。
显然我已经做过很多次 flutter-clean 和 flutter-get 了,每次都迫使我一一经历构建所有缺失的中间体的过程。
另一件事... Android 的后退按钮不起作用。如果我直接从 Android Studio 运行应用程序,它可以正常工作,但如果仅从 APK 运行它,则不起作用(似乎被忽略)。
我对此无计可施。
编辑#2:进展!
我创建了一个新项目并复制了源代码(lib/*)。我还复制了 pubspec.yaml 和资产。我没有对 build.gradle 文件进行任何更改,只对主 AndroidManifest.xml 进行了两处更改 - 应用程序名称并添加了 Internet 权限。
我还设置了应用程序图标。
复制源代码是一项艰巨的工作——有很多很多导入,但最终结果是一个有效的构建。
SharedPrefs 在重启后仍然存在
显示下载的图像
Android后退按钮工作原理
设备存储权限显示为已授予
首次从应用程序内打开相机时会请求许可。
该应用程序可以将用户发送到 Android 应用程序设置屏幕。
一切似乎都有效。我可能在某个地方犯了一个错误,因为新应用程序在主屏幕上显示了正确的应用程序图标,但在应用程序的 Android 设置页面中显示了 Flutter 默认图标。
接下来的步骤是对 APK 进行签名,然后重新引入风格,即使只是能够设置 dart 目标,但也希望能够设置其他属性。