android IO流_Flutter实战经验(十):打包和发布到 Android 平台

640423c31567237cb5f9b090a399474e.png

本文适合ios开发者不清楚Android上架机制学习。

在一般的开发过程中,我们可以使用 flutter run 命令,或者 IntelliJ 工具栏中的 RunDebug 来测试 app。这时候,Flutter 默认会为我们构建 app 的调试版本。

当想要发布 app 时,比如 发布到 Google Play Store,可以按照以下步骤来准备 Android 平台的 发布 版本。本页面的内容包含如下主题:

  1. 添加启动图标
  2. 创建一个密钥库
  3. 启用混淆器
  4. 检查 app manifest 文件
  5. 检查构建配置
  6. 为发布构建应用程序
  7. 发布到 Google Play Store
  8. 更新应用版本号
  9. 安卓发布常见问题

1. 添加启动图标

当我们创建一个新的 Flutter app 的时候,它会有一个默认的启动图标。

或者,如果我们想手动操作,可以参考以下方法:

(1)查看 Material Design Product Icons 指南中图标设计部分。

(2)在 /android/app/src/main/res/ 目录下,把我们的图标文件放在以 配置限定符 命名的文件夹中。类似默认的 mipmap- 文件夹这样的命名方式。

(3)在 AndroidManifest.xml 中,更新 application 标签中的 android:icon 属性来引用上一步骤中我们自己的图标文件 (例如,

(4)用 flutter run 运行 app,检查启动程序中的 app 图标是否已经替换成我们自己的图标文件。

2. 为 app 签

要想把 app 发布到应用市场,还需要给 app 一个数字签名。我们可以采用以下步骤来为 app 签名:

2.1 创建一个密钥库

如果我们已经有一个密钥库,可以跳到下一步。如果没有,在命令行中运行以下的命令来创建一个:

在 macOS 或者 Linux 系统上,执行下面的代码

keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key

在 Windows 系统上,执行下面的代码

keytool -genkey -v -keystore c:/Users/USER_NAME/key.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias key
  • 保证这个文件的私有性,不要将它提交到公共的代码管理空间。
  • keytool 可能不在我们的系统路径中。它是 Java 的一部分,在安装 Android Studio 的时候会被一起安装。运行 flutter doctor -v,’Java binary at:’ 之后打印出来的就是它的路径,然后用 java 来替换以上命令中的 keytool,并加上 keytool 的完整路径即可。
    如果文件路径包含空格,类似 Program Files 这样的,你需要在路径上加入转义符: /"Program Files"/。
  • 只有 Java 9 或更高版本才需要 -storetype JKS 标签。从 Java 9 版本开始,keystore 类型默认为 PKS12。

2.2 从 app 中引用密钥库

创建一个名为 /android/key.properties 的文件,它包含了密钥库位置的定义:

storePassword=keyPassword=keyAlias=keystoreFile=/key.jks>

备忘:请保证这个文件的私有性,不要将它提交到公共的代码管理空间。

2.3 在 gradle 中配置签名

通过编辑 /android/app/build.gradle 文件来为我们的 app 配置签名:

(1)将如下内容:

 android {

替换为我们的 properties 文件的密钥库信息:

 def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('key.properties') if (keystorePropertiesFile.exists()) { keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) } android {

(2)将如下内容:

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

现在我们 app 的发布版本就会被自动签名了。

3. 启用混淆器

默认情况下,Flutter 不会做混淆或者压缩 Android host 的工作。如果 app 使用了第三方的 Java 或者 Android 库,我们会希望减小 APK 的大小,或者保护代码不被反编译出来。

要了解混淆 Dart 代码的相关信息,可以参考 Flutter wiki 上的 Obfuscating Dart Code。

步骤1:配置 Proguard

创建 /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.** { *; }-dontwarn io.flutter.embedding.**

以上这样的配置只是对 Flutter 引擎库做保护。如果想要保护其他的库(例如,Firebase),需要为它们添加自己的规则。

步骤2:启用混淆以及/或压缩

在 /android/app/build.gradle 文件找到 buildTypes 的定义。在 release 配置中设置 minifiyEnabled 和 useProguard 为 true。另外我们必须再设置 Proguard 指向步骤 1 中我们创建的文件。

android { ... buildTypes { release { signingConfig signingConfigs.release minifyEnabled true useProguard true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }}

备忘:混淆和压缩会大大地延长安卓应用程序的编译时间。

4. 检查 app manifest 文件

检查位于 /android/app/src/main 的默认 App Manifest 文件 AndroidManifest.xml,并确认各个值都设置正确,特别是:

  • application:编辑 application 标签中的 android:label 来设置 app 的最终名字。
  • uses-permission:如果你的代码需要互联网交互,请加入 android.permission.INTERNET 权限标签。标准开发模版里并未加入这个权限(但是 Flutter debug 模版加入了这个权限),加入这个权限是为了允许 Flutter 工具和正在运行的 app 之间的通信。

5. 检查构建配置

检查位于 /android/app 的默认 Gradle build file,并确认各个值都设置正确,特别是下面 defaultConfig 块中的值:

  • applicationId :指定最终的,唯一的(Application Id)appid。
  • versionCode & versionName :指定 app 的内部版本号,以及用于显示的版本号,这可以通过设置 pubspec.yaml 文件中 version 属性来做。
  • minSdkVersion & targetSdkVersion :指定支持的最低 API 版本,以及我们 app 的目标 API 版本。

6. 为发布构建应用程序

当要发布到 Play Store 时,你有两种可能的发布方式

  • App bundle (推荐)
  • APK

备忘

Google Play Store 更推荐 app bundle 方式。更多信息可以参考 Android App Bundle and About Android App Bundles。

6.1 构建一个 app bundle

这个部分描述了如何构建一个发布的 app bundle。如果在前面的部分已经完成了签名步骤,发布的 bundle 会被签名。

注意

最近 Flutter team 收到的几份开发者反馈显示,他们在尝试构建 app bundle 的时候,会在某些 Android 6.0 某些设备上崩溃。

在 Android team 努力寻找可行的解决方案时,你可以先尝试将 APK 拆分作为临时解决方案。

使用如下命令:

(1)运行 cd 。(将 替换为我们 app 的目录)。

(2)运行 flutter build appbundle。(运行 flutter build 默认构建一个发布版本。)

你的应用的 release bundle 会被创建到 /build/app/outputs/bundle/release/app.aab.

此 app bundle 会默认地包含为 armeabi-v7a (32-bit) 和 arm64-v8a (64-bit) 编译的 Dart 和 Fluter 运行时代码。

6.2 测试 app bundle

一个 app bundle 可以用多种方法测试,这里介绍两种。

6.2.1离线使用 bundle tool

(1)如果你还没准备好,可以从 GitHub repository 下载 bundletool

(2)从你的 app bundle Generate a set of APKs

(3)Deploy the APKs to connected devices.

Deploy the APKs 连接到你的设备

6.2.2 在线使用 Google Play

(1)上传你的 bundle 到 Google Play 去测试它。或者在正式发布之前用 alpha 或 beta 频道去测试。

(2)按照 these steps to upload your bundle 上传到 Play Store。

6.3 构建一个 APK

虽然 app bundle 比 APKs 更被推荐使用,但是有一些 Store 目前还不支持 app bundle方式。这种情况下,要为各种目标 ABI (Application Binary Interface) 分别构建发布的 APK 文件。

如果你完成签名步骤, APK 就被签名了。

使用如下命令:

(1)cd (将 替换为我们 app 的目录)。

(2)行 flutter build apk (flutter build 默认带有 --release 参数)。

这个命令会生成两个 APK 文件:

  • /build/app/outputs/apk/release/app-armeabi-v7a-release.apk
  • /build/app/outputs/apk/release/app-arm64-v8a-release.apk

如果移除 --split-per-abi 将会生成一个包含_所有_目标 ABI 的 fat APK 文件。这种 APK 文件将会在比单独构建的 APK 文件尺寸要大,会导致用户下载一些不适用于其设备架构的二进制文件。

6.4 在设备上安装 APK 文件

按照如下这些步骤,将前一步中构建出来的 APK 安装到 Android 设备上。

使用如下命令:

(1)用 USB 线将 Android 设备连接到电脑上。

(2)cd , 是我们 app 的目录。

(3)运行 flutter install。

7. 发布到 Google Play Store

要了解如何发布一个 app 到 Google Play Store,可以参考 Google Play publishing documentation。

当你创建了应用之后,你可以通过 Google Ads 吸引更多用户, Google Ads 平台可以通过机器学习帮助你以非常高的性价比吸引到更多用户。

通过以下几步创建一个广告宣传:

(1)创建广告—我们会根据您的应用信息帮您制作广告。另外,您还可以添加图片和视频。

(2)决定推广预算—对于以提高应用安装量为主要目标的广告系列,您需要为其设置应用安装出价,也就是“目标每次安装费用”,同时设置每日推广支出预算。

(3)选择目标地区—让我们知道你希望触达哪些区域的用户。

(4)设定用户行动—决定你希望用户要做什么,比如安装,应用内操作或者目标广告支出回报率 (ROAS)。

8. 更新应用版本号

每个应用默认的初始版本号是 1.0.0。若要更新它,请转到 pubspec.yaml 文件并更新以下内容:

version: 1.0.0+1

版本号由三个点分隔的数字组成,例如上面样例中的 1.0.0。然后是可选的构建号,例如上面样例中的 1,以 + 分隔。

版本号与构建号都可以在 Flutter 打包时分别使用 --build-name 和 --build-number 重新指定。

在 Android 中,当 build-number 被用作 versionCode 时 build-name 作为 versionName 使用。更多信息请参考 Android 文档中的 为你的应用添加版本。

9. Android发布常见问题

这里是一些关于安卓应用程序发布的常见问题。

9.1 我应该什么时候构建 app bundles 而不是 APKs?

Google Play Store 相对于 APKs 更建议你发布 app bundles,因为那样应用程序会更有效率地交付给你的用户。但是,如果你想将应用程序发布到其他的应用商店, APK可能是唯一选项。

9.2 什么是 fat APK?

一个 fat APK 是一个包含了支持多个 ABI 架构的 APK 文件。这样做的好处是单个 APK 可以运行在多个架构上,因此具有更广泛的兼容性。但同时缺点就是文件体积会比较大,导致用户在安装你的应用程序时会下载和储存更多的字节。当构建 APKs 而不是 app bundles 时强烈建议分开构建 APKs,如 build an APK 所描述的那样,使用 --split-per-abi 指令。

9.3 哪些目标架构是被支持的?

当使用 release 模式构建你的应用程序时, Flutter app 可以基于 armeabi-v7a (32-bit) 和 arm64-v8a (64-bit)被编译。Flutter 目前不支持 x86 Android (参考 Issue 9253).

9.4 如何使用 Android Studio 构建一个发布?

在Android Studio中, 打开你的 app 文件夹下的 android/ 文件夹. 然后在项目面板中选择 build.gradle (Module: app) :

c71f09966dd80dbf30de479e7ae9c902.png

接下来,选择构建变体。在主菜单中点击 Build > Select Build Variant。从 Build Variants 面板中选择任意一个变体(默认是 debug)。

ed8262f54e4efe3a36d5dfc7826ab516.png

生成的 app bundle 或 APK 文件会在你的 app 所在文件夹下的 build/app/outputs 文件夹下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

西安单招学校学计算机软件的,西北大学软件职业技术学院单招

西北大学肇始于1902年的陕西大学堂和京师大学堂速成科仕学馆,1912年始称西北大学,1978年被确定为全国重点大学。现为国家“211工程”建设院校、教育部与陕西省共建高校。在长期的办学历程中,西北大学形成了“发扬民族精神,融合世界…

autojs遍历当前页面所有控件_PyQT5控件:容器(Containers Widgets)

QWidget主窗体容器 在Qt设计师中新建文件,选择QWidget QWidget属性 enabled 窗口部件是否有效geometry 窗口部件相对于其父窗口的几何图形,并排除窗口框架sizePolicy 窗口部件的默认布局行为minimumSize 窗口部部件的最小尺寸(以像素为单位&a…

JAVA 技术类分享(一)

一、dubbo dubbo原理模型? 主要是注册中心,服务提供者,服务消费者,监控中心,其中后者可有可无。1.服务端,在注册中心注册自己提供的服务,并暴露端口,2.客户端在注册中心注册&#xf…

计算机的就业指导论文,计算机就业指导期刊文章参考文献 计算机就业指导专著类参考文献有哪些...

为论文写作提供【100个】计算机就业指导期刊文章参考文献,海量计算机就业指导相关论文参考文献,包括期刊,专著,外文参考文献,解决您的计算机就业指导专著类参考文献有哪些的相关难题!一、计算机就业指导论文参考文献范文[1]“基于就业岗位需求”的专业课程体系建设的…

junit rule_使用JUnit的ExpectedException和@Rule测试自定义异常

junit rule异常测试 为什么要测试异常流? 就像所有代码一样,测试覆盖率在代码和应该产生的业务功能之间写了一个合同,从而为您提供了代码的有效文档 ,以及可以尽早且经常强调功能的附加功能。 我不会介绍测试的许多好处&#xff0…

经纬度1秒约等于多少米?

WGS84坐标系统下(通常我们采用的GPS内的坐标系统) 如果是中国常用的WGS1984的经纬度坐标,1秒相当于33米。具体如下: 经度1度85.39km 经度1分 1.42km 经度1秒 23.6m 纬度1度 大约111km 纬度1分 大约1.85km 纬度1秒 大约30.9m

学计算机单招可以报那几个公立学校,为什么要选择公办单招学校,四川公办单招学校有哪些?...

高职单招单招被称为春季高考,在四川参加单招考试的学生逐年上升,周时参加单招的高职院校也越来越多。但是单招不像是高考可以通过不同的志愿,来填报多所学校。单招只能选择某一个学校,一旦确定就不能更改。这样的结果就是选择学校…

AutoValue:生成的不可变值类

Google GitHub托管的项目AutoValue之所以有趣,有多种原因。 该项目不仅使为“ 值对象 ”编写更少的Java代码变得容易,而且还为Java注释处理的实际应用提供了概念上简单的演示。 该自动/值项目是由提供谷歌的员工凯文Bourrillion和埃蒙麦克马纳斯和许可与…

exit(0)与exit(1)、return区别

exit(0):正常运行程序并退出程序; exit(1):非正常运行导致退出程序; return():返回函数,若在主函数中,则会退出函数并返回…

上海教师计算机等级要求,计算机考试阅卷教师谈等级考试

等级考试笔试是由选择题和填空题两大部分组成。选择题是由阅卷系统改卷,而填空题是由阅卷教师评阅,下面我们就从分析阅卷的得分丢分情况来谈谈如何让阅卷教师在公平、公正的前提下尽可能的给予"高分",让考生尽量避免不必要的"…

C++读取文本文件中以TAB作为分隔符,且中间字段有为空的情况的方法?

数据文件:testData.txt 内容: 111 222 444 555思路: getline()将testData.txt中的第一行记录读入到一个string中,然后搜索第n个分隔符进行定位,判断第n个字段长度,使用substr&#x…

宿迁学计算机的学校,宿迁计算机学校

01、宿迁计算机学校培养目标培养学生具有基本的审美能力,利用常用的平面设计软件进行多媒体产品开发、广告设计与创意、印刷品的设计、展览展示等能力,能够从事多媒体产品开发,广告设计与创意,印刷品的设计,展览展示等…

javaone_JavaOne 2012:调查JVM水晶球

javaone我周一回到了希尔顿的A / B广场参加第四届会议,但首先去了希尔顿的顶层收拾午餐。 我每年都在JavaOne的第一天被提醒,对于参与的每个人来说,第一天的午餐获取过程令人惊讶地令人沮丧。 我知道我在JavaOne的第一年的经历使我有些困惑&a…

VS2008编译boost库

一、下载 首先从boost官方主页http://www.boost.org/下载最新版boost安装包,我用的版本是boost.1.49.0 二、新建文件夹 如果是使用下载的安装包,那么请将boost安装包解压至本地新建的目录,如:F:\boost 三、编译 (1&am…

rtk采点后如何导入cad_【干货】RTK实操视频:工程之星5.0操作攻略!(第五部分)...

前期回顾:【干货】RTK实操视频:工程之星5.0操作攻略!(第一部分)【干货】RTK实操视频:工程之星5.0操作教程(第二部分)【干货】RTK实操视频:工程之星5.0操作攻略!(第三部分)【干货】RTK实操视频:工…

Git----分支管理之分支管理策略04

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。 如果要强制禁用Fast forward模式,Git就会在merge时生产一个新的commit,这样&#xf…

测试英语语法的软件,1Checker,一款实用的英语语法检测软件

语法检测软件众多,使用最顺手的是1Checker。因为工作原因,每两年都要发表至少一篇英文期刊,可我的英文水平写专业论文很欠缺,又不愿意花钱找人翻译检测。就在网上寻找相关的软件,1Checker不是我第一个使用的语法检测软…

企业是否应该实现对客户需求的快速响应_如何做好企业服务?

2018 年,企业级服务仍处于高速增长时期。经过几年的市场洗礼后,企业级服务的市场格局正在逐步明朗。无论是垂直型还是通用型的企业级服务厂商,公司发展核心问题主要围绕客户满意度、产品成熟度、企业健康度三方面:①产品成熟度。成熟的 B 端产…

JavaScript的匿名函数

匿名函数&#xff0c;没有函数名的函数&#xff0c;这种函数一般使用变量来存放。匿名函数的声明方式类似普通函数&#xff0c;一般使用变量保存起来。 示例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"…

OpenMap教程5 – 3层GIS应用程序

1.简介 欢迎使用OpenMap系列教程的第5个教程。 OpenMap是一个免费的开源Java GIS库。 这是以前的教程列表&#xff1a; 在第一个教程中&#xff0c;我们创建了一个基本的OpenMap GIS应用程序&#xff0c;该应用程序在JFrame中显示一个从文件系统加载的具有一个形状图层的地图…