Flutter 打包APP(适用于Android和iOS平台)

访客 182 0
```html

打包Android apk

参考:
- [Flutter官方文档](https://flutter.dev/docs/deployment/android)
- [Flutter中文社区教程](https://flutterchina.club/android-release/)
- [解决安装没网络问题的Flutter项目打包成安卓apk详解](链接待补充)
- 【Flutter专题】39 图解iOS打包IPA文件
- Flutter-打包APK、IPA及IOS上传APPLE Store详解
- Flutter-Apk大小优化探索
Flutter apk最简单的瘦身方式

```

检查AndroidManifest.xml

  1. 修改app名字
  2. 修改包名
  3. 配置权限(解决apk安装后无网络)

注意,main 和 profile 目录下的Manifest文件都要检查
Flutter 打包APP(适用于Android和iOS平台)-第1张图片-谷歌商店上架
Flutter 打包APP(适用于Android和iOS平台)-第2张图片-谷歌商店上架

在main和profile目录下的Manifest文件中都添加了权限。

<uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

main.dart

Flutter 打包APP(适用于Android和iOS平台)-第3张图片-谷歌商店上架

build.gradle (app目录)

  1. application id
  2. version code & version name(在 local.properties统一定义)
  3. minSdk & targetSdk

Flutter 打包APP(适用于Android和iOS平台)-第4张图片-谷歌商店上架

修改启动图标

快捷工具:一键生成适用于所有尺寸的应用图标和启动图,同时支持iOS、Android和PhoneGap应用。符合Apple和Google官方标准。点击链接获取更多信息:https://icon.wuruihong.com/

只需将logo上传至上述网站,即可生成适用于Android和iOS的启动图标。然后,只需直接复制并替换到相应目录即可完成替换。

APP签名

1. 创建 keystore

如果您没有的话,请通过运行以下命令来创建一个:

生成密钥的命令行工具是keytool。您可以使用以下命令生成一个新的密钥存储文件key.jks:

```
keytool -genkey -v -keystore ~/key.jks
``` 
keytool -genkey -v -keystore custom.keystore -alias custom_alias -keyalg RSA 
2. 引用应用程序中的keystore

请在< app dir >/android/目录下创建一个名为key.properties的文件,其中包含对密钥库的引用。

storePassword=<password from previous step> keyPassword=<password from previous step> keyAlias=keystoreFile=<location of the key store file, e.g. ../key.jks>
3. 配置app build.gradle - 在gradle中配置签名

1.将以下内容替换为:

```groovy storePassword '' keyPassword '' keyAlias 'keystoreFile' ``` 其中,``是你在前面步骤中获得的密码,`'keystoreFile'`是密钥库文件的位置,例如 `../key.jks`。
android { 
def keystorePropertiesFile = rootProject.file(key.properties)
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
android { 
buildTypes {
    release {
        // TODO: Add your own signing config for the release build.
        // Signing with the debug keys for now, so `flutter run --release` works.
        signingConfig signingConfigs.debug
    }
} 
signingConfigs {    release {        keyAlias keystoreProperties['keyAlias']        keyPassword keystoreProperties['keyPassword']        storeFile file(keystoreProperties['storeFile'])        storePassword keystoreProperties['storePassword']    }}buildTypes {    release {        signingConfig signingConfigs.release        //signingConfig signingConfigs.debug    }}

[可选] 开启混淆

  • 对apk的代码安全和包大小有要求
  • 确保使用的第三方库不被混淆

默认情况下 flutter 不会开启 Android 的混淆。

如果您在项目中使用了第三方的Java或Android库,可能您希望优化apk文件大小或者增强代码的反编译防护。

  1. 配置混淆
    创建 /android/app/proguard-rules.pro 文件,并添加以下规则:
    !!! 注意, 是app目录下的
如果您使用了第三方的Java或Android库,您需要添加与之对应的规则。以下是针对Flutter Wrapper的规则:

- 保留类 io.flutter.app.** { *; }
- 保留类 io.flutter.plugin.** { *; }
- 保留类 io.flutter.util.** { *; }
- 保留类 io.flutter.view.** { *; }
- 保留类 io.flutter.** { *; }
- 保留类 io.flutter.plugins.** { *; }

另外,如果您想启用混淆/压缩,请按照以下步骤进行操作:

2) 打开 /android/app/build.gradle 文件,并定位到 buildTypes 块。
3) 在 release 配置中添加以下代码:  

构建一个发布版(release)APK

使用命令行:

  1. cd flutter工程根目录
  2. 运行flutter build apk (flutter build 默认会包含 --release选项).

已打包好的发布APK位于/build/app/outputs/apk/app-release.apk。

flutter build apk 的一些细节

  • 对apk进行解压,可以看到flutter默认打包的flutter so库架构为 armeabi-v7a
    Flutter 打包APP(适用于Android和iOS平台)-第5张图片-谷歌商店上架
  • 分架构打包,可以减少apk体积
以下是改写后的文案:

使用以下命令构建Flutter APK包:flutter build apk --target-platform android-arm,android-arm64,android-x64 --split-per-abi。最后的--split-per-abi参数表示按照指定的架构类型分别打包,生成多个APK文件,每个APK文件对应一个特定架构。如果不使用该参数,则会生成一个包含所有CPU架构的APK文件。  

打包IOS (待更新…)

在打包前,需要已经申请了Apple的开发者账号

在AppleStore Connect 注册APP&注册APP bundle ID

请参考以下链接获取有关iOS部署的更多信息:https://flutter.cn/docs/deployment/ios

ios打包过程遇到的问题

在执行flutter build ios命令之后

error: The linked framework 'Pods_Runner.framework' is missing one or more architectures required by this target: armv7. (in target 'Runner' from project 'Runner')

Flutter 打包APP(适用于Android和iOS平台)-第6张图片-谷歌商店上架
在XCode中,Runner下的Build Settings标签中,找到 architectures - ExcludedArchitectures
为Release和Profile添加如上图4/5所示的架构

在执行flutter build ios命令之后

Xcode构建完成,耗时41.3秒。无法构建iOS应用程序。来自Xcode构建的错误输出:↳ ** 构建失败 ** Xcode的输出:↳ /Users/keihong/.pub-cache/hosted/pub.flutter-io.cn/flutter_webview_plugin-0.4.0/ios/Classes/FlutterWebviewPlugin.m:92:22: 警告:不兼容的指针转换,将'id _Nullable'分配给'BOOL'(又名'signed char')[-Wint-conversion] _enableAppScheme = call.arguments[@enableAppScheme]; ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /Users/keihong/.pub-cache/hosted/pub.flutter-io.cn/flutter_webview_plugin-0.4.0/ios/Classes/FlutterWebviewPlugin.m:434:98: 警告:不应将'typeof(NSInteger)'值用作格式参数;而是添加一个显式转换为'long'[-Wformat] [channel invokeMethod:@onHttpError arguments:@{@code: [NSString stringWithFormat:@%ld, (long)error.code], @url: url}]; ~~~ ^~~~~~~~~~ %ld (long) /Users/keihong/.pub-cache/hosted/pub.flutter-io.cn/flutter_webview_plugin-0.4.0/ios/classes/flutterwebviewplugin.m :442 :98 :警告:不应将'typeof(NSInteger)'值用作格式参数;而是添加一个显式转换为 '长'[ - Wformat ] [ channel invokeMethod : @ onHttpError arguments : @ { @  code  : [ NSString stringWithFormat : @ % ld , ( long ) error . code ] , @  error  : error . localizedDescription } ] ; ~~~ ^~~~~~~~~~ 
以下是改写后的文案:

```
请执行以下命令来清理项目并构建iOS应用:
flutter clean
flutter build ios

Xcode构建完成,耗时36.7秒。
无法构建iOS应用,Xcode报错如下:
↳    ** 构建失败 **
Xcode输出信息如下:
↳    生成了4个警告。
    ../../../../../../../.pub-cache/hosted/pub.flutter-io.cn/flutter_color_plugin-1.0.0/lib/flutter_color_plugin.dart:35:35: 警告:空安全操作符'!'的操作数类型为'String',不包括null。
          int? color = sColorNameMap[(colorString!.toLowerCase())];
                                      ^
    Command PhaseScriptExecution 失败
```  
Failed to build iOS appError output from Xcode build:↳    ** BUILD FAILED **Xcode's output:↳    Command PhaseScriptExecution failed with a nonzero exit code    note: Using new build system    note: Building targets in parallel    note: Planning build    note: Analyzing workspace    note: Constructing build description    note: Build preparation complete    warning: None of the architectures in ARCHS (arm64, armv7) are valid. Consider setting ARCHS to $(ARCHS_STANDARD) or updating it to include at least one value from VALID_ARCHS (arm64, arm64e, armv7, armv7s) which is not in    EXCLUDED_ARCHS (arm64, armv7). (in target 'Runner' from project 'Runner')Encountered error while building for device.

改成下图所示内容后,出现了另一个错误:
Flutter 打包APP(适用于Android和iOS平台)-第7张图片-谷歌商店上架

错误:链接的框架 'Pods_Runner.framework' 缺少此目标所需的一个或多个体系结构:armv7s。(在项目 'Runner' 的目标中)。

参考:https://www.jianshu.com/p/5af69bb58916 

我可以提供以下解决方案:首先,您可以删除iOS目录,并重新创建iOS项目...

flutter create -i swift .

IOS打包步骤记录

  1. flutter build ios
  2. 打开xcode,修改版本号
  3. Project - archive
  4. Distribute app
  5. 根据实际需要选择 Ad-Hoc等
  6. 取消rebuild from bitcode

标签: 文件 图标 架构 目录

发表评论 (已有0条评论)

还木有评论哦,快来抢沙发吧~