仅限发行版APK版本的颤振问题

时间:2020-09-06 15:53:00

标签: android flutter build.gradle release

从已安装的APK运行应用程序时出现问题,但直接从Android Studio运行时,该应用程序运行良好。已在物理设备和仿真器上进行了测试,并且具有调试,配置文件和发布的构建模式(其中发布和配置文件模式仅在物理设备上有效)

摘要: a)共享首选项,路径提供者和权限处理程序会产生一个MissingPluginException。 b)Android后退按钮不起作用。

这些可能是单独的问题,但是我强烈怀疑它们之间存在关联,因为这两个问题仅在从不直接从Android Studio直接安装的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)

搜索上述解决方案会带来一些已记录在案的案例,只是它们通常不包含风味,因此在我逐渐掌握的情况下,: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_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进行签名,然后重新引入口味,即使只是为了设置飞镖目标,也希望可以设置其他属性。

2 个答案:

答案 0 :(得分:1)

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

  1. 将proguard-rules.pro添加到android / app / proguard-rules.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管理器-> SDK工具->检查并下载Google Play服务,将Android迁移到Android Studio中的AndroidX

  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);
    }
}

答案 1 :(得分:1)

对我来说这解决了问题

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

并添加以下行:

-keep class androidx.lifecycle.DefaultLifecycleObserver