从已安装的APK运行应用程序时出现问题,但直接从Android Studio运行时,该应用程序运行良好。已在物理设备和仿真器上进行了测试,并且具有调试,配置文件和发布的构建模式(其中发布和配置文件模式仅在物理设备上有效)
摘要:
a)共享首选项,路径提供者和权限处理程序会产生一个MissingPluginException
。
b)Android后退按钮不起作用。
这些可能是单独的问题,但是我强烈怀疑它们之间存在关联,因为这两个问题仅在从不直接从Android Studio直接安装的APK启动应用程序时才会发生。
非常清楚-如果我从Android Studio中“安装”该应用程序,那么即使没有连接AS也可以继续使用该应用程序。但是,当我构建一个APK时,请手动安装它,并尝试运行该应用程序时,我会遇到由上述错误引起的各种症状。如果随后我通过Android Studio连接Logcat,则问题将一直存在,直到我使用AS安装新版本为止。
更多详细信息:
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
和dev
是两种不同的口味。在其他情况下,解决方法是“构建调试和配置文件模式apk以解决该问题”,而在我的情况下,解决方法是“构建调试和配置文件并发布所有其他版本的APK,而不仅仅是您尝试的版本建立”。
因此,我在尝试建立风味“ Qa”模式“发布”与它抱怨的那个对象之间反复切换,直到满意并生成APK。必须构建一堆不相关的样式和模式很烦人,但至少是一种可以让我获得APK的解决方法。
此后,我可以安装APK并取消安装,但是出现了问题。 logcat显示发生了一些MissingPlugin异常:
MissingPluginException(No implementation found for method getApplicationDocumentsDirectory on channel plugins.flutter.io/path_provider)
和....
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权限,我已经实现了发布模式的签名。
编辑: 为了消除造成问题的原因,我将所有实例改回了创建项目时使用的原始包名称。这意味着一次只能在我的设备上安装一种口味。但是,它没有任何区别。
很明显,我已经完成了多次清理工作,每次都迫使我经历一个接一个地构建所有缺失的中间体的过程。
另一件事... Android后退按钮不起作用。如果我直接从Android Studio运行该应用程序,则效果很好,但仅从APK运行该应用程序却无法正常工作(似乎被忽略了)。
我为此感到惊讶。
编辑2:进度!
我创建了一个新项目,并复制了源代码(lib / *)。我还复制了pubspec.yaml和资产。我没有对build.gradle文件进行任何更改,仅对主AndroidManifest.xml进行了两项更改-应用程序名称并添加了Internet权限。
我也设置了应用程序图标。
复制源非常麻烦-导入很多很多,但最终结果是有效的构建。
SharedPrefs在重启后仍然存在 显示下载的图像 Android后退按钮有效 存储设备权限显示为已授予 从应用程序内打开相机会在第一次请求权限。 该应用可以将用户转到Android应用设置屏幕。
一切似乎都可行。我可能在某个地方犯了一个错误,因为新应用在主屏幕上显示了正确的应用图标,但在该应用的Android设置页面中显示了Flutter默认图标。
下一步是对APK进行签名,然后重新引入口味,即使只是为了设置飞镖目标,也希望可以设置其他属性。
答案 0 :(得分:1)
我遇到了这个确切的问题。我用几种不同的方法解决了这个问题:
#Flutter Wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.** { *; }
-keep class io.flutter.util.** { *; }
-keep class io.flutter.view.** { *; }
-keep class io.flutter.** { *; }
-keep class io.flutter.plugins.** { *; }
-keep class androidx.lifecycle.** { *; } #https://github.com/flutter/flutter/issues/58479
#https://medium.com/@swav.kulinski/flutter-and-android-obfuscation-8768ac544421
buildTypes {
release {
profile {
matchingFallbacks = ['debug', 'release']
}
minifyEnabled true
useProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
lintOptions {
disable 'InvalidPackage'
checkReleaseBuilds false
}
flutter channel master
我还通过导航到SDK管理器-> SDK工具->检查并下载Google Play服务,将Android迁移到Android Studio中的AndroidX
我还确保编译SDK和目标SDK为29;目前,SDK 30的Permission_handler软件包存在问题。
我还编辑了kotlin主要活动文件:
package yourpackage
import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant
class MainActivity: FlutterActivity() {
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
}
}
答案 1 :(得分:1)
对我来说这解决了问题
只需将 proguard-rules.pro 添加到 android/app/proguard-rules.pro
并添加以下行:
-keep class androidx.lifecycle.DefaultLifecycleObserver