项目构建设置

应用程序的构建时属性使用可选的 `build.settings` 文件定义,该文件使用 Lua 语法编写,应放置在项目的根目录中。

注意

本指南概述了 Solar2D 支持的各种平台上应用程序最常见的构建设置。对于需要更高级设置的开发者,请参阅高级构建设置指南,了解可用的选项。

重要

基本结构

至少,`build.settings` 文件应包含一个 `settings` 表,该表将包含各种子表来指示构建时选项。

settings =
{
    -- Child tables here
}

应用方向

`build.settings` 文件可用于设置应用程序方向与设备在空间中的物理方向的关系 — 这包括自动方向如果设备在运行时旋转或翻转,则由加速度计触发。

重要

请注意,有三种不同的方向设置:

  1. 启动画面(请参阅下面的启动画面)。
  2. 原生 UI 元素,例如警报和虚拟键盘。
  3. 显示舞台本身。

所有方向设置都必须包含在 `settings` 中的 `orientation` 表中。

settings =
{
    orientation =
    {
        -- Parameters
    },
}

在 `orientation` 表中,有两个可选键值:`default` 和 `supported`。

settings =
{
    orientation =
    {
        default = "",    -- Initial launch orientation
        supported = {},  -- Table of allowed options for auto-orientation
    },
}

它们分别接受以下**方向约定**:

名称 方向
`"portrait"` 设备处于垂直位置,Home 键位于底部
`"portraitUpsideDown"` 设备处于垂直位置,Home 键位于顶部
`"landscapeLeft"` 设备处于水平位置,Home 键位于左侧
`"landscapeRight"` 设备处于水平位置,Home 键位于右侧

自动方向

在大多数设备上,如果设备在运行时旋转或翻转,**自动方向**将由加速度计触发。如果要将应用程序限制为横向,请在 `supported` 表中同时指定 `"landscapeLeft"` 和 `"landscapeRight"`。

supported = { "landscapeLeft", "landscapeRight" },

同样,要将应用程序限制为纵向,请同时指定 `"portrait"` 和 `"portraitUpsideDown"`。

supported = { "portrait", "portraitUpsideDown" },
重要
  1. 当设备方向改变时,显示舞台上的**坐标位置** `(0,0)` 将对应于当前方向的左上角。

  2. **iPad** 忽略 `default` 设置,并尝试以设备当前的物理方向启动,假设该方向在支持列表中指定。

  3. 如果需要检测当前设备方向,可以从system.orientation 属性读取。这将提供上述四个标准约定中的一个值。此外,iOS 设备可能会报告 `"faceUp"` 或 `"faceDown"` 方向。

iOS 构建设置

在 `settings` 表中,可以包含嵌套在 `iphone` 表中的 `plist` 表。此 `plist` 表用于设置已编译应用程序的 `Info.plist` 文件的值。

settings =
{
    iphone =
    {
        plist =
        {
            CFBundleIconFiles = {},  -- Required!
            UILaunchStoryboardName = "LaunchScreen",  -- Required!
            UIStatusBarHidden = true,
            CFBundleDisplayName = "Solar2D App",
            CFBundleName = "Solar2D App",
        },
    },
}
重要
  • `iphone` 表包含**所有** iOS 设备,而不仅仅是 iPhone 设备。

  • 对于 `plist` 键中的布尔值,请使用Lua 风格的布尔值(`true` 或 `false`),而不是Objective-C 风格的布尔值(`YES` 或 `NO`)。.

在上面的示例中,显示了一些常见的 `plist` 键:

有关支持的值以及如何使用它们的更多信息,请参阅 Apple 的文档

权限

在 iOS 上,访问某些硬件或操作系统级功能时,必须告知用户这样做的原因。这是通过在 `build.settings` 的 `plist` 表中包含特定键/描述来实现的。例如:

settings =
{
    iphone =
    {
        plist =
        {
            NSCameraUsageDescription = "This app would like to access the camera.",
            NSPhotoLibraryUsageDescription = "This app would like to access the photo library.",
            NSPhotoLibraryAddUsageDescription = "This app would like to add the photo library.",
        },
    },
}

当系统提示用户允许访问时,关联的描述将作为警报的一部分显示。请注意,可以根据您的喜好自定义描述,甚至可以对其进行本地化(指南)。

重要

以下 API 受 iOS 权限的影响,因此如果使用以下任何命令,则应在关联的 API 文档中包含注明的权限键:

高级构建设置

除了上面提到的 iOS 设置之外,高级构建设置指南中还概述了以下构建选项:

设置/功能 用途
设备功能 用于将应用程序限制为安装在具有特定功能的设备上。
PNG 处理 用于在构建时绕过 PNG 文件处理(`pngcrush`)。

Android 构建设置

在 `settings` 表中,可以包含 `android` 表来控制 Android 设备的构建设置。

settings =
{
    android =
    {

    },
}

版本号

可以使用 `build.settings` 文件中的可选 `versionCode`键值对覆盖输入到模拟器**构建 Android** 框中的**版本号**。这是一个内部数字,用于区分 Android 应用商店的应用程序版本,对应于此处详述的 `versionCode` 项。此设置对用户不可见。

settings
{
    android =
    {
        versionCode = "11",
    },
}
注意

版本号必须指定为**整数** — 它不能包含任何小数点。一种可能的方案是将版本 **1.0** 的 `versionCode` 设置为 `"10"`。下一个更新将是版本 **1.1** 的 `"11"`,依此类推。

权限

`usesPermissions` 表在 `AndroidManifest.xml` 文件中创建`<uses-permission>`标签。

settings
{
    android =
    {
        usesPermissions =
        {
            "android.permission.INTERNET",
            "android.permission.WRITE_EXTERNAL_STORAGE",
            "android.permission.ACCESS_FINE_LOCATION",
            "android.permission.ACCESS_COARSE_LOCATION",
        },
    },
}

在上面的示例中,展示了一些有用的 `android.permission` 键:

  • `"android.permission.INTERNET"` — 允许应用程序访问 Internet。
  • `"android.permission.WRITE_EXTERNAL_STORAGE"` — 允许 `media.save()` 和相机支持。
  • `"android.permission.ACCESS_FINE_LOCATION"` — 允许访问 GPS。
  • `"android.permission.ACCESS_COARSE_LOCATION"` — 允许从 WiFi/蜂窝网络获取位置。

有关支持的值以及如何使用它们的更多信息,请参阅 Android文档

应用功能

`usesFeatures` 表在 `AndroidManifest.xml` 文件中创建`<uses-feature>`标签。这些参数告诉 Android 应用商店应用程序需要或不需要哪些硬件/软件功能。有关支持的值列表,请参阅 Android功能参考

settings
{
    android =
    {
        usesFeatures =
        {
            { name="android.hardware.camera", required=true },
            { name="android.hardware.location", required=false },
            { name="android.hardware.location.gps", required=false },
        },
    },
}
重要

如果**需要**某个功能(`required=true`),则缺少该功能的设备将无法下载或购买该应用程序。作为预防措施,如果您的应用程序将该功能用于某些方面,但不需要它用于“基本功能”,则应在 `usesFeatures` 表中包含该功能,但将其 `required` 键设置为 `false`。

{ name="android.hardware.camera", required=false },

扩展文件

`usesExpansionFile` 布尔值指示是否应使用扩展文件构建应用程序。如果设置为 `true` 并且构建目标是 Google Play,则项目目录中除 Lua 脚本之外的所有内容都将放入扩展文件中。有关详细信息,请参阅 Android文档

settings =
{
    android =
    {
        -- This tells the Simulator to create an expansion file
        usesExpansionFile = true,

        -- The following permissions are required to download expansion files
        usesPermissions =
        {
            "android.permission.INTERNET",
            "com.android.vending.CHECK_LICENSE",
            "android.permission.WRITE_EXTERNAL_STORAGE",
        },
    },
}

使用扩展文件需要设置 Google 许可。有关详细信息,请参阅此处

高级构建设置

除了上面提到的 Android 设置之外,高级构建设置指南中还概述了以下构建选项:

设置/功能 用途
最低 SDK 版本 允许您将应用程序排除在安装在具有较旧 Android 版本的设备上。
Android TV 如果要将应用程序部署到 Android TV,则为必需。
屏幕支持 指定/限制 Android 应用程序支持的屏幕。
禁用文件访问 用于阻止对应用程序文件的所有访问。
大堆 请求 Android 操作系统为您的应用程序提供更多堆内存。
Android 指令 用于微调应用程序中的 `AndroidManifest.xml`。

桌面构建设置

对于 macOS 桌面或 Win32 桌面应用程序,`build.settings` 文件支持 `window` 表来自定义应用程序的桌面窗口。

settings =
{
    window =
    {

    },
}

请参阅 创建 macOS 桌面应用程序创建 Win32 桌面应用程序 中的示例,了解详细信息以及可接受的 window 参数的完整列表。

插件

Solar2D 提供了几个可在您的项目中使用的 插件。 这些插件可以通过嵌套在 settings 表中的 plugins 表来包含。

settings =
{
    plugins =
    {

    }, 
}

例如,Google Play 游戏服务 插件可以按如下方式包含:

settings =
{
    plugins =
    {
        ["plugin.gpgs"] =
        {
            publisherId = "com.coronalabs"
        },
    }, 
}
重要

插件键名通常包含标点符号,例如 plugin.gpgs。 在这些情况下,您必须使用“括号和引号”方法来定义键 (["plugin.gpgs"])。

自定义应用图标

在部署应用程序之前,您应该为目标平台设计合适的**应用程序图标**。

iOS

对于 iOS,需要几个图标文件。 请参阅 管理 Xcode 资源 指南,了解有关 Images.xcassets 文件夹以及如何在您的应用程序中包含/引用它的参考。

Android

重要

Google 已经改变了 Android 8 及更高版本中使用自适应图标管理 Android 图标的方式。 从每日构建版本 2019.3504 及更高版本开始,现在使用 AndroidResources 文件夹处理图标。 请参阅我们的 自适应图标 指南了解更多信息。

对于 Android,图标文件将在构建期间复制到 .apk 中,假设它们在您的根项目文件夹中可用(与 main.lua 一起)。 这些图标应遵循下面列出的标准 Android 图标名称和大小。 有关创建图标的详细信息,请参阅 Android 图标设计指南

文件 大小 (宽×高)
Icon-xxxhdpi.png 192 × 192
Icon-xxhdpi.png 144 × 144
Icon-xhdpi.png 96 × 96
Icon-hdpi.png 72 × 72
Icon-mdpi.png 48 × 48
Icon-ldpi.png 36 × 36

桌面

桌面应用程序 — 为 macOS 或 Windows 构建的应用程序 — 需要以下附加图标

  • 对于 macOS 桌面应用程序,您必须添加一个Icon-osx.icns文件到您的项目文件夹,然后通过模拟器执行 macOS 构建。 此文件应包含多个不同分辨率的图像,捆绑到一个 .icns 文件中(详情)。 请参阅 创建 macOS 桌面应用程序 指南了解更多信息。

  • 对于 Windows 桌面应用程序,您必须添加一个Icon-win32.ico文件到您的项目文件夹,然后通过模拟器执行 Win32 构建。 此文件应包含多个不同分辨率的图像,捆绑到一个 .ico 文件中(详情)。 请参阅 创建 Win32 桌面应用程序 指南了解更多信息。

tvOS / Android TV

为电视系统设计的应用程序需要额外的图标

  • 对于 Apple 的 tvOS,需要几个独特的图标和资源。 请参阅 管理 Xcode 资源 指南,了解有关 Images.xcassets 文件夹以及如何在您的应用程序中包含/引用它的参考。

  • 对于 Android TV,您应该在项目文件夹中包含一个Banner-xhdpi.png图像。 此图像的大小应为 320×180 像素。

启动画面

默认情况下,应用程序打开时将出现 Solar2D 品牌的启动画面。 可以自定义或禁用此启动画面。

注意
  • 在 iOS 上,假设未禁用启动画面,则 iOS 启动画面将在启动画面之前出现。 如果禁用了启动画面,启动画面将一直显示到应用程序完全加载,然后您的第一个屏幕/场景将出现。

自定义

如果您想显示自己的自定义启动画面,请在上面的 build.settings 中包含 splashScreen 表,但将 enable 键设置为 true 并添加一个定义图像名称的 image 键。 例如:

settings =
{
    splashScreen = 
    {
        enable = true,
        image = "mySplashScreen.png"
    },
}

或者,您可以自定义启动画面基于每个平台如下

settings =
{
    splashScreen =
    {
        ios = {
            enable = true,
            image = "mySplashScreen_iOS.png"
        },
        android = {
            enable = true,
            image = "mySplashScreen_Android.png"
        }
    },
}

对于自定义实现,image 指示项目中任何图像文件的路径。 图像将显示在黑色背景上,它将与应用程序的默认方向匹配,并缩放以适合当前设备的屏幕。 您可能需要进行试验才能获得理想的启动画面图像,但如果它足够大以适用于您的应用程序将在其上运行的最大设备,则您只需要一个图像。

注意

由于 build.settings 不适用于通过 Solar2D Native 执行的应用程序构建,因此需要特殊处理才能在这些实例中自定义启动画面

  • 对于 iOS,请在应用程序包的根目录中放置一个名为 _CoronaSplashScreen.png 的图像,并在 Xcode 中将其指定为“资源”。

  • 对于 Android,请使用 Android Studio 或其他合适的机制将名为 _corona_splash_screen.png 的图像放置在 res/drawable/ 中。

移除

要删除默认启动画面,请将 splashScreen 表添加到项目的 build.settings 中,并将 enable 键设置为 false

settings =
{
    splashScreen = 
    {
        enable = false
    },
}

或者,您可以删除启动画面基于每个平台如下

settings =
{
    splashScreen =
    {
        ios = {
            enable = false
        },
        android = {
            enable = true
        }
    },
}

启动屏幕 — iOS

对于 iOS,您必须包含某种形式的**启动画面**支持。 Apple 建议您为此使用Xcode 生成的故事板,因为单个故事板灵活且适用于所有设备上的所有启动画面。

为方便起见,默认的(空白)LaunchScreen.storyboardc 文档会自动添加到所有新项目模板中。 同一文件也与应用程序本身捆绑在一起,以防您需要将其复制到现有项目中。 它可以在 Solar2D 应用程序文件夹中的以下位置找到

/Applications/Corona/Resources/Resource Library/iOS/LaunchScreen.storyboardc

可以使用您自己的图像/布局自定义 Xcode 故事板文档 — 请参阅我们的 指南 获取说明。

重要

如果您在现有项目中使用默认的 LaunchScreen.storyboardc 文件,则**必须**在 plist 表中包含 UILaunchStoryboardName 键,以便 iOS 识别该文件的存在。 请注意,键的值 ("LaunchScreen") 与文件名本身匹配,但不包括文件扩展名

settings =
{
    iphone =
    {
        plist =
        {
            UILaunchStoryboardName = "LaunchScreen",  -- Required!
        },
    },
}

排除文件

排除文件是 Solar2D 的一项功能 — 它不适用于 Solar2D Native 构建。

更复杂的应用程序可能具有一些在一个平台上需要但在另一个平台上不需要的文件。 例如,每个平台的图标文件都不同,您可能只想在每个平台上包含适当的文件。 这不是 Solar2D 自动处理的事情,因为文件命名可能会有所不同,并且无法预测独特的情况。 大多数开发人员不需要指定应从构建中排除的文件,但如果需要,可以使用该选项。

要排除的文件是指定的基于每个平台 — iosandroidmacoswin32tvosall使用简单的模式匹配,其中 * 表示任何字符串,有时包括 /。 换句话说,这些模式将应用程序包中文件的路径名作为字符串进行匹配。 这通常仅在您具有复杂目录结构,并且在不同级别上具有多个同名目录实例时才重要,例如 a/musica/b/musica/b/c/music 等。请注意,即使在 Windows 上构建,目录分隔符也始终是正斜杠 /

文件排除是一项强大的功能,如果您不明智地使用此过程并意外排除了对其操作至关重要的文件,则可能会损坏您的应用程序包。 对 excludeFiles 设置进行任何更改后,请在下次构建期间仔细监控控制台并注意任何问题。 您还应该仔细检查应用程序包的内容,并检查究竟包含哪些文件。

考虑以下有关如何排除各种文件名和类型的示例

settings =
{
    excludeFiles =
    {
        -- Exclude unnecessary icon assets from all builds
        all = { "Icon*.png", "Images.xcassets", "Icon*.ico", "Icon*.icns" },
    },
}
settings =
{
    excludeFiles =
    {
        -- Exclude iOS launch screen bundle on Android devices
        android = { "LaunchScreen.storyboardc" },
    },
}
settings =
{
    excludeFiles =
    {
        -- Exclude all files at all paths which end with "secret.txt"
        all = { "*secret.txt" },
    },
}
settings =
{
    excludeFiles =
    {
        -- Exclude all .aac files in the "music" directory on Android devices
        android = { "music/*.aac" },
        -- Exclude all .ogg files in the "music" directory on iOS devices
        ios = { "music/*.ogg" },
    },
}
settings =
{
    excludeFiles =
    {
        -- Exclude unnecessary assets from macOS desktop apps
        macos = { "Icon*.ico" },
        -- Exclude unnecessary assets from Win32 desktop apps
        win32 = { "Icon*.icns" },
    },
}