> 技术文档 > Unity Android打包全流程解析_unity打包过程

Unity Android打包全流程解析_unity打包过程


文章摘要

Unity构建Android包的流程主要包括五个阶段:首先进行资源打包与预处理,包括场景资源、AssetBundle的打包及格式转换;然后编译C#代码并进行IL2CPP/AOT处理,将代码转换为平台兼容形式;接着生成包含AndroidManifest和插件的Gradle工程;随后通过Gradle编译构建APK/AAB,完成资源合并、Dex编译和so库打包;最后进行签名并输出成品。过程中需注意Manifest合并冲突、so库兼容性、Gradle版本匹配等问题,优化建议包括资源拆分、IL2CPP选用和自动化构建等。


一、整体流程总览

Unity构建Android包的流程大致分为以下几个阶段:

  1. 资源打包与预处理
  2. C#代码编译与IL2CPP/AOT处理
  3. 生成Gradle工程
  4. Gradle编译与构建APK/AAB
  5. 签名与输出

二、详细流程与细节

1. 资源打包与预处理

  • 场景与资源打包
    Unity会根据Build Settings中勾选的场景,打包相关的资源(贴图、模型、音频、Prefab等)。
  • AssetBundle/Addressable
    如果项目使用了AssetBundle或Addressable,Unity会先打包这些资源。
  • 资源压缩与格式转换
    针对Android平台,Unity会自动将纹理等资源转换为ETC/ASTC等Android支持的格式。

2. C#代码编译与IL2CPP/AOT处理

  • C#脚本编译
    Unity会用Mono编译器将C#代码编译为DLL(.NET程序集)。
  • 脚本后处理
    进行代码裁剪(Managed Stripping Level)、Assembly重定向等。
  • IL2CPP/AOT
    • 如果选择Mono后端,直接打包DLL。
    • 如果选择IL2CPP后端,Unity会将C#字节码(IL)转换为C++代码,再用NDK编译为so库(libil2cpp.so等)。
  • JNI桥接
    Unity自动生成C#与Java/Android之间的JNI桥接代码。

3. 生成Gradle工程

  • AndroidManifest生成
    Unity根据Player Settings和插件自动生成AndroidManifest.xml。
  • 集成Android插件
    • Plugins/Android目录下的AAR/JAR/so文件会被自动合并进工程。
    • 插件的AndroidManifest、资源、proguard配置等也会合并。
  • 生成Gradle工程目录结构
    Unity会生成一个完整的Gradle工程(可选“Export Project”导出到本地)。

4. Gradle编译与构建APK/AAB

  • Gradle构建
    Unity调用Gradle Wrapper(或本地Gradle)进行编译。
  • 资源合并
    Gradle会合并所有资源、Manifest、AAR/JAR、so库等。
  • Dex编译
    所有Java/Kotlin代码(包括Unity自动生成的和插件的)会被编译为dex文件。
  • so库打包
    IL2CPP生成的so库、第三方so库会被打包进APK的lib目录。
  • Proguard混淆
    如果开启混淆,Gradle会对Java代码进行Proguard处理。

5. 签名与输出

  • 签名
    Gradle会用指定的keystore对APK/AAB进行签名。
  • 输出APK/AAB
    最终生成的APK/AAB文件位于/Builds/Android/或Gradle工程的outputs目录下。

三、关键细节与常见问题

  1. AndroidManifest合并冲突
    多个插件可能带有自己的Manifest,Unity会合并,冲突时需手动调整。
  2. so库架构兼容
    插件的so库需支持目标ABI(armeabi-v7a、arm64-v8a等),否则会导致运行时崩溃。
  3. Gradle版本兼容
    Unity不同版本自带的Gradle和Android Build Tools版本有限制,插件需兼容。
  4. 自定义Gradle模板
    可以通过mainTemplate.gradlelauncherTemplate.gradle等自定义Gradle构建流程。
  5. Proguard与混淆
    混淆配置需兼容Unity和所有插件,否则可能导致反射、JNI调用失败。
  6. IL2CPP编译慢
    IL2CPP会生成大量C++代码,NDK编译耗时较长,建议多核并行。
  7. 多渠道打包
    可通过Gradle脚本或第三方工具实现多渠道包名、资源替换等。

四、流程图(文字版)

[Unity Editor] | |-- 资源打包(场景、AssetBundle、格式转换) | |-- C#编译(Mono/IL2CPP) | | | |-- IL2CPP: IL转C++ -> NDK编译so | |-- 生成Gradle工程 | | | |-- 合并Manifest、AAR/JAR/so | |-- 调用Gradle构建  |  |-- Java/Kotlin编译 -> dex  |-- so库打包  |-- 资源合并  |-- Proguard混淆  |-- 签名  | [输出APK/AAB]

五、常用优化建议

  • 合理拆分资源,减少包体积
  • 使用IL2CPP提升安全性和性能
  • 自定义Gradle模板,灵活集成三方SDK
  • 多核编译,提升构建速度
  • 自动化CI/CD,提升打包效率

六、常见面试/实战问题

  • Unity Android打包流程有哪些关键环节?
  • 如何集成第三方Android SDK?
  • IL2CPP和Mono的区别与优缺点?
  • 如何处理Manifest合并冲突?
  • 如何自定义Gradle构建流程?