当前位置: 首页 > 知识库问答 >
问题:

仅发布模式APK构建的颤振问题

柴俊捷
2023-03-14

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

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

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

非常清楚,如果我从Android Studio中“安装”该应用程序,那么即使没有连接,我也可以继续使用该应用程序。然而,当我构建一个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: lintVitalRelase代替: app: lintVitalQaReleas,就像我得到的那样。此外,在报告的情况下,错误将显示丢失的中间体为.../flutter/Profile/libs.jar,同样没有味道。

在我的例子中,额外的Qadev分别是两种不同的风格。在其他情况下,解决方法是“构建调试和概要文件模式apk以解决问题”,在我的情况下是“构建调试和概要文件并发布所有其他风格的apk,而不仅仅是您尝试构建的版本”。

因此,我在尝试构建风味“Qa”模式“release”和它抱怨的任何一种模式之间切换,直到它满意并生成APK为止。必须构建一堆不相关的风格和模式是很烦人的,但至少是一个解决办法,让我有了APK。

在此之后,我可以安装和联合国从APK,但与问题。logcat显示发生的一些MissingPlugin异常:

MissingPluginException(在channel plugins.flatter.io/path\u provider上找不到方法getApplicationDocumentsDirectory的实现)

找不到通道plugins.flutter.io/shared_preferences上的getAll方法的实现

最后:在调查这一切的时候,我尝试了https://pub.dev/packages/permission_handler/example.的权限处理程序示例,我只是把它作为一个新的“页面”添加到我的应用程序中。在导航到这个页面我得到另一个例外:

MissingPluginException(在channel flift.baseflow.com/permissions/methods上找不到方法checkPermissionStatus的实现)

应用程序中与这些插件相关的很多功能都不起作用——照片不显示,用户需要在每次重启时进行身份验证,等等。这些显然依赖于上述插件。

我尝试将WRITE_外部_存储添加到AndroidManifest中,甚至将其添加到每种口味的单独清单中。(我通常只向主AndroidManifest.xml添加共享配置

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

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

显然,我已经做了很多次颤动清洁和颤动获取,每次都迫使我一个接一个地构建所有缺失的中间体。

还有一件事...Android后退按钮不工作。它的工作原理很好,如果我直接从Android Studio运行应用程序,但不工作(似乎被忽略)时,从APK只运行它。

我对此束手无策。

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

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

复制源是热情的——有很多很多的导入,但最终结果是一个工作的构建。

SharedPrefs幸存重启下载的图像显示Android后退按钮作品存储设备权限显示为已授予从应用程序内打开相机第一次请求权限。该应用程序可以将用户发送到Android应用程序设置屏幕。

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

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


共有3个答案

马弘和
2023-03-14

正如@Alex所回答的那样,flatter会混淆代码,有时还会在Android或Java库上产生错误。

我建议您阅读下面的文章,并尝试将缺少的类添加到“proguard规则”中:https://medium.com/@斯瓦夫。kulinski/flatter-and-android-obfusion-8768ac544421

田志尚
2023-03-14

对我来说这解决了问题

只需添加proguard规则。支持android/app/proguard规则。赞成的意见

添加以下一行:

-keep class androidx.lifecycle.DefaultLifecycleObserver
岳风畔
2023-03-14

我确实有这个问题。我用两种不同的方法解决了这个问题:

  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
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管理器将Android迁移到Android Studio中的Android

我还确保编译SDK和目标SDK是29;目前permission_handlerSDK 30的包有问题。

我还编辑了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);
    }
}
 类似资料:
  • 注意:使用-Xlint重新编译:详细信息请参阅弃用。D8:程序类型已存在:android。支持v4.os。ResultReceiver$MyResultReceiver 失败:构建失败,但有例外。 > 错误:任务执行失败:应用程序:transformDexArchiveWithExternalLibsDexMergerForDebug”。 通用域名格式。Android建设者德兴。DexArchiv

  • 失败:生成失败,出现异常。 > 错误:任务:app:compileFlutterBuildRelease的执行失败。 处理“命令”C:\Users\LEGION\flatter\u windows\u 2.2.3-stable\flatter\bin\flatter。bat“”以非零退出值1结束 尝试:使用--stacktrac选项运行以获取堆栈跟踪。使用--info或--debug选项运行以获得

  • 我自定义谷歌地图位置选择器并从我的github存储库中加载它,现在当我尝试构建文件时,它会在下面显示错误。 失败:生成失败,出现异常。 问题:配置根项目“google_map_location_picker”时出现问题 未找到SDK位置。使用ANDROID_SDK_ROOT环境变量或通过设置SDK来定义位置。项目本地属性文件中的dir路径,位于“/Users/johnsmith/Developer

  • 我试图上传我的与科尔多瓦客户端命令行命令,但谷歌播放一直说我在调试模式下构建的应用程序。 这是我用来构建apk的步骤(以下是答案) 这是谷歌的截图错误

  • 我正试图生成一个构建apk,但出现以下错误。这与颤振版本2.8.1兼容 /home/dell/snap/Flatter/common/Flatter/bin/Flatter——无颜色构建apk 无声建筑零安全有关更多信息,请参阅https://dart.dev/null-safety/unsound-null-safety 警告:将新nshttp://schemas.android.com/rep

  • 我正在寻找一种方法来混淆我的Android APK/AppBundle,然后我发现了这个命令: 但是它没有密钥库信息,所以我无法在Google Play控制台上发布此文件。然后,我找到了这篇文章,用于构建带有键的应用程序,但它没有使用模糊处理。 那么,我该如何用Dart代码混淆来构建我的应用程序的发布版本呢?