[Unity]Unity跨平台开发之Android简介
Android要求和兼容
图形接口支持
注意:
新的 Unity 项目默认不支持 OpenGL ES 2.0。
由于硬件和图形 API 的限制,并非所有渲染管道都与 Android 兼容。
图片压缩
Android标准压缩格式是ETC和ASTC。Unity默认压缩格式是ASTC。如果Android设备不支持您选择的压缩格式,Unity会在运行时对其进行解压缩。这会增加内存使用量并降低渲染速度。
可以在Android Player Settings或者Android Build Settings里修改图片压缩格式。
Build Settings的设置优先于Player Settings。
Gradle for Android
版本兼容
Unity版本 | Gradle版本 | Android Gradle plug-in version |
2022.3.38f1+ | 7.5.1 | 7.4.2 |
2022.2.0a18 - 2022.3.37f1 | 7.2 | 7.1.2 |
2022.2.0a1 - 2022.2.0a17 | 6.1.1 | 4.0.1 |
Gradle 版本和 Unity 版本之间的兼容性。
If you want to use a custom Gradle or Android Gradle plug-in version, it’s important to know the version compatibility between Gradle and the Android Gradle plug-in. For information on this, refer to Update Gradle.
如果您想使用自定义Gradle或Android Gradle插件版本,了解Gradle和Android Gradle插件之间的版本兼容性非常重要。有关此信息,请参阅更新Gradle。
Gradle 项目结构(Gradle project structure)
文件 | 描述 |
launcher | 包含启动器模块及其相关所有内容的目录。 |
src | 包含启动器模块源代码和资源的标准 Android Gradle 项目目录。Unity 将源代码和资源放在main子目录中。 |
main | 包含启动器模块源代码和资源的标准 Android Gradle 项目目录。Unity 仅支持main source set。有关source sets的更多信息,请参阅Create source sets。 |
res | 包含要包含在最终应用中的资源的标准 Android Gradle 项目目录。这些资源包括应用图标、应用在运行时访问的文本以及应用样式描述。 要指定此目录中的资源,请在 Android 播放器设置中设置应用图标和项目名称。 |
AndroidManifest.xml | Unity合并到最终Android App Manifest的标准Android Gradle项目文件。它包含特定于启动器模块的设置。 重要提示:如果多个清单文件为同一设置指定了不同的值,则清单合并过程会失败,您必须手动修复。您可以为清单合并指定规则,以自动决定如何解决合并冲突。有关如何执行此操作的信息,请参阅管理清单文件。 有关如何影响此文件内容的信息,请参阅覆盖Android应用清单。 |
build.gradle | 一个标准的Gradle项目build.gradle文件,它描述了如何构建启动器模块,并包含要包含在构建中的依赖项列表。在Unity中,启动器模块依赖于unityLibrary模块,这意味着在构建启动器模块时,unityLibrary会被构建并包含在最终结果中。 要影响此文件的内容,请提供自定义启动器Gradle模板。 |
unityLibrary | 包含unityLibrary模块及其相关的所有内容的目录。 |
libs | 一个通用的Android Gradle项目目录,用于存储unityLibrary模块的Android Archive (.aar)和Java Archive (.jar) 插件。 对于导出的Unity项目,此目录包含unity-classes.jar以及Unity项目中的所有.jar和.aar插件。 注意:此目录不包含Android Library Projects插件。相反,Unity 会将这些插件作为单独的模块复制到Gradle项目中。 |
unity-classes.jar | Unity特定的Java插件,包含Unity引擎使用的Java代码。 |
src | 包含unityLibrary模块源代码和资源的标准Android Gradle项目目录。Unity将源代码和资源放在main子目录中。 |
main | 包含unityLibrary模块源代码和资源的标准Android Gradle项目目录。Unity仅支持主源集(main source set)。有关源集的更多信息,请参阅创建源集。 |
assets | 包含项目资产的标准Android Gradle目录。Unity将Unity项目的资源放在bin子目录中。 |
bin | 放置Unity所有项目资源的目录。 |
java | 用来放置unityLibrary模块未编译的Java源文件。Unity仅使用此目录来存储UnityPlayerActivity 源文件。有关如何扩展UnityPlayerActivity的信息,请参阅扩展UnityPlayerActivity Java代码。 |
jniLibs | 包含unityLibrary模块使用的原生代码库的标准Android Gradle 项目目录。Unity将libil2cpp、libmain和libunity Unity引擎库放在此目录中。Unity 还将所有原生 (C++) 插件放在此目录中。 |
jniStaticLibs | 一个标准的Android项目目录,其中包含unityLibrary模块用于创建libil2cpp.so的baselib.a库。 |
res | 包含要包含在最终应用中的资源的标准Android Gradle项目目录。对于导出的Unity项目,unityLibrary模块的res目录仅包含 unityLibrary模块使用的样式描述。 |
AndroidManifest.xml | Unity合并到最终Android应用清单中的标准Android Gradle项目文件。它包含特定于unityLibrary模块的设置。 要影响此文件的内容,请提供自定义的自定义主清单。 |
symbols | 如果您选择通过Create symbol.zip构建设置为应用生成符号文件,则Unity会添加此目录。此目录包含包含调试元数据的文件以及 Unity库的符号表部分。您可以在Android Studio中设置目录路径,以在调试期间解析函数名称。 |
build.gradle | 标准Gradle项目build.gradle文件,描述如何构建unityLibrary模块并包含要包含在构建中的依赖项列表。在Unity中,unityLibrary 模块依赖于Unity项目中的所有插件。 要影响此文件的内容,请提供自定义Main Gradle模板。 |
proguard-unity.txt | 一个Unity专用文件,其中包含Unity Java代码(unity-classes.jar 插件中的代码)的ProGuard(混淆)配置。在播放器设置中启用 Minification时(或通过手动修改gradle构建文件启用 Minification)配置有效。 |
build.gradle | 影响Gradle项目中所有模块的基础Gradle文件。它指定在此 Gradle项目中使用哪些插件版本。其中一个插件是Android Gradle 插件。 要影响此文件的内容,请提供自定义Base Gradle模板。 |
proguard-user.txt | 这是Unity项目特定的文件,其中包含项目的Java代码和第三方 Java插件的ProGuard配置。就像ProGuard-unity.txt 一样,如果您启用最小化,Gradle会使用它。 要创建此文件,请在Android播放器设置中启用自定义Proguard 文件。 |
gradle.properties | 一个标准的 Gradle 项目文件,用于配置如何构建应用程序。此文件包含以下特定于 Unity 的属性: • unityStreamingAssets:表示 Streaming Assets 目录中的资产名称。Unity 指定这些资产应位于最终应用程序中,并且 Gradle 不应压缩它们。 • unityTemplateVersion:指定 Unity 使用的 Gradle 模板文件的版本。如果您项目的 Gradle 模板版本与指定的版本不同,Unity 会抛出错误,通知您更新 Gradle 文件并在空文件夹中构建项目。 • unityProjectPath:指定 Unity 项目的路径。 有关此文件可以包含的 Gradle属性的信息,请参阅 Gradle 属性文件。 要影响此文件的内容,请提供自定义Gradle属性模板。 |
local.properties | 配置构建系统环境的标准Android Gradle项目文件。Unity在此处指定SDK的路径,以便默认情况下,导出的Gradle项目使用与 Unity Editor相同的SDK。以前的Gradle版本也在此处指定NDK 路径,但现在Unity在启动器和unityLibrary模块的build.gradle 文件中指定它。 有关此文件可以包含的属性的信息,请参阅Gradle属性文件。 |
settings.gradle | 一个标准的Android Gradle项目文件,指定组成此Android Gradle 项目的所有模块。在Unity导出的项目中,这通常仅指定启动器和 unityLibrary模块。但是,如果Unity项目使用Play Asset Delivery,则每个资产包都是一个单独的模块,因此此文件也会列出它们。该文件还指定包含Gradle项目插件的位置。这些位置是此项目内的在线存储库和Java插件的组合。 要影响此文件的内容,请提供自定义Gradle设置模板。 |
安卓应用清单(Android App Manifest)
Android应用清单包含有关Android应用的信息。每个应用在源集的根目录中都有一个名为 AndroidManifest.xml的Android应用清单XML文件。Android操作系统和数字分发服务(例如Google Play)使用Android应用清单查找信息,例如应用的名称、应用的入口点、Android 版本支持、硬件功能支持和应用权限。有关Android应用清单文件的更多信息以及它配置的设置列表,请参阅Android开发者文档中的Android应用清单。
为了生成一个Android App Manifest,构建合并了Unity Library Manifest、Unity Launcher Manifest、Plug-in manifests(AAR、Android库文件等插件)。
生成应用清单(Generating an Android App Manifest)
- Unity使用Unity库清单作为Android应用清单的模板。如果您覆盖Unity库清单,Unity 将使用您指定的文件作为模板。
- Unity使用权限(permissions)、配置选项以及应用程序使用的功能等信息来更新Unity 库清单和Unity启动器清单文件。
- Gradle将Unity库清单、Unity启动器清单和插件清单合并到一个Android应用清单文件中。
您可以使用Android Studio APK分析器或其他第三方工具(如Apktool)查看输出的Android App Bundle(AAB)或Android Package(APK)内的Android App Manifest文件。
重要提示:您无法编辑APK或AAB中的Android应用清单文件。有关如何覆盖 Android 应用清单内容的信息,请参阅覆盖Android应用清单。
权限(Permissions)
Unity会根据Android Player Settings或者Unity代码内的API将所需的权限加入清单中,比如网络权限、震动权限等。
假如一个插件声明了一个权限,Unity也会将其加入构建后的清单内。
您也可以使用运行时权限系统在运行时申请权限,来代替在清单中声明权限的操作。
Unity库清单(Unity Library Manifest)
Unity库清单是Unity主要的清单,包含有关Unity播放器及其Activity的信息。Unity在构建过程中使用默认的Unity库清单来为应用程序生成最终的Android应用清单。您可以使用自己的清单文件覆盖此清单,以便更好地控制Unity生成的Android应用清单。有关更多信息,请参阅覆盖Android应用清单。
更多关于Android应用权限相关的内容。
Unity库清单声明:
- Unity Activity。
- Unity Activity使用的主题。
- 权限。
- VR模式。
- VR性能。
- 是否允许用户调整应用程序窗口的大小。这对VR和ChromeOS很有用。
- 最大纵横比。
- 如何响应配置更改。
- 支持的方向。
- 支持的启动模式。
注意:Unity 仅支持 singleTask 启动模式。
- Android UI。
- 是否使用硬件加速。
- 应用程序使用哪些功能,例如游戏手柄或触摸屏。
- 应用程序支持哪些图形API。
- 应用程序是否支持设备上的异形屏(刘海挖孔等)。
- 初始窗口大小。
- 应用程序支持哪些窗口模式。这对ChromeOS很有用。
- 启动画面配置。
- 安装应用程序时是否提取本机库。
- 应用程序可以在哪些设备上运行。
Unity启动器清单(Unity Launcher Manifest)
Unity Launcher Manifest配置应用程序启动前的外观和行为。例如,它包含应用程序的图标、名称和安装位置。Unity Launcher Manifest是Unity特有的Android 开发概念,您可以覆盖它以将Unity作为组件集成到现有项目中。有关更多信息,请参阅将Unity集成到Android 应用程序中。
Unity启动器清单声明:
- Package Name。
- 应用程序的图标。
- 应用程序的名称。
- 应用程序启动时的Activity和它的意图(intents)。
- 应用程序的安装位置。
- 应用程序支持的屏幕尺寸。
- 应用程序isGame的标识。
注意:此设置仅供 AndroidTV 使用。如果您未在播放器设置中启用 AndroidTV 支持,则 Unity 不会声明此设置。
如何构建Android应用
构建过程
- Unity从项目内收集资源、代码库、插件、Gradle模板和manifest模板来创建一个合法的Gradle工程。
- Unity通过获取Player Settings和Build Settings的内容来更新Gradle模板和manifest模板上对应的值。
- 如果选择导出Android工程,Unity会使用IL2CPP脚本后端(scripting backend)将C#代码转换为C++源文件放在Gradle工程内;而如果直接选择打包工程,Unity会直接将其编译为libil2cpp.so库文件放在Gradle工程内。
- Unity为所有实现了IPostGenerateGradleAndroidProject接口的类调用OnPostGenerateGradleAndroidProject方法。您可以在构建Gradle之前,通过这个回调来修改或者移动文件。
- Unity从Gradle 项目中运行Gradle来构建应用程序。Gradle会将Unity库清单(Unity Library Manifes)、Unity启动器清单(Unity Launcher Manifest)和插件清单(plug-in manifests)合并到一个Android应用清单文件中。
增量构建管道
- Unity逐步构建/生成:
- Gradle文件
- 清单文件
- 资产包
- APK扩展文件(obbs)
- 未压缩的资产分割
- Android符号zip文件
- Unity 增量复制:
- 用户二进制文件
- Gradle资源
构建过程的最后一步是运行Gradle。从这一点开始,构建过程不再使用增量构建管道,而是由Gradle来跟踪依赖项。
如果您通过实现回调来修改或移动增量构建管道使用的任何Android文件或资产,请参阅创建非增量构建。
注:文章摘要翻译自Unity官方手册,版本2022.3x。