动态

详情 返回 返回

java.lang.NoSuchMethodError的不明崩潰問題 - 动态 详情

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

Add a new 评论

Some HTML is okay.