Unity 将 Gradle 用于所有 Android 构建。可以在 Unity 中构建输出包(.apk、.aab),也可以从 Unity 导出 Gradle 项目,然后通过外部工具(如 Android Studio)进行构建。

什么是Gradle?

  • 一款优秀的自动化构建系统工具。
  • DSL(特定领域语言)基于Groovy。语法和Java相接近。

Unity的Gradle层次结构

为了清楚的理解Unity中的Android  Gradle结构,我们首先可以导出Unity生成的Unity Gradle层次结构。

  • 最简单的方式就是我们Build 下我们的Apk,然后在Temp/gradleOut获取我们的 Gradle层次结构。
  • 或者Build出Android Gradle项目。

launcher:

  • 启动器部分,其中包含应用程序的名称及其图标。
  • 默认是可启动 Unity 的简单 Android 应用程序。可以将此模块替换为自己的应用程序。

src:

  • 启动器模块的代码和资源。

build.gradle

  • 描述如何构建启动器模块,并包含要在构建中包含的依赖项列表。
  • 依赖于unityLibrary模块,当构建启动器模块时,unityLibrary必须包含在最终结果中。
  • 对应自定义Gradle的Custom Launcher Gradle Template文件。

unityLibrary:

  • 我们的Unity模块,包含 Unity 运行时和播放器数据。
  • 可以集成到其他任何 Gradle 项目中,注意集成时如下注意:详情
  1. 仅支持全屏渲染,不支持在部分屏幕中渲染。
  2. 不能加载或集成多个 Unity 运行时实例。
  3. IUnityPlayerLifecycleEvents 提供一种与 Unity Player 生命周期事件进行交互方式。
  4. 通过 settings.gradle 文件将生成的 Android Gradle 项目的 unityLibrary 模块包含在您的 Android Unity 项目中。

libs:

  • 用于存放unityLibrary模块的Android Archive (.aar)和Java Archive (.jar)插件。
  • 导出的Unity项目,它包含了unity-classes.jar文件。
  • 这个目录不包含 Android Library Projects 自定义模块。Unity将这些作为独立的子模块复制到Gradle项目中。
  • unity-classes.jar包含了Unity引擎使用的java代码。

src:

  • 包含unityLibrary模块的源代码和资源。Unity将源代码和资源放在次目录中。

build.gradle:

  • 描述了如何构建unityLibrary模块,并包含了构建中要包含的依赖项列表。
  • unityLibrary模块依赖于Unity项目中的所有插件。
  • 对应自定义Gradle的Custom Main Gradle Template文件。

proguard-unity.txt

  • Unity压缩,混肴的ProGuard配置配置文件。
  • Minification 启动时,将配置unity-classes.jar文件将如何进行压缩混淆。

proguard-user.txt

  • 包含项目的java代码和第三方java插件的ProGuard配置。
  • Minification 启动时,将配置项目的java代码和第三方java插件将如何进行压缩混淆。
  • 对应自定义Gradle的Custom Proguard File文件。

build.gradle

  • 整体项目的构建逻辑,负责引入所需的全部子项目Gradle并触发每个构建命令。
  • 文件位于项目的根目录下,用于定义适用于项目中所有模块的依赖项。
  • 会影响所有模块的配置。
  • 可包含用于清理 build 目录的代码。
  • 用于指定Android Gradle Plugin版本。
  • 对应自定义Gradle的Custom Base Gradle Template文件。

gradle.properties

  • 配置了Gradle和JVM的属性
  • 配置守护进程并管理构建过程中启动JVM的方式。
  • 当使用网络代理,辅助Gradle通信。
  • Unity默认添加了数据流文件资源目录中的资源类型unityStreamingAssets=.unity3d,告诉Gradle不应该压缩它们。多个文件用","进行分割。
  • 对应自定义Gradle的Custom Gradle Properties Template文件。
  • 此文件更多信息详情

local.properties

  • 用于配置本地环境属性,如Android SDK或者AndoridNDK。

settings.gradle

  • 用于多项目构建或者具有子项目的项目中的定义文件。
  • Unity中通常包含launcherunityLibrary。
  • 如果使用Play Asset Delivery,由于所有的资源包都是单独的模块,所以将会列出每个资源模块。
  • 如果要自定这个文件,需要复制你Unity安装目录的PlaybackEngines/AndroidPlayer/Tools/GradleTemplates/settingsTemplate.gradle文件到你项目的Assets/Plugins/Android文件夹中。

自定义Gradle模板

自定义Gradle模板变量:

变量: 描述:
DEPS 项目依赖项(即,项目使用的库)的列表。
APIVERSION 构建针对的 API 版本(例如 25)。
MINSDKVERSION 最低 API 版本(例如,25)。
BUILDTOOLS 使用的 SDK 构建工具(例如 25.0.1)。
TARGETSDKVERSION 目标 API 版本(例如,25)。
APPLICATIONID Android 应用程序 ID(例如,com.mycompany.myapp)。
MINIFY_DEBUG 允许为调试版本缩小(true 或 false)。
PROGUARD_DEBUG 在调试版本中,使用 proguard 进行缩小(true 或 false)。
MINIFY_RELEASE 允许为发布版本缩小(true 或 false)。
PROGUARD_RELEASE 在发布版本中,使用 proguard 进行缩小(true 或 false)。
USER_PROGUARD 自定义用户 proguard 文件(例如 proguard-user.txt)。
SIGN 完成 signingConfigs 部分(如果该构建已签名)。
SIGNCONFIG 设置为 signingConfig signingConfig.release(如果该构建已签名)。
DIR_GRADLEPROJECT Unity 创建 Gradle 项目的目录。
DIR_UNITYPROJECT Unity 项目的目录。
ARTIFACTORYREPOSITORY artifactory仓库配置
BUILD_SCRIPT_DEPS 构建脚本的项目依赖项(即,构建脚本使用的库)的列表
JVM_HEAP_SIZE 分配给JVM守护进程的内存大小
MINIFY_WITH_R_EIGHT 是否启用R8代码混淆(true 或 false)。
STREAMING_ASSETS 数据流文件资源列表
ABIFILTERS ABI过滤器,保留列表
ADDITIONAL_PROPERTIES 额外配置属性
VERSIONCODE 版本号,是数值类型
VERSIONNAME 版本名,是字符串类型,如1.2.1
PACKAGING_OPTIONS packagingOptions配置项
SPLITS splits配置项 文档
BUILT_APK_LOCATION 构建apk的位置
SPLITS_VERSION_CODE 生成的splits的构建版本代码
LAUNCHER_SOURCE_BUILD_SETUP 启动模块的源代码构建设置项
APPLY_PLUGINS 应用的插件列表项
REPOSITORIES repositories 配置项
IL_CPP_BUILD_SETUP IL2CPP构建设置项
SOURCE_BUILD_SETUP         源代码构建设置项
EXTERNAL_SOURCES 外部源代码列表项

Custom Main Gradle Template

此文件包含有关如何将Unity的 Android 应用程序构建为库的配置信息。

对应Gradle结构的"unityLibrary/build.gradle"文件。

  • Unity会把我们的Unity内容导出为 unityLibrary库然后通过launcher依赖构建
  • 这里Build出来的并不是一个App而是一个Library模块。

输出后的文件说明:

  • 依赖项配置文档dependencies配置项 : 依赖项配置文档
  • Lint选项配置:Lint选项配置文档
  • aaptOptions配置:Android Asset Packaging Tool配置文档
  • Packaging选项:Packaging选项文档
//表述这个工程的工程类型,一般包含3种:
//App类型工程:apply plugin: 'com.android.application'
//库类型工程:apply plugin: 'com.android.library'
//Test工程类型:apply plugin: 'com.android.test'
apply plugin: 'com.android.library'//指构建工程所依赖的所有依赖项
dependencies {//一般来说有3种依赖类型//对于本地模块的依赖:implementation project(':mylibrary') [mylibrary此名称必须与在您的 settings.gradle 文件中使用 include: 定义的库名称相符)]//本地文件依赖项:implementation fileTree(dir: 'libs', include: ['*.jar'])[对项目的libs目录中 JAR 文件的依赖关系,Gradle会读取build.gradle文件的相对路径]//也可以按如下方式指定各个文件:implementation files('libs/foo.jar', 'libs/bar.jar')//远程文件依赖项:implementation 'com.example.android:app-magic:12.3'[实际是implementation group: 'com.example.android', name: 'app-magic', version: '12.3'的简写]implementation fileTree(dir: 'libs', include: ['*.jar'])
}
//针对Android选项的配置块
android {//编译依赖的SDK版本compileSdkVersion 29//构建工具版本buildToolsVersion '30.0.2'//编译选项compileOptions {//这里配置的是Java 语言的的源码版本sourceCompatibility JavaVersion.VERSION_1_8//这里配置的是Java生成的字节码版本targetCompatibility JavaVersion.VERSION_1_8}//默认的配置defaultConfig {//最小兼容的Android平台版本,如果低于此版本将会阻止用户安装。minSdkVersion 19//指定我们基于哪个版本开发。targetSdkVersion 29ndk {//ABI 是 Application Binary Interface 的缩写。帮助适配不同的CPU架构。//把除了v7a以外的兼容包都过滤掉abiFilters 'armeabi-v7a'}//版本码,是一个递增的整数versionCode 1//版本名versionName '1.0.2'//Proguard的配置文件,这里面有两个文件一个是unity自身的配置还有一个是我们自己配置的Proguard配置文件consumerProguardFiles 'proguard-unity.txt', 'proguard-user.txt'}//Lint选项配置lintOptions {//当发生错误不终止构建//更多lint配置:https://developer.android.google.cn/reference/tools/gradle-api/4.1/com/android/build/api/dsl/LintOptions?hl=cnabortOnError false}//aapt全称为Android Asset Packaging Tool,为Android资源打包工具。//https://developer.android.google.cn/reference/tools/gradle-api/4.1/com/android/build/api/dsl/AaptOptions?hl=enaaptOptions {//这里表示这些文件类型不会被压缩存储在APK中。//unityStreamingAssets.tokenize 这里获取的是gradle.properties文件中unityStreamingAssets的配置。noCompress = ['.ress', '.resource', '.obb'] + unityStreamingAssets.tokenize(', ')//需要忽略的资源类型ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~"}//Packaging选项//https://developer.android.google.cn/reference/tools/gradle-api/7.4/com/android/build/api/dsl/PackagingOptions?hl=enpackagingOptions {//设置armeabi-v7a相关文件不会被剥离优化压缩doNotStrip '*/armeabi-v7a/*.so'}
}

Custom Launcher Gradle Template

此文件包含有关如何构建 Android 应用主模块的配置。

对应Gradle结构的"unityLibrary/launcher.gradle"文件。

  • 这里才是作为一个App来构建的模块。
  • 这个模块必须有unityLibrary模块的支持。

输出后的文件说明:

  • bundle用于改进的应用程序打包方式,能大幅度减少应用体积。 bundle文件说明文档
//此模块为App应用
apply plugin: 'com.android.application'dependencies {//依赖于unityLibrary本地模块implementation project(':unityLibrary')
}android {compileSdkVersion 29buildToolsVersion '30.0.2'compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}defaultConfig {minSdkVersion 19targetSdkVersion 29//设置applicationId,appi要与包名一致,这里Unity会帮我们通过playersetting设置applicationId 'com.DefaultCompany.com.unity.template.mobile2D'ndk {abiFilters 'armeabi-v7a'}versionCode 1versionName '1.0.2'}aaptOptions {noCompress = ['.ress', '.resource', '.obb'] + unityStreamingAssets.tokenize(', ')ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~"}lintOptions {abortOnError false}//这里用于配置我们不同的构建类型buildTypes {debug {//是否启用混淆,启用之后增加反编译成本minifyEnabled false//设置混淆文件规则//getDefaultProguardFile('proguard-android.txt')从Android SDK tools/proguard/文件夹获取默认的 ProGuard规则文件,为我们提供的默认混淆规则文件。//proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro' 可以设置自定义混淆规则文件。//proguard-rules.pro用于添加自定义位于模块根目录。proguardFiles getDefaultProguardFile('proguard-android.txt')//签名配置signingConfig signingConfigs.debug//是否激活NDK调试jniDebuggable true}release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt')signingConfig signingConfigs.debug}}packagingOptions {doNotStrip '*/armeabi-v7a/*.so'}//改进的应用程序打包方式,能大幅度减少应用体积。//默认情况下,构建器会自动根据CPU架构对屏幕分辨率、语言等维度将app 分拆,如果希望自由控制分拆维度,可以在此控制。//android 5.0以下不支持bundlebundle {//对语言进行拆分language {enableSplit = false}//对屏幕密度进行拆分density {enableSplit = false}//对不同CPU架构进行拆分abi {enableSplit = true}}
}

可配置项

  • SignConfig【签名配置】
android {signingConfigs {release{storeFile file('release.keystore')storePassword '000000'keyAlias 'kt'keyPassword '000000'}debug{storeFile file('debug.keystore')storePassword '000000'keyAlias 'kt'keyPassword '000000'}}buildTypes {debug {//...signingConfig signingConfigs.debug}release {//...signingConfig signingConfigs.release}
}

1.如果使用Gradle配置签名,请取消Custom Keystore的勾选。

2.如果keystore文件使用相对路径,应从Temp\gradleOut\launcher\ 开始。

如果user.keystore在Assets同目录下的KS文件夹中应该设置如下:

storeFile file('../../../KS/release.keystore')

Custom Base Gradle Template

自定义顶层项目build.gradle配置项,允许你对所有模块进行依赖项配置和远程仓配置。

对应Gradle结构的"build.gradle"文件。

  • 在这里指定所有模块的依赖项和远程仓。
  • 当只有单个模块需要的依赖项应该放在对应的模块级的build.gradle文件中。

输出后的文件说明:

  • JCenter和Google本质就是个Maven仓库
//在这里指定所有模块的依赖项和远程仓
//当只有单个模块需要的依赖项应该放在对应的模块级的build.gradle文件中。
allprojects {//gradle脚本执行所需的依赖项和远程仓buildscript {//使用JCenter和Google作为远程仓,本质就是个Maven仓库repositories {google()jcenter()}//配置依赖关系dependencies {classpath 'com.android.tools.build:gradle:3.6.0'            }}//当前项目所需的依赖项和远程仓//使用JCenter和Google作为远程仓repositories {google()jcenter()//设置源类型目录位置//这里设置我们的unityLibrary模块的libs文件夹flatDir {dirs "${project(':unityLibrary').projectDir}/libs"}}
}
//定义了一个任务,用于删除项目中build文件夹下的内容
task clean(type: Delete) {delete rootProject.buildDir
}

Custom Gradle Properties Template

此文件包含 Gradle 构建环境的配置设置。

对应Gradle结构的"gradle.properties"文件。

  • 可以对JVM(Java 虚拟机)内存配置。
  • 允许 Gradle 使用多个 JVM 进行构建的属性。
  • 用于选择工具进行缩小的属性。
  • 用于在构建应用程序包时不压缩原生资源的属性。

输出后的文件说明:

  • R8 宗旨在与现有的 ProGuard 规则配合使用。
//分配给守护进程,JVM内存的大小,分配较高的值对提高构建性能特别有用。
org.gradle.jvmargs=-Xmx4096M
//多个构建任务进行并行执行
org.gradle.parallel=true
//Android Gradle插件3.4.0或更高版本时可用,R8和Proguard 相比,R8 可以更快地缩减代码,同时改善输出大小。
android.enableR8=false
//不对.unity3d在构建应用时进行压缩
unityStreamingAssets=.unity3d

Custom Proguard File

此文件包含 Gradle 混淆的配置。

对应Gradle结构的"unityLibrary/proguard-user.txt"文件。

  • Andorid 混淆处理文档
  • Android Studio 3.4 或 Android Gradle 插件 3.4.0 及更高版本时,R8 是默认编译器,用于将项目的 Java 字节码转换为在 Android 平台上运行的 DEX 格式。
  • 当应用通过 Java 原生接口 (JNI) 调用方法时,需要我们自定义保留代码。
  • 当应用在运行时查询代码时(如使用反射),需要我们自定义保留代码。
  • 可以通过生成的代码报告查看我们保留或移除的代码,需要开启R8。
  • 在Unity中一般用于第三方SDK的相关api自定义保留代码。
  • 这里指的是java代码不是C#代码。
//保持com.unity3d.player下的所有类
-keep class com.unity3d.player.* { *; }
//忽略警告
-ignorewarnings

IPostGenerateGradleAndroidProject【构建Gradle工程完成接口】

生成 Android Gradle 项目后,实现该接口以接收回调。继承自 UnityEditor.Build.IOrderedCallback。

OnPostGenerateGradleAndroidProject

在 Android Gradle 项目生成之后且构建开始之前,实现该函数以接收回调,执行内部构建时不会进行调用。

[Unity安卓开发]Unity3D Gradle基础相关推荐

  1. 学 android需要什么基础,学习安卓开发需要什么基础?

    学习程序开发一般都需要懂一些一定的C语言,现在大学里面和计算机相关的专业甚至理工类专业一般都会开设C语言课程.当然学习安卓程序开发除了懂C语言之外,还需要掌握一定的Java基础知识.Linux基础知识 ...

  2. Unity3D开发Android游戏(一)搭建Unity安卓开发环境

    1,下载安装Java的JDK: http://www.oracle.com/technetwork/java/javase/downloads/index.html(JDK中,包含JRE) 2,下载A ...

  3. unity开发android游戏(一)搭建Unity安卓开发环境

    1,下载安装Java的JDK: http://www.oracle.com/technetwork/java/javase/downloads/index.html (JDK中,包含JRE) 如果是6 ...

  4. 【转】unity开发android游戏(一)搭建Unity安卓开发环境

    http://blog.csdn.net/chenggong2dm/article/details/20654075 1,下载安装Java的JDK: http://www.oracle.com/tec ...

  5. Unity 3D开发--Shader入门基础

    Shader "Unlit/xxShader" {Properties{//基础属性 并可以显示在属性板上_MainTex ("Texture", 2D) = ...

  6. android 开发桌面应用程序,安卓开发基础教程-Android多界面应用程序开发

    开篇 本文阅读需10分钟,简单易上手,属于安卓开发教程的基础部分. 建议精读,深刻理解大意.多做实践.多写代码. 本文章由做全栈攻城狮原创首发. 同名公众号已开启,官网www.8z5.net. 本套教 ...

  7. Android 一定要培训吗,安卓开发需要学什么2

    随着安卓开发相关岗位需求越来越大,安卓开发人员供不应求.对于求职者来说,在这样的情况下,选择进入安卓开发行业,成为一名安卓开发工程师,就业前景是非常光明的.很多同学都在问,学安卓开发需要什么基础,兄弟 ...

  8. 安卓开发的深度技术实战详解

    文章目录 一.安卓开发的深度技术 二.总结 三.协程 四.数据库 总结 一.安卓开发的深度技术 Kotlin 语言 Kotlin 语言是一种功能强大.安全.简洁且互操作性良好的编程语言,由 JetBr ...

  9. unity ui 补间动画_杭州Unity游戏开发培训内容有哪些?学习路线是如何规划的?...

    现在Unity游戏开发行业越来越受到欢迎,但是想要找到适合自己的课程和学习方法却有些困难.很多刚开始接触Unity游戏开发且没有基础的同学,不知道该从哪里开始学,也不知道要学习什么内容.该怎么开始Un ...

最新文章

  1. struts中简单的校验
  2. dhcp服务器由谁维护,DHCP服务器管理维护的心得
  3. 无限乱斗机器人ap出装_LOL:无限火力仅剩4天,这5个英雄一定要尝试!
  4. SAP信用控制配置事物码
  5. Linux下Nginx、MySQL、PHP5、phpMyAdmin安装与配置
  6. .net html5 框架,ASP.NET - 介绍 ASP.NET Web 窗体框架的导航 | Microsoft Docs
  7. python创建变量score_关于Python创建类时的self参数和__init__
  8. [李景山php]每天TP5-20161225|thinkphp5-Console.php-2
  9. java setlayout_Java Button.setLayoutX方法代码示例
  10. 总结-最全linux工具的使用
  11. 已知原函数和导函数的关系_原函数与导函数的关系
  12. python辅助脚本教程_[Python] 用python做一个游戏辅助脚本,完整思路
  13. python基本操作(四)
  14. ffmpeg yuv数据存储方式_一文理解 YUV
  15. 菜鸟教程java在线编辑器_HTML 编辑器
  16. 本地文件怎么传到linux服务器,本地文件传到linux服务器
  17. python-20行代码将图片转素描画(附源码和成品下载地址)
  18. 光盘中的vob格式怎么转换成mp4格式
  19. iDRAC 7 Enterp license
  20. PHP 多行文字内容的重复检测功能并统计重复次数

热门文章

  1. 最“防撞”的大学简称,都有谁?
  2. XXE漏洞原理--简单理解
  3. 解决RHEL8.5下dotnetcore无法处理gif和jpg问题
  4. Lan8720 网线插拔状态检测
  5. linux八进制属性,解释八进制和linux命令od +理解0x00(Explain Octal and the linux command od + understanding 0x00)...
  6. 如何用js实现点击图片切换为另一图片,再次点击恢复到原图片
  7. Windows Tomcat安装配置,Tomcat 启动闪退,Tomcat中文乱码解决
  8. f1 六个矩形能否组成长方体(qsort,思路有理化,typedef struct的二项数组)
  9. 在电脑上不能打开phpMyAdmin:即网址http://localhost:8080/phpMyAdmin/解决方法如下----潘万丁
  10. python即将列入高考吗_Python即将被加入浙江、北京、山东高考科目