Flutter问题与发布模式只有APK构建



当从安装的APK运行应用程序时,我会遇到问题,但当直接从Android studio运行时,该应用程序运行良好。在物理设备和模拟器上进行了测试,还使用构建模式调试、配置文件和发布(其中发布和配置文件模式当然只适用于物理设备)

摘要:a) 共享前缀、路径提供程序和权限处理程序生成一个MissingPluginException。b) Android后退按钮不起作用。

这些可能是单独的问题,但我强烈怀疑它们是相关的,因为只有当应用程序从APK启动而不是直接从Android Studio安装时,才会发生这两个问题。

非常清楚地说;安装";安卓工作室中的应用程序,即使没有AS连接,我也可以继续使用该应用程序。然而,当我构建一个APK,手动安装它,并尝试运行应用程序时,我会出现由上述错误引起的各种症状。如果我通过Android Studio连接Logcat,问题将一直存在,直到我使用AS.安装新的构建

更多细节:

  1. 在发布模式的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)

搜索上述问题的解决方案会出现几个有记录的案例,只是它们通常没有Flavors,所以我得到的是:app:lintVitalRelease而不是:app:lintVitalQaRelease。此外,在报告的情况下,错误将显示缺失的中间体为.../flutter/Profile/libs.jar,同样没有香料。

在我的情况下,额外的Qadev分别是两种不同的口味。在其他情况下,变通方法是";构建您的调试和配置文件模式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_EEXTERNAL_STORAGE添加到AndroidManifest中,甚至将其添加到每种口味的单独清单中。(我通常只在主AndroidManifest.xml中添加共享配置)

我已经实现了发布模式的签名,以防Android不喜欢为未签名的APK授予权限。

编辑:为了消除导致问题的应用程序ID,我将所有实例都改回了创建项目时使用的原始包名称。这意味着一次只能在我的设备上安装一种口味。然而,这并没有什么区别。


很明显,我已经做了很多次颤振清理和颤振获取,每次都迫使我逐一构建所有缺失的中间体。

还有一件事。。。Android后退按钮不起作用。如果我直接从Android Studio运行该应用程序,它会很好地工作,但在仅从APK运行时不工作(似乎被忽略了)。

我对此束手无策。

编辑#2:进展
我创建了一个新项目,并复制了源代码(lib/*)。我还复制了pubspec.yaml和资产。我没有对build.gradle文件进行任何更改,只对主要的AndroidManifest.xml(应用程序名称)进行了两次更改,并添加了Internet权限。

我还设置了应用程序图标。

复制源代码是非常热情的——有很多很多导入,但最终结果是一个有效的构建。

SharedPrefs在重新启动后仍然有效显示下载的图像Android后退按钮工作存储的设备权限显示为已授予第一次从应用程序中打开相机需要获得许可。该应用程序可以将用户发送到Android应用程序设置屏幕。

一切似乎都正常。我可能在某个地方犯了一个错误,因为新应用程序在主屏幕上显示了正确的应用程序图标,但在应用程序的Android设置页面上显示了Flutter默认图标。

接下来的步骤是签署APK,然后重新引入口味,即使只是为了能够设定飞镖目标,但也希望能设定其他属性。

我遇到了这个问题。我用几种不同的方法解决了这个问题:

  1. 将proguard-rules.pro添加到android/app/proguard-ules.pro
#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
  1. 在应用程序级build.gradle中将proguard添加到buildTypes
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
}
  1. 您也可以尝试在终端中运行主通道:
flutter channel master
  1. 我还通过导航到SDK管理器将android迁移到android Studio中的AndroidX->SDK工具->检查并下载Google Play服务

  2. 我还确保编译SDK和目标SDK是29;目前SDK 30的permission_ handler包存在问题。

  3. 我还编辑了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);
}
}

对我来说,这解决了问题

只需将proguard-rules.pro添加到android/app/proguard-ules.pro

并添加以下行:

-keep class androidx.lifecycle.DefaultLifecycleObserver

正如@Alex所回答的,Flutter会混淆代码,有时还会在Android或Java库上创建错误。

我建议你阅读下面的这篇文章,并尝试将缺失的类添加到";proguard规则":https://medium.com/@swav.kulinski/fluft-and-android-obfusion-8768ac544421

最新更新