关于android:Target-API-level升级到31后Android-12启动黑屏卡死

34次阅读

共计 2783 个字符,预计需要花费 7 分钟才能阅读完成。

1)Target API level 降级到 31 后 Android 12 启动黑屏卡死
​2)Unity Renderer 中 SortingLayer、SortingOrder 底层如何实现渲染排序
3)如何用 Addressable 实现按需下载
4)多个 Package 须要不同版本的 DLL 的解决方案


这是第 309 篇 UWA 技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫 10 分钟,认真读完必有播种。

UWA 问答社区:answer.uwa4d.com
UWA QQ 群 2:793972859(原群已满员)

Android

Q:以后海内版本有硬性要求:Target API level 必须降级到 31,降级之后在 Android 12 机型上启动游戏,Unity 闪屏之后卡死,其余 Android 版本失常。

咱们应用的 Unity 版本:2017.4.27f
其余一些简略测试:去掉闪屏,导出新的空工程,都会呈现启动卡死。

其余一些 Unity 论坛上的形式尝试均失败:
https://forum.unity.com/threa…
https://forum.unity.com/threa…

之前咱们也遇到降级之后无奈装置的问题,而后参照其余解决了装置,只是黑屏无奈解决。以后最新尝试 Unity 2019 版本是失常,初步判断是与以下问题同时修复的:
https://issuetracker.unity3d….

不晓得是否有其余大神遇到此问题并解决了?如果有降级之后失常,请告知一下 Unity 版本号,谢谢。

A:查了一下这个问题,是因为 TelephonyManager 的 listen 函数在 Android 12 过期了,如果没有受权 READ_PHONE_STATE 权限,此函数会抛出一个 SecurityException。

而 Unity 在启用了自带的音频系统的状况下,凑巧在启动时机会去调用这个办法以实现“在用户接电话时游戏静音”的性能,抛出的异样影响了后续的流程导致卡死。

论坛上有人遇到了相似的问题,然而体现为解体:
https://forum.unity.com/threa…

我的项目能降级引擎的话,能够试试这里提到的修复的版本:
https://issuetracker.unity3d….

如果我的项目不能降级引擎,也有一个解决办法:

  • 反编译 classes.jar
  • 批改 UnityPlayer 类的 addPhoneCallListener 实现,判断 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) return;据说 Android 12 开始不须要本人解决静音了
  • 再编回 classes.jar

感激 [email protected] 问答社区提供了答复

Rendering

Q:Unity Renderer 中 SortingLayer、SortingOrder 底层是如何实现渲染排序的?

A1:第一级是材质 RenderQueue 的区间:不通明(<2499)优先,而后半透明(>=2500)。
第二级是 SortingLayer。
第三级是 SortingOrder。
第四级是材质 RenderQueue 自身。

感激欧月松 @UWA 问答社区提供了答复

A2:Unity 残缺渲染程序如下:

  1. CameraDepth 从小到大
    开始渲染不通明物体(RenderQueue < 2500)
  2. SortingLayer 从小到大
  3. SortingOrder 从小到大
  4. RenderQueue 从小到大
  5. 物体深度近到深度远
    开始渲染半透明物体(RenderQueue >= 2500)
  6. SortingLayer 从小到大
  7. SortingOrder 从小到大
  8. RenderQueue 从小到大
  9. 物体深度远到深度近

感激萧小俊 @UWA 问答社区提供了答复

Addressable

Q:如何用 Addressable 实现按需下载,大体是想要实现上面两个性能:

1. 一部分资源是在游戏启动的时候去更新的。
2. 还有一部分资源是在玩家玩到某个关卡的时候,让玩家手动触发下载。当然,这些关卡,没有下载实现之前,玩家是不能玩的。

A:可参考 Unity 官网实例 Git,其中 Advanced/Play Asset Delivery 这个案例很好地展现了 AssetBundle 和 Google 新格局 aab 的联合以及打包 Asset Packs 后,哪些资源预下载,哪些资源实时下载。
https://github.com/Unity-Tech…

感激郑骁 @UWA 问答社区提供了答复

Scripting

Q:具体情况就是 Google ProtoBuf 库的高版本会强制依赖 System.Runtime.CompilerServices.Unsafe.dll 4.0.4.1 版本。

而后 Unity 内置的 Package com.unity.collections 会本人带进来一个 DLL,并且版本不匹配。

当初有没有方法,导入一个 DLL,并且只让某一个 Package 内的代码进行援用。或者有没有其余代替计划,比方禁止 com.unity.collections 带入本人的 Unsafe.dll 之类的流程?

其余就是思考一个流程从新编译 ProtoBuf 的动静库,使其内含一个本人用的依赖库。然而这个依赖库也不好找源码。

次要问题是:com.unity.collections 是 Unity 原生并主动植入的,不进入 Packages 门路,间接植入到 Library。所以没有方法手动调整门路。当初临时是用脚本在启动编辑器时替换 Library 外面的动静库。然而这个流程不洁净,心愿有个洁净的唱工。

A:先把我的项目中反复度高的 DLL 都放在一个 Common Package 中,而后把 com.unity.collections 拉到本地变成 Local Package,再去依赖 Common Package,最初就让 Google ProtoBuf 也去依赖这个 Common Package。

对于 Unity 原生并主动植入的 Package,个别从 Library 拉到本地就行,留神一下最初的 package-lock.json 文件中 com.unity.collections 的 Version 为 file:XXXXX,并且 Source 显示为 Embedded 就代表胜利了。

感激萧小俊 @UWA 问答社区提供了答复

封面图来源于网络


明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在 UWA 问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官网技术博客:blog.uwa4d.com
官网问答社区:answer.uwa4d.com
UWA 学堂:edu.uwa4d.com
官网技术 QQ 群:793972859(原群已满员)

正文完
 0