Unity导出APK详解篇

Unity导出APK详解篇,第1张

一、导出环境

安装有Andriod Build Support、Android SDK & NDK Tools

有的话如下图,没有也会提示你去UnityHub安装。

Unity导出APK详解篇,第2张

 二、安卓导出界面详解

Unity导出APK详解篇,第3张

1. Texture Compression——纹理压缩格式

Use Player Settings: 使用在播放器设置中设置的纹理压缩格式(在哪平台 *** 作用哪平台)
ETC:使用ETC格式
ETC2:使用ETC2格式
ASTC:使用ASTC格式
DXT:使用DXT格式
PVRTC:使用PVRTC格式

2.ETC2 fallback——ETC2回退

当Unity用于不支持ETC2的安卓设备时的RGBA纹理格式

32-bit:32位
以全分辨率存储RGBA纹理,使用32位存储每个像素,质量最高,内存占用最多

16-bit:16位
以全分辨率存储RGBA纹理,使用16位存储每个像素,质量较低,纹理可能会丢失有价值的颜色信息,内存占用相对较少

32-bit, half resolution:32位,半分辨率
以半分辨率存储RGBA纹理,使用32位存储每个像素,由于是半分辨率,纹理会变得模糊,内存占用较小


3.Export Project——导出项目

勾选后,不会发布成apk,而是会将Unity项目导出为可以导入Android Studio的Gradle项目

4.Symlink Sources——符号链接源

当勾选Exprot Project时,才能勾选此选项。
决定是否在Unity和导出的Gradle项目之间共享Java和Kotlin源文件
启用后,对于测试和迭代Java和Kotlin代码很有用,如果你重新导出Unity项目,你在导出的项目对之前的Java和Kotlin源文件的任何更改都会保留

如果你想导出后进行二次开发,建议勾选此选项

5.Build App Bundle(Google Play)

构建应用捆绑包
是否将应用程序作为Android应用捆绑包(AAB)
启用,发布出去是一个AAB(可以配合安卓进行二次开发)
禁用,发布出去是一个APK(直接就是一个可安装的应用程序)

6.Create symbols.zip——创建压缩文件

Disabled:不生成

Public:Unity生成一个公共符号为程序打包

公共符号文件包含将函数地址解析为人类可读字符串的信息,包小于调试符号的包

Debugging:Unity生成一个调试符号为程序打包

包含完整的调试信息和符号表,可以用来解析堆栈、将本机调试器附加到应用程序调试代码

7.Run Device——运行的设备

指定在哪个附加设备上测试生成
如果你连接了新设备或在列表中没有看到连接的设备
点击刷新Refresh

8.Build to Device——构建到设备

不创建完整的构建,而是将发生修改的单个文件直接部署到设备上
相对来说更加快速,方便调试

9.Development Build——开发模式构建

是否包含脚本调试符号和性能分析器到你的项目中,如果你想要调试应用程序,请选择该选项

10.Autoconnect Profiler——自动连接分析器

是否自动将分析器连接到生成的应用程序

11.Deep Profiling——深度剖析

是否启用深度剖析在分析器中,可以让分析器能够检测应用程序中每个函数调用,从而返回更加详细的分析数据
注意:该选项会降低脚本的执行速度

12.Script Debugging——是否允许调试应用程序的脚本文件

13.Wait For Managed Debugger——是否等待托管调试器

程序在运行脚本代码之前是否等待调试器连接

14.Compression Method——压缩方法

Default:默认使用ZIP,压缩效果略好于LZ4和LZ4HC,但是数据解压速度较慢
LZ4:使用LZ4,这时一种快速压缩格式,相对ZIP可以显著提高Unity应用程序的加载时间
LZ4HC:LZ4的高压缩版本,构建速度较慢,但是对于发布版本会产生更好的结果,相对ZIP可以显著提高应用程序加载时间

15.Max Texture Size——最大的纹理大小

用于本地开发时导入纹理的最大尺寸
减小最大纹理大小可以加快资源导入和平台切换

16.Texture Compression——纹理压缩

No Override:使用默认设置
Force Fast Compressor:强制快速压缩
Force Uncompressed:强制解压缩

三、Player Settings基础设置

1.基础设置Unity导出APK详解篇,第4张

2.Icon图标设置

Unity导出APK详解篇,第5张

 3.Resolution and Presentation分辨率设置

Unity导出APK详解篇,第6张

 

Fullscreen Mode全屏模式

Fullscreen Window:
全屏窗口(导航栏始终处于隐藏状态)
会缩放应用程序内容,为了匹配纵横比,可能会有黑边

Windowed:
窗口模式,窗口大小取决于应用程序分辨率

Blit Type光高类型
是否使用Blit将最终图像呈现在屏幕上

Always:总是让Unity渲染到屏幕外的缓冲区,然后使用Blit将缓冲区的内容复制到设备的帧缓冲区(这和大部分设备兼容,但比不用Blit慢)

Nerver:Unity将渲染到设备 *** 作系统提供的帧缓冲区,如果失败,会有警告信息打印到日志当中。通常比使用Blit块,但是不兼容所有设备

Auto:Unity会渲染到设备 *** 作系统提供的帧缓冲区,如果失败,会打印到日志中,并使用Blit将最终图像呈现到屏幕上

Aspect Ratio Mode指定应用程序支持的最大纵横比。

如果设备的纵横比大于此纵横比,Unity会将此纵横比用于应用程序,并添加黑条,使应用程序不会拉伸

Legacy Wide Screen(1.86):支持android的传统宽屏宽高比

Native Aspect Ratio:支持Android本机宽高比的宽高比

Custom:自定义纵横比

选择自定义纵横比时可以自己设置

Default Orientation默认取向

指定应用程序使用的屏幕方向(横屏、竖屏设置)

Portrait:竖屏(应用程序窗口底部和屏幕底部对齐)
Portrait Upside Down:竖屏倒置(应用程序窗口底部和屏幕顶部对齐)
Landscape Right:右横屏(应用程序窗口右侧和屏幕底部对齐)
Landscape Left:左横屏(应用程序窗口左侧和屏幕底部对齐)
Auto Rotation:自动旋转,可以旋转到你允许的任意方向,在下方勾选即可
 

4.Splash Image启动图像设置 

Unity导出APK详解篇,第7张

Splash Style启动风格

Dark on Light: 暗到亮
Light on Dark: 亮到暗

Animation启动图像动画效果

Static:静态不动的
Dolly:由小变大
Custom:自定义

Draw Mode:绘制模式

Unity Logo Below:Unity Logo显示在前
All Sequential:所有按顺序

Scaling:
缩放比例

Center:
居中(仅缩小):除非图像太大,否则以原始大小绘制图像,Unity会缩小图像

Scale to fit:
缩放以适应(填充),缩放图像,使较长尺寸完全适合屏幕大小,以黑色填充两侧空白区域

Scale to fit:
缩放以适应(裁剪),缩放图像,使较短的尺寸完全适合屏幕大小,将图像裁剪为较长的维度
5.OtherSetting其他设置

Unity导出APK详解篇,第8张

 

Rendering渲染设置
Unity程序员必了解的图形程序接口
OpenGL(Open Graphics Library)
中文翻译过来是开放图形库,它定义了一个跨平台、跨语言的编程接口规格的专业图形程序接口,可以用于3D、2D图形渲染,是一个功能强大、调用方便的底层图形库。由于它跨平台、跨语言、出现时间早,因此它的应用极其广泛!

OpenGL ES(OpenGL for Embedded Systems)
中文翻译过来是用于嵌入式系统的开放图形库,它是OpenGL的子级,主要针对手机、游戏主机等嵌入式设备而设计,免授权费、跨平台、功能完善。

GLES2.0、GLES3.0 指的就是OpenGL ES这套标准,他们也是Android和IOS手机上常用的图形处理标准。

Unity在移动平台进行图形渲染处理时,就包含了OpenGL ES方案

Vulkan
“下一代”开放的图形显示API,是与DX12能够匹敌的GPU API标准。它有一套最新的图形加速API接口,目标是提供更灵活和丰富的底层 *** 作接口,以替代OpenGL 和 OpenGL ES接口,可****以把Vulkan看做是OpenGL的升级版,目前新版本的Unity支持使用Vulkan方案。

Directx(Direct eXtension)
中文翻译过来是直接拓展,简称DX。它是由微软公司创建的多媒体编程接口。它不跨平台,只针对微软的相关产品,被广泛使用于Windows *** 作系统、xBox游戏主机的图形应用程序开发中。

其中的D3D算是DX一部分,是对标OpenGL的图形程序接口

WebGL(Web Graphics Library)
中文翻译过来是网页图形库,它是针对Web端(*网页*)的3D绘图协议,这个标准允许把JavaScript和OpenGL ES 2.0结合在一起,网页开发人员可以借助系统显卡在浏览器里流畅的展示3D场景和模型,可以在网页里进行3D图形开发。

Metal
中文翻译过来是金属,它是苹果公司为游戏开发者提供的图形技术,该技术能够为3D图像提高10倍渲染性能,但是它不支持跨平台,主要针对IOS、macOS苹果自家的 *** 作系统,只有苹果手机、电脑能够使用。

Windows电脑:DX、OpenGL、Vulkan

苹果电脑:Metal、OpenGL、Vulkan

安卓手机:OpenGL ES、Vulkan

苹果手机:OpenGL ES、Vulkan、Metal

网站网页:Web GL

如果不通过游戏引擎,我们想要在这些平台上开发游戏,那么就必须要针对不同平台学习对应的图形程序接口相关的知识。你会发现OpenGL的身影在各主流平台中都占有一席之地,由于它出现早、跨平台、跨语言,所以也是为什么在学习计算机图形学时,OpenGL是必学的内容。

我们现在使用游戏引擎开发游戏,在绝大多数情况下,不需要直接和图形程序接口打交道,但是我们在Unity当中发布应用程序时,经常会看到和他们相关的一些设置,必须要了解了他们的基本概念,才能清楚我们在设置什么。

这些图形程序接口还有不同的版本,比如DX10、DX11、DX12,比如OpenGL ES 2.0、OpenGL ES 3.0。不同的设备、不同的 *** 作系统他们支持的版本也是不同的。比如我们进行手机游戏开发时,我们**可以去查询主流移动设备支持的图形程序接口的版本,来决定在发布时,对于图形程序接口版本的兼容选择****。这样才能保证我们发布的应用程序能够支持更多的移动设备。

Color Space:色彩空间
可以在此切换Unity中用于渲染的色彩空间
Gamman(伽马)和 Linear(线性)

区别:
纹理倾向于保存在伽马颜色空间中,而着色器期望使用线性颜色空间
因此,在着色器中对纹理进行采样时,基于伽马的值会导致不准确的结果
我们可以选择线性色彩空间,然后通过纹理中的 sRGB选项决定是用伽马还是线性,勾选sRGB是伽马,取消勾选是线性

如何选择:
线性渲染的效果相对较好一些
但并不是所有平台都支持线性渲染
支持的平台为:
Android、IOS、WebGL、Windows、Mac OS X 、Linux
当设备不支持线性渲染时,不会退回到伽马控件,而是自动退出

在 Android 上,线性渲染至少需要 OpenGL ES 3.0 图形 API 和 Android 4.3
在 iOS 上,线性渲染需要 Metal 图形 API
在 WebGL 上,线性渲染至少需要 WebGL 2.0 图形 API

确定你的应用程序运行的主流设备是否支持,如果支持则选择线性,不支持选择伽马

https://docs.unity.cn/cn/2021.3/Manual/LinearLighting.html

什么是Vulkan?
是一个跨平台的2D和3D绘图应用程序接口
在2015年游戏开发者大会(GDC)上发表
是OpenGL的下一代版本,旨在提供更低的CPU开销与更直接的GPU控制

Auto Graphics API:自动图形接口(建议选择自动)
勾选:Unity会自动尝试使用对应图形API接口进行图形处理
默认使用Vulkan,如果设备不支持Vulkan,Unity会退到GLES3.2、GLES3.1或GLES3.0

不勾选:可以列表中自己对使用的图形API接口进行排序,设置使用优先级

下方的副选项ES3.1、ES3.1+AEP、ES3.2是三个额外的用于配置最低OpenGL ES 3.X次要版本的
注意:只有当GLES2不在列表中是,Unity才会讲额外的三个选项要求添加到Android应用清单中,在这种情况下,如果你的应用发布到GooglePlay应用商店,它将不会显示在不受支持的设备上

Color Gamut: 色域
可以添加或删除 Android 平台用于渲染的色域
色域定义了可用于给定设备(如监视器或屏幕)的可能颜色范围。sRGB 色域是默认(也是必需的)色域。当定位具有宽色域显示的设备时,请使用 DisplayP3 来利用完整的显示功能。

一般的手机使用sRGB即可,如果是PC主机游戏,可以考虑添加DisplayP3

Multithreaded Rendering:多线程渲染
启用此选项可将图形 API 调用从 Unity 的主线程移动到单独的工作线程。这有助于提高主线程上 CPU 使用率较高的应用程序的性能。

Static Batching:静态批处理
会将静态物体合并处理DC,提升性能

Dynamic Batching:动态批处理
可以动态的合并DC,提高性能
当可编程渲染管线(SPR)处于活动状态时,也就是启用了URP或者HDRP时,动态批处理不起作用

在使用FairyGUI时,就需要开启它,FairyGUI的DC将得到优化

Compute Skinning:计算蒙皮
启用此选项可启用 DX11/ES3 GPU 计算蒙皮,从而释放 CPU 资源

图形接口的版本要求较高,PC上DX11、移动设备ES3

Graphics Jobs(Experimental):图形作业
启用后,Unity将渲染循环的图形任务移到其它CPU内核上运行的工作线程,可以减少在主线程上花费的时间
Texture compression format:纹理压缩格式
可以在ASTC、ETC2、ETC之间进行选择

Normal Map Encoding:法线地图编码
选择 XYZ 或 DXT5nm 样式以设置法线映射编码。这会影响用于法线贴图的编码方案和压缩格式。DXT5nm 样式的法线贴图质量更高,但在着色器中解码成本更高

Lightmap Encoding:光照贴图编码
选择“正常质量”或“高质量”以设置光照贴图编码。此设置会影响光照贴图的编码方案和压缩格式

Lightmap Streaming:光照贴图流
是否对光照贴图使用 Mipmap 流式处理

Frame Timing Stats:帧时序统计
启用此属性可收集 CPU 和 GPU 帧时间统计信息

需要和摄像机上的动态分辨率设置结合使用(Camera组件下的Allow Dynamic Resolution选项),以确定应用程序是受 CPU 还是 GPU 限制。

OpenGL:
Profiler GPU Recorders:是否启用OpenGL的探查GPU记录器

在OpenGL上,探查GPU记录器 会 禁用GPU探查器

Virtual Texturing:虚拟纹理
可在场景中具有很多高分辨率纹理时减少 GPU 内存使用量和纹理加载时间。它将纹理拆分为瓦片,然后在需要时将这些瓦片逐步上传到 GPU 内存中。

注意:虚拟纹理和安卓设备不兼容

Shader Precision model:着色器精度模型
控制着色器中使用的采样器的默认精度

360 Stereo Capture:360 度立体捕捉
Unity 是否可以捕获立体 360 度全景图像和视频

注意:360 度立体捕捉与 Android 不兼容。

Vulkan Setting
身份z明设置

注意:安卓平台时,不要修改这些选项

SRGB Write Mode: SRGB 写入模式
允许呈现器在运行时切换 sRGB 写入模式,如果要暂时关闭线性到 sRGB 写入颜色转换,可以启用该选项

注意:建议不要为移动设备启用该选项
它会增加移动设备GPU的负担,产生负面影响

Number of swapchain buffers: 交换链缓冲区数量
设为2位双缓冲,设为3为三重缓冲可以和Vulkan渲染器一起使用
该设置可以帮助解决移动平台上的延迟问题

注意:一般情况下我们不要修改此选项,保持为3,不要在安卓设备上使用双缓冲,会产生负面影响

Acquire swapchain image late as possible:尽可能晚的获取交换链图像
启用后,Vulkan会延迟获取后缓冲器,直到它将帧渲染为屏幕外图像。Vulkan 使用暂存映像来实现此目的。启用此设置会导致在显示反向缓冲器时产生额外的光圈。此设置与双缓冲相结合,可以提高性能。但是,它也可能导致性能问题,因为额外的 blit 会占用带宽。

注意:安卓设备上我们不要修改该选项

Recycle command buffers:回收命令缓冲区
Unity 执行命令缓冲区后是回收还是释放命令缓冲区

Apply display rotation during rendering:
在渲染期间应用显示旋转启用此选项可在显示的本机方向上执行所有渲染。这在许多设备上具有性能优势,虽然如此,但是使用它会带来一些限制,所以还是建议大家不要修改此选项

Identification:身份z明
注意:首次发布时,一定要确保包名的正确性

Override Default Package Name:是否覆盖默认包名称
如果你的公司名和游戏名 不是英文,请勾选它自行设置包名

Package Name:软件包名
相当于应用程序的ID,用于在设备和安卓应用商店中的唯一标识。
格式:com.公司名.产品名
只能包含字母数字和下划线,每段都必须以字母开头

Version:版本号
显示给用户看的
用于标识应用程序包的迭代
格式:数字.数字.数字。。。
比如:1.0、4.3.2、1.2.1等

Bundle Version Code:内部版本号
确定一个版本是否比另一个版本新,数字越大表示版本越新,不会显示给用户看
该值为整数,比如每次发布新版本时可以让数字加一

Minimum API Level:最低API级别
决定应用程序运行需要的最低的API级别,如果用户手机的SDK版本低于该设置,Android系统会组织用户安装该应用程序

Target API Level:目标API级别
用于指定应用的目标API级别
主要用于通知Android系统,我们已经针对目标版本进行了测试,并且系统不应该通过启用任何兼容性行为,以保持你的应用与目标版本的向前兼容性。应用程序一样可以在较低版本上运行(取决于Minimum API Level)

Unity导出APK详解篇,第9张

Scripting Backend:脚本后端
决定Unity如何在项目中编译和执行C#代码

Mono:将C#编译为.Net公共中间语言CIL,并使用公共语言运行时执行中间语言

IL2CPP:将C#编译为CIL,再将CIL转换为C++,再将C++编译为本机代码,

Mono和IL2CPP的具体区别在 Unity进阶之C#知识补充当中有讲解

Api Compatibility Level:API兼容性级别
决定可以在项目中使用的.Net API。该设置会影响代码和第三方库的兼容性

.Net Standard 2.1:和.Net Standard 2.1兼容,生成较小的版本,具有完整的跨平台支持

.Net Framework:和.Net Framework兼容(包含.Net Standard 2.1中的所有的内容),包含更多的API支持,但是会生成更大的包。

如果在使用C#的一些高级功能时遇到报错或无法使用,可以尝试切换到.Net Framework以便支持这些高级功能的使用,如果有替代方案,建议使用替代方案,尽量使用.Net Standard 2.1可以让包体更小

C++ Compiler Configuration:C++编译器配置
只有将Scripting Backend设置为IL2CPP,才能使用该选项

Debug(调试模式): 将关闭所有优化,让代码生成速度更快,但运行速度较慢,可以在这种模式下进行调试

Release(发布模式):会对代码进行优化,编译后的代码运行会更快,二进制文件大小更小,但编译时间更长

Master(大师模式):可实现所有可能的优化,从而压缩每一点可能的优化,发布时间比发布模式还要长,如果接受较长的发布时间,建议在发布最终版本时使用Master模式

Use incremental GC:使用增量GC
启用后可以使用增量垃圾回收器,它会将GC分散到多个帧上执行,可以降低在一帧中进行GC造成的卡顿。

Assembly Version Validation:程序集版本验证
Mono是否验证强名称程序集中的类型

强名称程序集,是对程序集进行强命名,为程序集创建唯一标识,可以防止程序集冲突

Mute Other Audio Sources:将其它音频源静音
如果希望在运行Unity应用程序时停止在后台运行的应用程序中的音频,可以启用该选项,否则后台音频将和Unity中的音频一起播放

Target Architectures:目标体系结构
允许应用程序运行的CPU
64位环境中运行安卓应用具有性能优势
64位应用可以处理超过4GB的内存空间

Mono模式只能选择ARMv7
IL2CPP模式可以选择更多的模式

ARM就是一种微处理器硬件
Chrome OS是一款Google开发的基于PC的 *** 作系统

ARMv7 32位的ARM

ARM64 64位的ARM

x86(Chrome OS) 32位

x86-64(Chrome OS) 64位

Split APKs by target architecture:按目标架构拆分APK(实验性功能)
启用后,可以为目标体系结构中选择的每个CPU架构创建单独的APK,这样在Google Play中为用户提供下载时,它会根据设备的情况下载对应版本的APK,可以让apk更小,用户下载更小的包。
但是主要是针对Google Play,因此面向国内的产品几乎不会使用。

Target Devices:目标设备
执行允许运行APK的目标设备

All Devices(所有设备):允许apk在所有Android和Chrome OS设备上运行
Phones,Tablets,and TV Devices Only(手机、平板、电视设备):允许apk在Android手机和平板电脑、电视上运行,但是不能在Chrome OS设备上运行
Chrome OS Devices Only(Chrome OS设备):允许apk在Chrome OS设备上运行,但是不能在Android手机、平板、电视上运行

Install Location:安装位置
指定设备上的应用程序安装位置

Automatic:自动让 *** 作系统决定,用户可以自己移动安装位置

Prefer External:首选外部安装,如果可以,将应用程序安装到外部存储中(SD卡),如果不能,应用程序安装到手机存储空间中

Force Internal:强制内部,强制将应用程序安装到手机存储空间中,用户无法将应用程序移动到外部存储中安装

Internet Access:互联网接入
选择是否始终将网络权限添加到Android清单(即使你没有使用任何网路API)

Auto:仅当使用了网络API时才会添加互联网访问权限
Require:使用添加互联网访问权限

Write Permission:写入权限
是否启用对外部存储(SD卡)的写入访问权限,并向Android应用清单添加相应的权限

Internal(内部):仅授予对内部存储的写入权限
External(外置SD卡):启用对外部存储的写入权限

Filter Touches When Obscured:遮挡时过滤触摸
启用后可以丢弃在另一个可见窗口覆盖Unity应用程序时收到的触摸(触屏事件),可以放置窃听劫持

Sustained Performance Mode:持续性能模式
启用此选项可在较长的时间段内设置可预测且一致的设备性能级别,而无需进行热限制。启用此设置时,整体性能可能会降低

Low Accuracy Location:低精度定位
启用后可改为低精度值与Android位置API配合使用

Chrome OS Input Emulation:
Chrome OS *** 作系统的默认行为是将鼠标和触摸板输入事件转为触屏输入事件。
取消可禁用这个默认行为

Android TV Compatibility:安卓电视兼容性
启用后应用程序标记为兼容Android TV

启用后出现
Android Game:启用后可将输出的apk标记为游戏而不是常规应用
Android Gamepad Support Level:安卓游戏输入板支持等级
可以选择玩游戏时支持的输入方式

Warn about App Bundle size:警告应用程序包的大小
只有在Build Settings中勾选了Build App Bundle(Google Play)才有用
当应用程序包大小超过这个阈值时会收到警告

Active Input Handling:活动输入处理
选择要如何处理来自用户的输入

Input Manager:老的输入系统,Input相关
Input System Package:新输入系统
Both:同时使用

Script Compilation:脚本编译
Scripting Define Symbols:脚本定义符号
可以在此设置自定义编译标志。

再使用一些第三方内容时有时会在此处添加脚本符号
比如:Lua热更相关、FairyGUI相关

Unity导出APK详解篇,第10张 

Prebake Collision Meshes:预烘焙碰撞到网格
启用该选项可以在构建时将碰撞数据添加到网格

Keep Loaded Shaders Alive:保持加载的着色器的活动状态
启动后,不能卸载着色器

着色器加载时会造成性能开销,可能会出现卡顿现象,不允许卸载着色器可以避免卸载后重复加载

Preloaded Assets:预装资源
设置启动时加载的资源数组
将想要预加载的内容拖入框中

Strip Engine Code:剥离引擎代码
选择IL2CPP模式才会出现的字段
如果你希望在IL2CPP模式,能够删除Unity引擎功能中没有使用的代码,可以启用该选项,可以有效的减小包体大小

Managed Stripping Level:管理剥离水平
选择Unity如何剥离未使用的C#代码
在发布应用程序时,Unity会自动去除掉没有使用的代码,剥离代码可以使生成的执行文件减小,但是有可能会意外删除需要使用的代码

在Unity进阶之C#知识补充中讲解IL2CPP相关内容时讲解过

Disabled:不剥离,只有在Mono模式下才能选择

Minimal:最小剥离,Unity只会搜索Unity引擎未使用的.Net类库,不会删除任何用户编写的代码,该设置基本不会出现意外剥离,在使用IL2CPP模式后,该模式是默认模式

Low:低级剥离,处理Unity相关,玩家自己编写的代码也会被剥离,会尽量减小意外剥离发生

Medium:中级剥离,比起Low更多一些剥离

High:高级剥离,优先考虑打包大小,会最大限度剥离代码。可以采配合link.xml来手动拒绝剥离,或使用[Preserve]特性(在不希望被剥离的函数前加该特性)

Enable Internal Profiler:启用内部探查器,已经弃用的功能
用此选项以从Android SDK的设备中获取profiler数据adblogcat测试项目时输出。这仅在开发版本中可用。

Vertex Compression:顶点压缩
选择要设置的通道,以便在顶点压缩方法下压缩网格
通常,顶点压缩用于减少内存中网格数据的大小,减小文件大小,提高CPU性能。

Optimize Mesh Data:优化网格数据
启用后,构建时会从使用的网格中剥离未使用的顶点属性
它可以减少网格中的数量,也可以减小包体大小,可以减小加载时间和运行时的内存使用
但是,如果启用了该设置,运行时就不要更改材质或着色器相关设置

也就是说,如果你游戏会在运行时转换一些对象的着色器,就不能开启该选项。

比如游戏中某一个对象,如果网格使用简单漫射着色器,那么 Unity 将删除 切线矢量,因为并不需要它们。如果您想要在运行时切换到网格上的凹凸贴图着色器 ,那么您将不会得到正确的切线数据,因为此数据已被删除

Texture MipMap Stripping:贴图纹理剥离
启用后会启用纹理贴图剥离,在构建时会从纹理中剥离没有使用的纹理贴图。
会根据你发布平台的质量设置进行比较来确定哪些贴图用不到。
mipmap生成的多分辨率图也会被剥离

Stack Trace:堆栈跟踪
选择在特定的上下文中允许的日志记录类型
可以选择日志记录的方式
None:不记录
ScriptOnly:只在运行脚本时记录信息
Full:一直记录

Error:错误信息
Assert:断言(用于检测非法情况的)信息
Warning:警告信息
Log:打印日志信息
Exception:异常信息

Legacy:以前的内容
Clamp BlendShapes(Deprecated):启用 骨骼蒙皮动画中钳制混合形状权重的范围
6.Publishing Settings

Unity导出APK详解篇,第11张

 

Android 中的签名是什么?
Android要求所有已安装的应用程序都使用数字证书做数字签名,数字证书的私钥由应用开发者持有,
Android使用证书作为标示应用程序作者的一种方式,并在应用程序之间建立信任的关系。 证书并不用来控制用户能否安装哪个应用。证书不需要由证书认证中心签名;完全可以使用自制签名证书。

没有正确签名的应用,Android系统不会安装或运行。此规则适用于在任何地方运行的Android系统,不管是在模拟器还是真实设备上。因为这个原因。在真机或模拟器上运行或者调试应用前,必须为其设置好签名。

为什么要使用签名?

上图是我们在Unity中发布Android应用程序时,设置的包名

开发Android的人这么多,完全有可能把包名命名成同样的名字,这个时候该如何区分?

这时就需要签名来区分了,由于开发商可能通过使用相同的Package Name(包名)来混淆替换已经安装的程序,签名可以保证相同名字,但是签名不同的包不被替换。

举例:

比如应用程序A 和 应用程序B 的包名是相同的,如果没有签名的存在,在同一Android设备上重复安装A和B,就会导致他们之间的彼此覆盖,不能同时拥有,为了避免这种情况出现,就有了签名机制。

安卓密钥库和密钥,就是用来进行Android签名的。

Android 应用程序清单是什么?
Android应用程序工程中,有一个叫做 AndroidManifest.xml 的xml文件,该文件在之后的开发中我们会经常使用和编辑,该配置文件主要用于声明应用程序的组件,并且还有以下的一些重要作用:

确定应用程序要求的用户权限,比如:网络访问、通讯录访问、信息读取等权限

声明应用程序要求的最低API Level

声明应用程序将要使用的或要求的硬件和软件特性,比如:摄像头访问、蓝牙服务、多点触碰等

等等

也就是说,如果我们想要在安卓游戏当中使用一些系统功能或硬件访问权限,都需要在该文件当中进行设置。

Unity中如果引入Android第三方SDK,或者需要和Android进行交互,经常会对该文件进行编辑。如果我们没有这些需求,可以忽略它。

Gradle 是什么?
Gradle 是一个自动化构建开源工具,主要面向Java应用为主,也支持其它语言,比如C++、Kotlin、Swift,未来还会支持更多的语言。

它是一个基于JVM(Java虚拟机)的构建工具,是一款通用灵活的构建工具,也可以用于Android 项目的构建工作,它可以让安卓项目变得更加简洁。

在Unity中简单理解Gradle,它就是用于帮助我们打包出安卓应用程序 .apk 的一个工具,在Android Studio中也使用Gradle进行应用程序打包。

ProGuard 和 R8 是什么?
代码混淆

代码混淆(Obfuscated code),是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。代码混淆主要用于程序源代码,也可以用于程序编译而成的中间代码。执行代码混淆的程序被称作代码混淆器。已经存在许多种功能各异的代码混淆器。

将代码中的各种元素,如变量,函数,类的名字改写成无意义的名字。比如改写成单个字母,或是简短的无意义字母组合,甚至改写成“__”这样的符号,使得阅读的人无法根据名字猜测其用途。重写代码中的部分逻辑,将其变成功能上等价,但是更难理解的形式。比如将for循环改写成while循环,将循环改写成递归,精简中间变量,等等。打乱代码的格式。比如删除空格,将多行代码挤到一行中,或者将一行代码断成多行等等。

代码混淆的主要目的是提升源代码的安全性,别人反编译你的应用程序代码后,增加他们阅读分析逻辑的难度。

ProGuard 和 R8 就是两种不同的代码混淆器。

ProGuard

ProGuard是一个压缩、优化和混淆Java字节码(Java源代码通常被编译为字节码)文件的免费的工具,它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大限度地优化字节码文件。它还可以使用简短的无意义的名称来重命名已经存在的类、字段、方法和属性。常常在Android开发用于混淆最终的项目,增加项目被反编译的难度。

Unity发布安卓应用程序时,默认使用的就是ProGuard来进行处理最终的代码。

R8

R8是相对ProGuard较新的Android混淆编译器,它可以尽可能的减小应用的大小,早期的Android Studio版本中,混淆编译器使用的是ProGuard执行编译时的代码优化,如果我们使用Android Gradle 3.4.0或更高版本构建项目时,不再使用ProGuard进行代码优化,而是采用R8编译器协同工作。

Android Sutdio 3.3版本开始,就使用R8作为代码压缩器来对代码进行混淆、压缩、优化了。

R8 相对 ProGuard来说,它可以更快地缩减代码,同时改善输出的大小。

Unity发布安卓应用程序时,我们可以选择使用R8混淆编译器进行发布处理。

大概了解了这些基本概念后,才能知道我们是在设置什么内容。

Keystore Manager:密钥管理器


可以通过密钥管理器创建、配置和加载密钥和密钥库
我们可以在Keystore Manager窗口

Publishing Settings 发布设置中
加载现有密钥库和密钥

Create New:创建新的密钥库

Anywhere:任何地方,会打开项目文件夹根目录下的文件资源管理器,这是Unity存储密钥库的默认位置

In Dedicated Location:专用位置,将密钥库文件保存到计算机中的另一个目录中

注意:为了协同开发方便,建议大家就把密钥库保存在项目文件夹下,避免其它同事无法访问密钥库

Select Existing:选择现有密钥库
可以指定加载现有密钥库

Password:密钥库的密码
Confirm password:创建密钥库时 需要重复一次密码

Existing Keys:现有密钥
界面的这一部分包含当前密钥库包含的密钥的只读列表

Project Keystore:项目密钥库
用于保存签名密钥来实现应用程序安全性的容器
如果想要加载和使用现有密钥库,我们需要:

启动 Custom Keystore
在 Select 下拉列表中选择Browse,从文件系统中选择密钥库
输入密钥库密码
Custom Keystore:启用后,可以指定加载和使用现有密钥库

Select:启用Custom Keystore后,该按钮可以用来选择要使用的密钥库

Path:你选择的密钥库所在路径

Password:输入密钥库密码以加载所选的密钥库

Project Key:项目密钥
加载密钥库后,Unity会加载该密钥库中的所有密钥
我们可以在项目密钥Project Key中设置从该密钥库中选择哪一个密钥用来作为该项目的活动密钥

Alias:选择用于打开的项目的密钥

Password:密钥密码

Build:构建相关
默认情况下,Unity使用Unity安装提供的清单文件、Gradle模板和文件构建应用程序
如果想要自定义这些内容,你需要:

启用Build下方的这些复选框,文件会出现到复选框的下方
打开新文件进行更改
保存修改的文件,Unity下次构建应用程序时会自动使用的文件
Custom Main Manifest:自定义主清单文件
该清单文件是一个xml文件
我们可以在此决定一些权限设置(比如:网络、定位、拍照等权限配置),还可以设置是否启用一些安卓功能等等

Custom Launcher Manifest:自定义启动器清单
该清单文件是一个xml文件
我们可以在此决定一些应用程序启动之前的外观和行为。(比如:图标、名称、安装位置等等)

Custom Main Gradle Template:自定义主Gradle构建模板
Gradle 是一个构建系统,可自动执行许多构建过程并防止许多常见的构建错误。Unity将Gradle用于所有Android版本。您可以在Unity中构建输出包(.apk,.aab),也可以从Unity导出Gradle项目,然后使用Android Studio等外部工具构建它

是一个gradle文件,包含有关如何将Android应用程序构建为库的信息

Custom Launcher Gradle Template:自定义启动器Gradle构建模板
是一个gradle文件,包含有关如何构建Android应用程序的说明

Custom Base Gradle Template:自定义基础Gradle构建模板
是一个gradle文件,包含在所有其它模板和Gradle项目之间的共享配置

Custom Gradle Properties Template:自定义属性Gradle构建模板
属性文件,包含Gradle生成环境的配置设置
比如
JVM(Java虚拟机)内存配置
允许Gradle使用多个JVM构建的属性
用于选择进行缩小的工具的属性
构建应用程序包时不压缩本机库的属性等等

Custom Proguard File:自定义Proguard文件
是一个txt文件,包含缩小过程的配置设置
如果缩小删除了一些应该保留的Java代码,你可以添加一条规则来将这些代码保留在此文件中

Minify:代码混淆和缩小相关
是一种缩减、混淆和优化应用程序代码的过程
它可以减小代码大小并使代码更难以反编译
使用 Minify 设置可定义 Unity 应何时以及如何将缩小应用于构建

使用该功能会加长发布时间,并且还会让调试变得复杂,所以一般在最终发布时才会使用,平时发布测试应用时不需要开启。

Use R8:默认情况下,Unity 使用 Proguard 进行缩小。启用此复选框可改为使用 R8。

Release:如果希望 Unity 在发布构建中缩小应用程序的代码,请启用此复选框。

Debug:如果希望 Unity 在调试构建中缩小应用程序的代码,请启用此复选框。

Split Application Binary:拆分应用程序二进制文件
启用 Split Application Binary 选项可将输出包拆分为主包 (APK) 和扩展包 (OBB) 包。如果要发布大于 100 MB 的应用程序,则 Google Play 应用商店需要此功能。
————————————————
版权声明:本文为CSDN博主「狼唤」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41301576/article/details/127353458

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/bake/13518420.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024-01-19
下一篇 2024-01-28

发表评论

登录后才能评论

评论列表(0条)

保存