发布模式下的 Flutter 构建 apk 无法生成更新版本
Flutter build apk on release mode cannot generate updated version
我有 运行 这个 flutter build apk
来发布我的应用程序。现在我已经构建了它的第 2 版。
现在,我想发布我的第 2 版应用程序。所以,我再次 运行 flutter build apk
。我得到了发布的 apk,但它仍然是版本 1 发布的 apk。
我删除了发布的 apk 并再次尝试,但仍然得到版本 1 发布的 apk。
在调试模式下构建版本 2 时,一切正常。
这是该应用程序的 Github Link:https://github.com/nitishk72/Flutter-Github-API
我觉得你需要
flutter clean
(我认为这是一个必要的错误,但我也遇到了)
和
flutter build apk --release
您可以在 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,请进行设置。
依赖项{
测试实施 'junit:junit:4.12'
android测试实施'androidx.test:runner:1.1.1'
android测试实施'androidx.test.espresso:espresso-core:3.1.1'
实施 'androidx.multidex:multidex:2.0.1'
}
并在按照此命令创建构建文件夹之前进行清理。
- flutter clean
- flutter build apk --release
- flutter install
6.Release Apk 位置。
in `android studio termial` or inside `project-root` you can navigate to this.
cd build\app\outputs\apk\release
如果您的问题是 flutter build(APK,捆绑包)没有在 API 调用真实设备,这是因为 您需要在创建 release/build 之前向 Android Manifest 添加 Internet 权限。
默认情况下,“互联网使用”在模拟器上可以正常工作,但在真实设备上就不行。
要解决此问题,只需:
打开文件“android/app/src/main/AndroidManifest.xml”并添加适当的用户权限:
<manifest>
...
<uses-permission android:name="android.permission.INTERNET"/>
...
</manifest>
然后再次创建您的构建。
当您创建新的 Flutter 项目时(从 Android Studio 菜单),在文件中:
/android/app/build.gradle
那里有:
你有:
buildTypes {
release {
signingConfig signingConfigs.debug // <--- HERE YOU ARE USING DEBUG KEY
}
}
这意味着 release
构建(例如从菜单 Build -> Flutter -> 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)
:
我决定打开 android studio 中的 MyProject/android 文件夹并从 android studio 构建 apk。
终于可以正常使用了
我希望这可以帮助别人。我 运行 遇到一个问题,我的发行版无法运行,并且 logcat 中没有任何错误消息。
问题原来是我有 FutureBuilder
开始 Future<void>
。通过 运行 flutter run
它可以正常工作(snapshot.hasData
是 true
),但在发布版本中它总是 false
。当然,FutureBuilder
的文档说在这种情况下 hasData
应该是 false
。但实际上在调试模式下它有不同的行为。
P.S。 另一个可能的问题:
现在我的应用程序仍然无法运行,但这次我在 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'
问题是 flutter build 自动收缩了 R8 的代码。 flutter build --no-shrink
解决了问题。我想我需要将所有必需的异常添加到 proguard-rules.pro 文件中。
使用以下命令构建 apk。
输入cd <app dir>
(替换为您的应用程序目录。)
flutter build apk --split-per-abi --no-shrink
(flutter构建命令默认为--release。)
删除 --split-per-abi
标志会生成一个胖 APK,其中包含为所有目标 ABI 编译的代码。此类 APK 的大小大于其拆分版本,导致用户下载不适用于其设备架构的本机二进制文件。
我遇到了同样的问题“应用程序在调试模式下正常工作但在发布模式下不正常”。我不知道为什么...但最后,我通过在 android/app/build.gradle 文件中添加这些行 shrinkResources false minifyEnabled false
解决了问题。
buildTypes {
release {
signingConfig signingConfigs.config
shrinkResources false
minifyEnabled false
}
}
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
两种解决方案都对我有用,但我个人推荐第二种
如果您使用的是 API 呼叫#
确保您拥有 Internet 许可 android 清单
<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'
...
}
第 5 步脚本 cd . && flutter build apk --release
退出,状态代码为 1
我有 运行 这个 flutter build apk
来发布我的应用程序。现在我已经构建了它的第 2 版。
现在,我想发布我的第 2 版应用程序。所以,我再次 运行 flutter build apk
。我得到了发布的 apk,但它仍然是版本 1 发布的 apk。
我删除了发布的 apk 并再次尝试,但仍然得到版本 1 发布的 apk。
在调试模式下构建版本 2 时,一切正常。
这是该应用程序的 Github Link:https://github.com/nitishk72/Flutter-Github-API
我觉得你需要
flutter clean
(我认为这是一个必要的错误,但我也遇到了)
和
flutter build apk --release
您可以在 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,请进行设置。
依赖项{ 测试实施 'junit:junit:4.12' android测试实施'androidx.test:runner:1.1.1' android测试实施'androidx.test.espresso:espresso-core:3.1.1' 实施 'androidx.multidex:multidex:2.0.1'
}
并在按照此命令创建构建文件夹之前进行清理。
- flutter clean - flutter build apk --release - flutter install
6.Release Apk 位置。
in `android studio termial` or inside `project-root` you can navigate to this.
cd build\app\outputs\apk\release
如果您的问题是 flutter build(APK,捆绑包)没有在 API 调用真实设备,这是因为 您需要在创建 release/build 之前向 Android Manifest 添加 Internet 权限。
默认情况下,“互联网使用”在模拟器上可以正常工作,但在真实设备上就不行。
要解决此问题,只需:
打开文件“android/app/src/main/AndroidManifest.xml”并添加适当的用户权限:
<manifest>
...
<uses-permission android:name="android.permission.INTERNET"/>
...
</manifest>
然后再次创建您的构建。
当您创建新的 Flutter 项目时(从 Android Studio 菜单),在文件中:
/android/app/build.gradle
那里有:
你有:
buildTypes {
release {
signingConfig signingConfigs.debug // <--- HERE YOU ARE USING DEBUG KEY
}
}
这意味着 release
构建(例如从菜单 Build -> Flutter -> 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)
:
我决定打开 android studio 中的 MyProject/android 文件夹并从 android studio 构建 apk。 终于可以正常使用了
我希望这可以帮助别人。我 运行 遇到一个问题,我的发行版无法运行,并且 logcat 中没有任何错误消息。
问题原来是我有 FutureBuilder
开始 Future<void>
。通过 运行 flutter run
它可以正常工作(snapshot.hasData
是 true
),但在发布版本中它总是 false
。当然,FutureBuilder
的文档说在这种情况下 hasData
应该是 false
。但实际上在调试模式下它有不同的行为。
P.S。 另一个可能的问题: 现在我的应用程序仍然无法运行,但这次我在 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'
问题是 flutter build 自动收缩了 R8 的代码。 flutter build --no-shrink
解决了问题。我想我需要将所有必需的异常添加到 proguard-rules.pro 文件中。
使用以下命令构建 apk。
输入
cd <app dir>
(替换为您的应用程序目录。)flutter build apk --split-per-abi --no-shrink
(flutter构建命令默认为--release。)
删除 --split-per-abi
标志会生成一个胖 APK,其中包含为所有目标 ABI 编译的代码。此类 APK 的大小大于其拆分版本,导致用户下载不适用于其设备架构的本机二进制文件。
我遇到了同样的问题“应用程序在调试模式下正常工作但在发布模式下不正常”。我不知道为什么...但最后,我通过在 android/app/build.gradle 文件中添加这些行 shrinkResources false minifyEnabled false
解决了问题。
buildTypes {
release {
signingConfig signingConfigs.config
shrinkResources false
minifyEnabled false
}
}
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
两种解决方案都对我有用,但我个人推荐第二种
如果您使用的是 API 呼叫#
确保您拥有 Internet 许可 android 清单
<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'
...
}
第 5 步脚本 cd . && flutter build apk --release
退出,状态代码为 1