Read this manual in English

Android 开发

Android 设备允许自由允许你开发的应用. 可以很容易地编译好游戏拷贝到 Android 设备上. 本手册介绍了对于 Android 游戏的打包步骤. 推荐开发时, 从 开发应用 上运行游戏因为可以通过无线连接设备进行代码和内容的热重载.

Android 和 Google Play 签名

Android 要求每个 APK 文件在被安装到设备上或者在设备上更新之前必须进行数字签名. 如果你是安卓开发者, 只需要在把程序包上传到 Play Console 之前, 经过 Play App Signing 的自动处理即可. 然而, 你还可以选择手动对程序包进行签名以便上传到 Google Play, 其他应用商店以及在整个互联网上传播.

从 Defold 编辑器或者 命令行工具 打包安卓包需要提供一个 keystore (包括证书和公匙), 然后对应用签名时还要用到私匙. 没有的话, Defold 会自动生成一个临时调试用 keystore 用于打包和签名.

千万 不要 带着调试签名就上传到 Google Play 上去. 开发者必须自己制作属于自己的签名.

制作 keystore

Defold 应对安卓应用包签名的改变是从 1.2.173 版开始的, 就是使用单独的证书和密码来合成 keystore. 详见论坛帖子.

也可以 使用 Android Studio 或者通过使用控制台命令来生成签名:

keytool -genkey -v -noprompt -dname "CN=John Smith, OU=Area 51, O=US Air Force, L=Unknown, ST=Nevada, C=US" -keystore mykeystore.keystore -storepass 5Up3r_53cR3t -alias myAlias -keyalg RSA -validity 9125

这个命令会生成一个叫做 mykeystore.keystore 的签名, 其中包含了证书和密码. 密匙 5Up3r_53cR3t 保护其不备破解. 这个签名有效期为 25 年 (9125 天). 这个签名的id叫做 myAlias.

要把签名和密匙保存好. 如果要手动上传 Google Play 但是签名密码丢失的话就没办法使用 Google Play 来更新你的应用了. 图省事的话就用 Google Play App Signing 搞定签名吧.

安卓应用打包

编辑器打包安卓包十分方便. 打包之前可以为应用指定图标, 设置版本号等等, 都在 game.project 项目配置文件 里设置.

选择菜单栏 Project ▸ Bundle... ▸ Android Application... 就可以打包了.

要让编辑器自动生成调试用签名, 只需把 KeystoreKeystore password 字段留空即可:

Signing Android bundle

要让编辑器使用你自己指定的签名打包, 就要设置好 KeystoreKeystore password 字段. Keystore 的扩展名是 .keystore, 而密码要保存成文本 .txt 文件. 如果 keystore 里的 key 使用了自己的密码, 也可在 Key password 里指定:

Signing Android bundle

Defold 支持创建 APK 和 AAB 文件. 从打包格式下拉菜单中选择.

点击 Create Bundle 会提示选择打包文件存放位置.

Android Application Package file

Build variants

打包游戏时, 需要选择你想用的引擎类型. 有三个基本类型可以选择:

  • Debug
  • Release
  • Headless

这些类型即是 Build variants

使用 Project ▸ Build 时使用的是 debug 版引擎.

Debug

此版本通常在游戏开发阶段使用, 因为它具有许多有用的调试功能:

  • 分析器 - 用于收集性能和使用计数器. 如何使用分析器参见 分析器教程.
  • 日志 - 日志开启后引擎会记录系统信息, 警告和错误. 引擎也会通过 Lua print() 功能, 原生扩展使用 dmLogInfo(), dmLogError() 之类的功能记录日志. 如何阅读日志参见 游戏和系统日志教程.
  • 热重载 - 热重载是一个强大的功能, 能让开发者在游戏运行时重新载入资源. 如何使用热重载参见 热重载教程.
  • 引擎服务 - 游戏的调试版本可以连结一些开启的 TCP 端口和服务并与之交互. 这些服务包括热重载功能, 远程日志存取和上述的分析器功能, 以及其他一些各种各样的服务. 关于引擎服务参见 开发者教程.

Release

此版本移除调试功能. 准备发布到应用商店时使用此版本. 基于以下原因不推荐发布包含调试功能的游戏:

  • 调试功能会使包体略微变大, 我们应该尽量使发布游戏包体最小.
  • 调试功能也会占用一点 CPU 时长. 这可能使用户的老机型卡顿. 在手机上增加 CPU 使用也会造成过热和电池消耗.
  • 调试功能可能会给用户暴露不应暴露的信息, 无论从安全, 作弊还是欺诈角度.

Headless

此版本没有图像和声音. 也就是说它可以 CI 服务器上进行 unit/smoke 测试, 甚至可以在云端作为服务器程序使用.

安装 Android 应用包

安装 APK

编辑器生成 Android 应用包 .apk 文件. 应用包可以通过 adb 工具安装到设备上, 或者通过 Google Play 开发者控制台 发布到 Google Play 上.

$ adb install Defold\ examples.apk
4826 KB/s (18774344 bytes in 3.798s)
  pkg: /data/local/tmp/my_app.apk
Success

使用编辑器安装 APK

你可以在编辑器的打包对话框中勾选 “Install on connected device” 和 “Launch installed app” 安装并启动 .apk:

Install and Launch APK

为了顺利运行, 你要安装好 ADB 并打开连接设备的 USB debugging. 如果编辑器无法找到 ADB 命令行工具的地址, 你要在 Preferences 中指定好.

安装 AAB

对于 .aab 文件可以通过 Google Play 开发者控制台 上传给 Google Play. 也可以使用 .aab 文件制作 .apk 以便使用 Android 打包工具 在本地安装.

权限

Defold 引擎需要一些权限来运行各种功能. 权限在 AndroidManifest.xml 文件中定义, 并在 game.project 项目配置文件 中配置. 关于 Android 权限详见 官方文档. 默认配置需要如下权限:

android.permission.INTERNET and android.permission.ACCESS_NETWORK_STATE (Protection level: normal)

允许应用打开网络连接访问互联网. 需要上网时需要此权限. 见 (Android 官方文档-网络) 和 (Android 官方文档-网络状态).

android.permission.WAKE_LOCK (Protection level: normal)

允许应用阻止屏幕息屏和调光. 接收通知保持亮屏时需要此权限. ([Android 官方文档-亮屏锁定)

使用 AndroidX

AndroidX 一個較大改動就是, 不再維護 Android Support Library 了. AndroidX 應用使用雲計算功能和新庫完整取代了 Support Library. Asset Portal 裏的绝大多数擴展包已經支持 AndroidX. 如果希望使用旧版安卓库而不是 AndroidX, 可以创建新的 app manifest 文件或在 Defold Manifest 文件里勾選 “Use Android Support lib” 選項.

常见问题

Q: 安卓系统有办法隐藏导航栏和状态栏吗?

A: 有, 在你的 game.project 文件的 Android 部分的 immersive_mode 项. 这项可以使你获得全部的屏幕及屏幕触摸事件.

Q: 在设备上安装 Defold 游戏时总是出现 “Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES]” 错误?

A: 安卓系统发现你的更新app使用了新的证书. 打包调试版本时, 使用的是一个临时证书. 所以在更新版本前要删除旧版本:

$ adb uninstall com.defold.examples
Success
$ adb install Defold\ examples.apk
4826 KB/s (18774344 bytes in 3.798s)
      pkg: /data/local/tmp/Defold examples.apk
Success