Flutter Release apk 无法正常工作?

Posted

技术标签:

【中文标题】Flutter Release apk 无法正常工作?【英文标题】:Flutter Release apk is not working properly? 【发布时间】:2018-09-27 04:33:17 【问题描述】:

我运行了这个flutter build apk 来发布我的应用程序。现在我已经构建了它的第 2 版。

现在我想再次发布我的第 2 版应用程序。为了获得发布 apk,我再次运行 flutter build apk。我获得了发布的 apk,但这是我发布的第 1 版 apk。 我转到我的已发布目录并删除了我已删除的已发布 apk 并再次尝试,然后我也获得了第 1 版已发布 apk。

在构建版本 2 时,我正在调试模式下进行测试。在粪便模式下一切正常。

这是该应用程序的 Github 链接:https://github.com/nitishk72/Flutter-Github-API

【问题讨论】:

【参考方案1】:

如果您使用 API 调用#

确保您的 android Manifest 上有 Internet 权限

<manifest> 
...
 <uses-permission android:name="android.permission.INTERNET"/>
...
</manifest>

如果您使用共享首选项插件

android\build.gradle 中设置您的依赖项以使用 classpath 'com.android.tools.build:gradle:3.5.1'

不是 classpath 'com.android.tools.build:gradle:4.1.0

像这样:

dependencies 
        classpath 'com.android.tools.build:gradle:3.5.1'
        ...
    

【讨论】:

【参考方案2】:

1).

android\app\src\mainAndroid manifest中添加以下行

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

然后将这些行添加到android\app\build.gradle

   buildTypes 
   release 
        shrinkResources false
        minifyEnabled false
   

2).

使用以下命令构建apk

flutter build apk --no-shrink

flutter build apk --split-per-abi --no-shrink

两种解决方案都对我有用,但我个人推荐第二个

【讨论】:

【参考方案3】:

当您创建新的 Flutter 项目时(从 Android Studio 菜单),在文件中:

/android/app/build.gradle

那里有:

你有:

buildTypes 
    release 
        signingConfig signingConfigs.debug    //   <--- HERE YOU ARE USING DEBUG KEY
    

这意味着release 构建(例如从菜单Build -&gt; Flutter -&gt; Build APK 触发)将使用debug 密钥进行签名。

完整的build.gradle 文件(由 Android Studio 创建):

解决方案

更改自:

signingConfig signingConfigs.debug

到:

signingConfig signingConfigs.release

所以(在build.gradle)你应该有:

buildTypes 
    release 
        signingConfig signingConfigs.release
    

错误

当您遇到错误 Could not get unknown property 'release' for SigningConfig - 只需在 build.gradle 中添加部分 release,因此:

    创建新的.jks 文件(通过Generate Signed Bundle / APK...

    将凭据放入build.gradle (:app):

【讨论】:

它对我不起作用,出现错误:无法为 org.gradle.api.internal.FactoryNamedDomainObjectContainer 类型的 SigningConfig 容器获取未知属性“释放”。 @MarcoA.Braghim 错误非常明显。 SigningConfig container 中没有 property 'release'。在android 你必须创建它,所以android signingConfigs release 然后把你的keyAliasstoreFilekeyPasswordstorePassword【参考方案4】:

我遇到了同样的问题“应用程序在调试模式下正常工作,但在发布模式下不能正常工作”。我不知道为什么......但最后,我通过在 android/app/build.gradle 文件中添加这些行 shrinkResources false minifyEnabled false 解决了。

 buildTypes 
     release 
         signingConfig signingConfigs.config
         shrinkResources false
         minifyEnabled false
     
 

【讨论】:

由于某些原因,--no-shrink 构建参数对我不起作用,但这有帮助【参考方案5】:

问题在于,flutter build 会使用 R8 自动收缩代码。 flutter build --no-shrink 解决了这个问题。我想我需要将所有必需的例外添加到 proguard-rules.pro 文件中。

使用以下命令构建 apk。

    输入cd &lt;app dir&gt;(替换为您的应用程序目录。)

    flutter build apk --split-per-abi --no-shrink(flutter build 命令默认为 --release。)

删除--split-per-abi 标志会生成一个胖APK,其中包含为所有目标ABI 编译的代码。此类 APK 的大小比拆分后的版本大,导致用户下载不适用于其设备架构的原生二进制文件。

【讨论】:

【参考方案6】:

我希望这可以帮助某人。我遇到了一个问题,我的发布版本不起作用,并且 logcat 中没有任何错误消息。 问题原来是我有FutureBuilder,我在其中开始Future&lt;void&gt;。通过运行flutter run,它可以正常工作(snapshot.hasDatatrue),但在发布版本中它始终是false。当然,FutureBuilder 的文档说在这种情况下hasData 应该是false。但实际上在调试模式下它有不同的行为。

附: 另一个可能的问题: 现在我的应用程序仍然无法运行,但这次我在 logcat 上看到了下一个错误:

Unhandled Exception: MissingPluginException(No implementation found for method getAll on channel plugins.flutter.io/shared_preferences)

将 gradle 插件版本从 7.* 降级到 3.5.4 可以解决此问题。

classpath 'com.android.tools.build:gradle:3.5.4'

【讨论】:

【参考方案7】:

我决定在 android studio 中打开 MyProject/android 文件夹并从 android studio 构建 apk。 终于可以正常使用了。

【讨论】:

【参考方案8】:

如果您的问题是 flutter build(APK、bundle)没有在真实设备中进行 API 调用,这是因为 在创建发布/构建之前,您需要将 Internet 权限添加到 Android Manifest

默认情况下,“互联网使用”在模拟器上可以正常工作,但在真实设备上则不行。

要解决这个问题,只需:

打开文件“android/app/src/main/AndroidManifest.xml”并添加适当的用户权限:

<manifest> 
...
 <uses-permission android:name="android.permission.INTERNET"/>
...
</manifest>

然后再次创建您的构建。

【讨论】:

@Jumma:你的回答拯救了我的一天:)。谢谢 谢谢!这有点令人困惑,但很有意义,因为 Flutter 调试版本总是需要 Internet 权限才能使用调试工具。关于这个的讨论在这里:github.com/flutter/flutter/issues/20789 非常感谢!我不知道我应该如何在谷歌上提出我的问题,但这是答案!你拯救了我的一天!【参考方案9】:

    你可以在 local.properties android 项目中更改

        sdk.dir=D:/SDK               //your android SDK location
        flutter.sdk=D:\\Flutter\\flutter  //your flutter SDK location
        flutter.versionName=1.0.0
        flutter.versionCode=2
        flutter.buildMode=release
    

    你的 android/app/build.gradle 文件的变化

         buildTypes 
                release 
                    // if everything ok then not add 
                    //minifyEnabled true 
                    //another you can remove minifyEnabled true
                    proguardFiles getDefaultProguardFile('proguard- 
                     android.txt'), 'proguard-rules.pro'
                    signingConfig signingConfigs.release
                
            
    

    你也可以在 android/app/build.gradle 中更改 defaultConfig 方法 身体。

      multiDexEnabled true
    

    如果您想迁移到 androidx,请进行设置。

    依赖 testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' 实现'androidx.multidex:multidex:2.0.1'

      并在创建构建文件夹之前按照此 cmd 进行清理。

       - flutter clean
      
       - flutter build apk --release
      
       - flutter install
      

6.发布Apk位置。

        in `android studio termial` or inside `project-root` you can navigate to this.

        cd build\app\outputs\apk\release

【讨论】:

ios 开发者在这里。 Android 使用 Flutter。尝试过flutter clean,然后flutter apk --release,但它总是创建一个调试版本。遵循上述步骤并添加了signingConfig.release 并使用flutter apk 获得了Release 版本——release 还参考flutter.dev/docs/deployment/android,它本质上是上面的内容,但详细介绍了如何创建密钥文件以及存储和链接它的位置等。 它将创建 debugRelease。 (为什么因为在 android 代码内的 app 文件夹中,您会找到一个 build.gradle,您会在其中看到 release 标记,该标记默认绑定到 debug.keystore。 哦。那么如何创建 Release 版本呢? 您可以从 Android-studio 创建发布版本。有一个选项。 谢谢图沙尔。我在 Android Studio 上遇到了一些奇怪的错误。所以我从命令行(flutter apk --release)创建了发布版本。【参考方案10】:

我认为你需要

flutter clean

(我认为这是一个必要的错误,但我也遇到了)

flutter build apk --release

【讨论】:

很高兴听到。 . @GünterZöchbauer 我仍然面临这个问题。它说`正在运行'gradlew assembleRelease'...... Dart快照生成器失败,退出代码为-1073741819 快照以非零退出代码退出:-1073741819`我觉得提供可调试版本很不舒服。 我也不认为发布调试版本是一个好主意(如果可能的话),但我不知道如何解决。您能否在 GitHub 中创建一个包含尽可能多信息的问题。 这对我不起作用。请帮忙。当打开应用程序被杀死。

以上是关于Flutter Release apk 无法正常工作?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 应用程序无法在 apk-release 中运行,但可以在调试模式下运行(即使在授予 Internet 权限后)

反编译flutter release apk。在哪里可以找到源代码?

Flutter:build/app/outputs下的apk/release目录和flutter-apk目录有啥区别?

Flutter PlayStore Distribution APK 无法正常工作,无法加载,卡在启动画面

使用哪个 Flutter APK 从 apk/release/ 文件夹安装

将flutter从master切换到stable后无法构建发布apk