[Unity]Unity跨平台开发之针对Android开发
用户手册的这一部分包含Android平台关于输入(input)、资产管理(asset management)和调试(debugging)等相关主题的开发信息。
Android移动脚本编写
注意:安卓可以在C#中使用UNITY_ANDROID来进行宏定义编译。具体可以参考不同平台的宏定义编译。
设备输入相关、震动相关内容,可以参阅以下链接:
- Mobile device input
- Mobile keyboard
- Handheld.Vibrate
活动指示器(Activity indicator)
可以使用以下接口来获取设备相关的属性信息:
脚本 | 设备属性 |
SystemInfo.deviceUniqueIdentifier | 返回安卓设备ID的md5值,更多信息可参 考ANDROID_ID |
SystemInfo.deviceName | 返回设备名。对于安卓设备来说,Unity会尝试从系统安全设置中读取device_name和bluetooth_name。假如读取不到这些值,会返回<unknown>。 |
SystemInfo.deviceModel | 返回设备型号。通常包括制造商名称和具体型号(例如:“LGE Nexus 5“或者”SAMSUNG-SM-G900A“)。 |
SystemInfo.operatingSystem | 返回操作系统名称和版本。 |
GooglePlay应用分发
参考链接:Unity - Manual: Android application size restrictions
安卓图形(Graphics for Android)
Android设备的硬件功能因型号而异,市场上有许多不同的Android型号。在开发图形功能和编写着色器时需要着重考虑这一点。
屏幕配置
Unity提供了在编辑器中和运行时配置屏幕的功能。
屏幕方向
您可以在Android设备上控制应用程序的屏幕方向。检测屏幕方向变化的功能或强制指定方向的功能对于某些需要依赖特定方向的应用非常有用。
要获取当前应用程序的屏幕方向,可以访问Screen.orientation属性。可用的方向包括:
方向 | 行为 |
Portrait | 该应用程序处于竖屏模式,要求设备直立且主页按钮位于底部。 |
PortraitUpsideDown | 该应用程序处于竖屏模式但颠倒过来,并期望设备直立且主页按钮位于顶部。 |
LandscapeLeft | 该应用程序处于横屏模式,并期望设备直立且主页按钮位于右侧。 |
LandscapeRight | 该应用程序处于横屏模式,并期望设备直立且主页按钮位于左侧。 |
无论应用程序的默认方向如何设置,您的应用程序的屏幕方向可能会因用户设置的设备方向而有所不同。
以下表格显示了应用程序设置的默认屏幕方向,以及根据设备方向加载的实际屏幕方向:
默认屏幕方向:自动旋转 (Autorotate) | 默认屏幕方向:竖屏(Portrait) | 默认屏幕方向:横屏 (Landscape) | |
设备方向:自动旋转 (Autorotate) | 应用程序屏幕以纵向加载,并可以在纵向、纵向上下、横向右侧和横向左侧方向之间旋转。 | 应用程序屏幕以纵向加载,并可以在纵向和纵向倒置方向之间旋转。 | 应用程序屏幕的加载方向与设备方向相同。如果设备方向为纵向,则应用程序屏幕将以纵向加载,并可以旋转为横向。在横向模式下,屏幕只能在横向向右或横向向左方向之间旋转。 |
设备方向:竖屏锁定 (Portrait lock) | 应用程序屏幕加载后将保持锁定在纵向。 ScreenOrientation.AutoRotation属性设置为 false,则屏幕方向保持不变。 | 应用程序屏幕加载并保持锁定在纵向方向。 | 即使您将纵向选项设置为false,应用程序屏幕也会加载并保持纵向锁定。要允许屏幕旋转,请将所需的方向分配给Screen.orientation属性。您可以使用ScreenOrientation.AutoRotation启用自动旋转。 |
设备方向:横屏锁定 (Landscape lock) | 应用程序加载并保持锁定在横向方向。 | 即使您将任一选项设置为 false,应用程序也会以横向加载,并根据设备方向保持锁定在横向左侧或横向右侧方向。 | 应用程序以横向加载,并根据设备方向保持锁定在横向左侧或横向右侧方向。 |
测试和调试
Android符号表(Android symbols)
符号表是内存地址与函数名、文件名、行号的映射表。有了符号表,才能根据程序堆栈看出方法调用过程。
格式:<起始地址> <结束地址> <函数> [<文件名:行号>]
Android symbols
- libmain: 负责初始 Unity 引擎加载逻辑。
- libunity: Unity引擎代码。
- libil2cpp: 由项目内C#脚本编译生成的C++代码。
上传符号表到 Firebase
两种方法
- 通过 gradle 上传
但是不知为何,libil2cpp 始终无法解析成功,符号文件的 uuid 应该是正确的,因为用第二种方法上传后,就可以解析。
Firebase 文档:获取 Android NDK 崩溃报告
- 通过 firebase cli 命令上传,解析 il2cpp.so
FIREBASE_APP_ID 在 Firebase Crashlytics 控制台拿,符号文件需要自己符号表收集一个文件夹中,然后指定上传这个文件夹。
firebase crashlytics:symbols:upload --app=FIREBASE_APP_ID PATH/TO/SYMBOLS
如何触发 Unity Crash
UnityEngine.Diagnostics.Utils.ForceCrash(UnityEngine.Diagnostics.ForcedCrashCategory.AccessViolation);
导出符号表
- 打开Unity的Build Settings窗口。
- 切换安卓平台。
- 设置Create symbols.zip选项。
Public和Debugging的区别
1. Public Symbols (公共符号)
- 内容:
Public symbols 是符号表的一部分,包含了程序中公共符号的基本信息,例如函数名称、全局变量的名称及其地址映射。
它们通常不包含具体的调试信息,如本地变量、代码的行号信息。 - 用途:
- 崩溃日志的基本分析:提供函数调用栈的符号解析,但信息有限,只能看到高层的函数调用。
- 减小调试信息的大小:比完整的 debug symbols 文件小得多。
- 特性:
- 较少暴露代码的内部实现细节(例如私有变量、局部变量等),因此更适合在生产环境中使用。
- 用于帮助开发人员对发布后的崩溃日志进行初步分析。
- 生成位置:
- 在 Unity 的构建设置中,可以选择导出符号文件。公共符号文件通常用于发布环境。
2. Debug Symbols (调试符号)
- 内容:
Debug symbols 是完整的调试信息,包含公共符号以及更详细的调试数据,例如:- 函数的局部变量。
- 代码的行号信息。
- 代码与生成的二进制文件之间的映射。
- 用途:
- 详细调试:提供了完整的符号信息,可以用于调试器(如 Visual Studio、lldb 等)对程序进行深度分析。
- 定位问题:开发过程中,通过符号信息能够准确定位到代码的某一行或某个函数。
- 崩溃日志详细分析:可以根据符号信息恢复更完整的调用栈和变量内容。
- 特性:
- 文件体积大(相比 public symbols)。
- 包含代码的敏感信息,不适合直接随应用发布。
- 通常在开发和测试阶段使用。
- 生成位置:
- Unity 中可以在构建设置中选择生成调试符号。
- Debug symbols 通常存储为 .pdb 文件(在 Windows 上)或 .dSYM 文件(在 macOS/iOS 上)。
注意:符号文件名必须与符号文件所属的共享库的名称匹配。例如,如果共享库名为mylibrary.so,则符号文件也必须命名为mylibrary.so。为了避免文件名冲突,符号文件和共享库必须位于不同的目录中。
重要提示:请确保符号文件是最新的,并且与包含可执行代码的共享库兼容。否则,本地调试器和 Google Play 将无法解析共享库中代码的堆栈跟踪。
参考文档
- Unity Manual : Android symbols
- Firebase上无NDK符号表的解决
- Firebase 文档:获取Android NDK崩溃报告
- 为非Gradle构建或不可访问的未剥离本机库上传符号
- Unity异常处理与分析
- 用addr2line手动解析函数地址Symbolicate Android crash
- Firebase Crashlytics初始化及上传符号表
在Android中创建和使用插件
Unity 支持原生插件,它们可以是用C、C++和Objective-C等语言编写的本机代码库。插件允许您用C#编写的代码调用这些库中的函数。此功能允许Unity与中间件库或现有的 C/C++代码集成。
Android插件
- Android库项目和Android Archive插件(AAR)
- JAR插件
- Android原生插件
- Java和Kotlin源代码插件
其他
- Unity中的插件
注:文章摘要翻译自Unity官方手册,版本2022.3x。
相关文章:

[Unity]Unity跨平台开发之针对Android开发
用户手册的这一部分包含Android平台关于输入(input)、资产管理(asset management)和调试(debugging)等相关主题的开发信息。 Android移动脚本编写 注意:安卓可以在C#中使用UNITY_ANDROID来进行…...
ELK部署
背景 很多公司还是在单体项目中苦苦挣扎,没有必要上elk系统,大家都懂的一个原则系统的技术栈越多系统越复杂,维护起来也越麻烦,在没有大流量高并发的情况下我们就用单体服务挺舒服。我们行业的特殊性做的都是BTB的项目࿰…...

ELK系列-(四)轻量级的日志收集助手-Beat家族
一、前文回顾 ELK系列-(一)Docker部署ELK核心组件 ELK系列-(二)LogStash数据处理的瑞士军刀 ELK系列-(三)Kibana 数据可视化的艺术家 关于部署的整体架构欢迎大家回到前面的文章观看,此处&a…...
NodeJs-包管理工具
包英文单词是 package ,代表了一组特定功能的源码集合 管理包的应用软件,可以对包进行 下载安装 , 更新 , 删除 , 上传 等操作 借助包管理工具,可以快速开发项目,提升开发效率 前端常用的包管理…...

AWR microwave office 仿真学习(二)使用多层结构天线/超表面的S参数确定层间距
引言 如果大家有看过一些多层天线或超表面的论文,有两种比较常用的分析方法,等效电路法和传输线分析法,这两种方法都是三维结构的电磁问题转换为二维/集总的电路问题。本文就介绍根据这种思想进行多层结构优化的一种方法:在AWR软件中根据单层结构的S参数,确定最佳层间距。…...

【zlm】 webrtc源码讲解三(总结)
目录 setsdp onwrite 编辑 play 参考 setsdp onwrite play 参考 【zlm】 webrtc源码讲解_zlm webrtc-CSDN博客 【zlm】 webrtc源码讲解(二)_webrtc 源码-CSDN博客...
Springboot+Druid(可切换Hikari)+Mybatis-plus+mysql+hive的多数据源项目配置
1.搭建一个springboot项目,不会的搜一下,很简单这里不做赘述。 2.首先你搭建的springboot能正常启动之后,pom文件添加如下依赖: <dependency><groupId>com.alibaba</groupId><artifactId>druid</arti…...
Git使用步骤
Git 是一个分布式版本控制系统,广泛用于软件开发和其他需要跟踪文件变更的项目。以下是 Git 的基本使用方法和一些常用命令的详细说明。 安装 Git 在大多数操作系统上,你可以通过包管理器安装 Git: Windows: 下载并安装 Git for Windows。…...

Python+OpenCV系列:AI看图识人、识车、识万物
在人工智能风靡全球的今天,用 Python 和 OpenCV 结合机器学习实现物体识别,不仅是酷炫技能,更是掌握未来的敲门砖。本篇博文手把手教你如何通过摄像头或图片输入,识别人、动物、车辆及其他物品,让你的程序瞬间具备 AI …...

springboot449教学资源共享平台(论文+源码)_kaic
摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统教学资源共享平台信息管理难度大,容错率低&am…...

类OCSP靶场-Kioptrix系列-Kioptrix Level 4
一、前情提要 二、实战打靶 1. 信息收集 1.1. 主机发现 1.2. 端口扫描 1.3.目录遍历 1.4. 敏感信息 2.漏洞发现 2.1.登录框万能密码 2.2.系统用户密码-ssh链接 2.3.mysql-udf提权 一、前情提要 kali黑客-利用searchsploit搜索exp一键化攻击-CSDN博客 一篇文章带你理…...

贪心算法在背包问题上的运用(Python)
背包问题 有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? 这就是典型的背包问题(又称为0-1背包问题),也是具体的、没有经过任何延伸的背包问题模型。 背包问题的传统求解方法较为复杂,现定义有一个可以载重为8kg的背…...
POD 存储、PV、PVC
目录 容器如何持久化存储? PV和PVC 为什么不能直接在 Pod 或容器中存储数据? 什么是 PV和 PVC? 可以使用本地磁盘空间创建PV吗? 如何让客户端通过ftp上传到远端服务器的POD里面? 另一个POD想访问ftp的POD里面的…...

C中strlen和sizeof的区别
1、代码如下: #include<stdio.h>int main() {char a[10] { h,e,l,l,0};printf("%d\n",strlen(a));printf("%d\n", sizeof(a));return 0; } 2、运行结果如下:...

WSL2内部的Ubuntu怎么设置网络内桥接模式,弄了好久老是不成功,怎么办?
环境: Win10专业版 WSL2 Ubuntu22.04 问题描述: WSL2内部的Ubuntu怎么设置网络内桥接模式 解决方案: 方法一 1.控制面板开启,Hyper-V 管理器 2.重启电脑 3…创建外部虚拟交换机 打开 Hyper-V 管理器,在右侧操作面板中点击“虚拟交换机管理器”。 选择“创建虚…...

Linux环境下 搭建ELk项目 -单机版练习
前言 ELK 项目是一个由三个开源工具组成的日志处理和分析解决方案,ELK 是 Elasticsearch、Logstash 和 Kibana 的首字母缩写。这个项目的目标是帮助用户采集、存储、搜索和可视化大量的日志和事件数据,尤其是在分布式系统中。下面是每个组件的概述&…...

ubuntu20.04安装mysql5.7
安装之前要确保之前没安装过或者安装后卸载干净了,不然后面的配置文件可能会报错。 1. 下载安装包 打开链接 downloads.mysql.com/archives/co… 选择相应版本进行下载,这里mysql版本选择 5.7.35,系统选择Ubuntu Linux,选择64位…...
MacPorts 安装 Tengine
创建 Portfile 以下是我参考 nginx 调整后的 Portfile,如需安装指定版本,除了修改版本号之外还需要修改 checksums 里的 sha256 sha256 值需下载 Tengine 源码文件(tar.gz)进行计算 模块的调整在最后的 configure.args-append …...

Git安装及基础学习
Git学习 Git安装 概述: Git是一个开源的分布式版本控制系统,可以有效、高速的处理 从很小到非常大的项目版本管理,是目前使用范围最广的版本 管理工具。 下载安装: 下载地址:https://git-scm.com/ 下载后傻瓜式一键安…...

【celery】任务有时候不执行
celery任务有时执行,有时不执行,这种情况是任务被冒领;有时执行说明这个方法可以使用,有时不执行通常是被使用同一个消息队列的进程冒领了; 解决 Redis:指定一个分块就行了...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...