1)java.lang.NoSuchMethodError的不明崩潰問題
2)微信小遊戲有可行的分析Mono內存的方法嗎
3)遊戲運行中,從對象池裏拿Item時動態設置物體錨點,導致DC成倍增加
4)Scriptable Build Pipeline打包Scritptable Object報錯
這是第384篇UWA技術知識分享的推送,精選了UWA社區的熱門話題,涵蓋了UWA問答、社區帖子等技術知識點,助力大家更全面地掌握和學習。
UWA社區主頁:community.uwa4d.com
UWA QQ羣:793972859
Crash
Q:最近被Android的一個崩潰搞得毫無頭緒。煩請各位大佬幫忙指導分析一下。
這裏是從Bugly截取的最後一段崩潰日誌,Unity線程運行良好。然後一個不知名線程突然就報了一個java.lang.NoSuchMethodError的崩潰,更奇怪的找不到函數名name='Thread-37' ,來源文件也是Unknown Source。
19404-18 15:18:27.898 21248 21470 I Unity : CreateScene sceneInst complete 2
19504-18 15:18:27.911 21248 21470 I Unity : Lod level: 1
19604-18 15:18:28.264 21248 22705 W Unity : ! parseType; T is not known!
197--------- beginning of crash
19804-18 15:18:28.282 21248 22705 E AndroidRuntime: FATAL EXCEPTION: Thread-37
19904-18 15:18:28.282 21248 22705 E AndroidRuntime: Process: com.readygo.barrel.gp, PID: 21248
20004-18 15:18:28.282 21248 22705 E AndroidRuntime: java.lang.NoSuchMethodError: no non-static method with name='Thread-37' signature='Thread-37' in class Ljava.lang.Object;
20104-18 15:18:28.282 21248 22705 E AndroidRuntime: at com.unity3d.player.ReflectionHelper.getMethodID(Unknown Source:162)
這個大概會是什麼問題呢?全網搜遍沒有類似的問題。
同時,此問題在GooglePlay後台報的崩潰錯誤如下:
初始是懷疑第三方庫導致,但是和公司同項目組比較過。使用同樣的第三方庫的項目並沒有出現類似崩潰。
所以請問有沒有類似的問題經驗或者思路啓發?非常感謝。
A1:目前使用了一些簡單的方法,此問題算是繞過了。應該是給Java層傳遞某個動作的時候,sig裏傳入了一個‘T',底層並沒有處理這個T導致,但是不知道為什麼會傳入,確定沒有調用任何Java的函數,沒有任何的JNI調用。此問題暫時總結到這裏吧,以後有高手遇到此問題,可以深挖。
程序報錯出自:ReflectionHelper.java中:
if (Log.LOG_WARN) Log.Log(Log.WARN, "! parseType; " + c + " is not known!");偽代碼如下:
private static Class<?> parseType(String sig, int[] sigPos) { if (Log.LOG_VERBOSE && LOGV) Log.Log(Log.VERBOSE, "- parse '" + sig + "' at " + sigPos[0]); while(sigPos[0] < sig.length()) { char c = sig.charAt(sigPos[0]++); if (c == '(') continue; else if (c == ')') continue; if (c == 'L') { int end = sig.indexOf(';', sigPos[0]); if (end == -1) break; String typeName = sig.substring(sigPos[0], end); sigPos[0] = end+1; typeName = typeName.replace('/', '.'); if (Log.LOG_VERBOSE && LOGV) Log.Log(Log.VERBOSE, "- typename = " + typeName); Class<?> t; try { t = Class.forName(typeName); } catch (ClassNotFoundException e) { if (Log.LOG_VERBOSE && LOGV) Log.Log(Log.VERBOSE, e.toString()); break; } return t; } if (c == 'Z') return boolean.class ; if (c == 'I') return int.class ; if (c == 'F') return float.class ; if (c == 'V') return void.class ; if (c == 'B') return byte.class ; if (c == 'C') return char.class ; if (c == 'S') return short.class ; if (c == 'J') return long.class ; if (c == 'D') return double.class ; if(c == '[') { Class<?> type = parseType(sig, sigPos); return Array.newInstance(type, 0).getClass(); } if (Log.LOG_WARN) Log.Log(Log.WARN, "! parseType; " + c + " is not known!"); break; } return null;
感謝題主beginner@UWA問答社區提供了回答
A2:可以看下這個鏈接:
https://rollbar.com/blog/how-to-fix-java-lang-nosuchmethoderr...
感謝Xh6LLqqaaoVb@UWA問答社區提供了回答
A3:針對A2提供的解答,雖然提示java.lang.NoSuchMethodError,但實際上並不是NoSuchMethodError,感覺是開啓線程的時候崩潰了。此問題真的很詭異,目前基本確定了問題是和線程有關係的。
感謝題主beginner@UWA問答社區提供了回答
WebGL
Q:微信小遊戲有什麼可行的分析Mono內存的方法嗎?Memory Profiler一抓幀就卡死。
歡迎有經驗的朋友轉至社區交流:
https://answer.uwa4d.com/question/6627973d5c7f5d2c5805d3b6
UI
Q:遊戲運行中,從對象池裏拿Item時候動態設置物體錨點,導致DC成倍增加,為什麼動態設置錨點會影響DC呢?
A:通過UGUI查是否合批通過Profiler的UI Module最方便。
感謝Wenbo@UWA問答社區提供了回答
AssetBundle
Q:1. 發生了什麼?
給定一個自定義可編寫腳本的對象,它有一個類似於MyScriptableObject m_RefObject的字段,創建3個名為A、B、C的對象。
C引用B、B引用A,使用SBP CompatibilityBuildPipeline.BuildAssetBundles將3個資產構建為單獨的捆綁包。
加載捆綁包A、B、C,加載資產A、B、C。A和B加載成功,而加載C失敗,導致警告“The referenced script on this Behaviour (Game Object '<null>') is missing!'' 並返回 null。
切換到UnityEditor.BuildPipeline.BuildAssetBundles,A、B、C 均加載成功。
2. 如何使用所附示例重現它?
打開示例場景並單擊“播放”,控制枱將顯示資源加載失敗,所有行為均在Entry.cs內。
使用版本:
com.unity.scriptablebuildpipeline: 1.20.2/ 1.21.9
Unity 2021.3.25f1
有沒有人遇到過這個問題,怎麼解決?
歡迎有經驗的朋友轉至社區交流:
https://answer.uwa4d.com/question/661364835c7f5d2c5805d394
封面圖來源於網絡
今天的分享就到這裏。生有涯而知無涯,在漫漫的開發週期中,我們遇到的問題只是冰山一角,UWA社區願伴你同行,一起探索分享。歡迎更多的開發者加入UWA社區。
UWA官網:www.uwa4d.com
UWA社區:community.uwa4d.com
UWA學堂:edu.uwa4d.com
官方技術QQ羣:793972859