今天有安卓系統的客戶反應在升級了新版的微信之後,變得無法執行了,實際查看之後,發現不同品牌裝置的表現並不一樣,HTC 的蝴蝶機(4.4)跟 ASUS(4.3)的都沒問題,果然大廠還是比較有保障的。
試著找出問題,發現錯誤是新版的微信 5.3.1 在載入 libwechatCrashForJni.so 這個庫文件時失敗報錯,這個部分的代碼跟 5.3 有不小的差距,引用了不同的加載方式所造成的錯誤,實際上這個庫文件跟5.3是一樣的,也存放在正確的位置上,但是 5.3.1 載入時就會出錯,
5.3 版就沒這問題。
由於不是每個裝置每個品牌都會出錯,所以無法完全歸罪於微信的開發人員(只能說有部分是),但可以確定的是製造商肯定有進步的空間,因為有人做到了。
為什麼同樣的代碼會出現不同的結果呢 ??
怎麼解這問題呢 ??
有興趣的人可以自己試試唄。
錯誤訊息如下 :
D/dalvikvm( 1368): Trying to load lib /mnt/asec/com.tencent.mm-2/lib/libstlport_shared.so 0x418c3280 D/dalvikvm( 1368): Shared lib '/mnt/asec/com.tencent.mm-2/lib/libstlport_shared.so' already loaded in same CL 0x418c3280 W/dalvikvm( 1368): Exception Ljava/lang/NullPointerException; thrown while initializing Lcom/tencent/mm/app/f; D/AndroidRuntime( 1368): Shutting down VM W/dalvikvm( 1368): threadid=1: thread exiting with uncaught exception (group=0x415fdb90) E/AndroidRuntime( 1368): FATAL EXCEPTION: main E/AndroidRuntime( 1368): Process: com.tencent.mm, PID: 1368 E/AndroidRuntime( 1368): java.lang.ExceptionInInitializerError E/AndroidRuntime( 1368): at com.tencent.mm.app.WorkerProfile.ia(SourceFile:307) E/AndroidRuntime( 1368): at com.tencent.mm.app.e.run(SourceFile:109) E/AndroidRuntime( 1368): at android.os.Handler.handleCallback(Handler.java:733) E/AndroidRuntime( 1368): at android.os.Handler.dispatchMessage(Handler.java:95) E/AndroidRuntime( 1368): at android.os.Looper.loop(Looper.java:136) E/AndroidRuntime( 1368): at android.app.ActivityThread.main(ActivityThread.java:5017) E/AndroidRuntime( 1368): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime( 1368): at java.lang.reflect.Method.invoke(Method.java:515) E/AndroidRuntime( 1368): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) E/AndroidRuntime( 1368): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) E/AndroidRuntime( 1368): at dalvik.system.NativeStart.main(Native Method) E/AndroidRuntime( 1368): Caused by: java.lang.NullPointerException E/AndroidRuntime( 1368): at com.tencent.mm.app.f.(SourceFile:46) E/AndroidRuntime( 1368): ... 11 more I/ActivityManager( 430): Displayed com.tencent.mm/.ui.LauncherUI: +828ms W/ActivityManager( 430): Force finishing activity com.tencent.mm/.ui.LauncherUI
從下面的代碼,可以看出實作上的不同:
微信 5.3 版本 (5.3.0.96_r722426) :
public static void ap(String paramString) { g localg = new g(); ak.getContext(); localg.hL(); b.a(localg); localg.aq(paramString); m.ca("wechatCrashForJni"); }
微信 5.3.1 版本 (5.3.1.50_r732663) :
public static boolean ao(String paramString) { cxY = paramString; try { c localc = (au)Class.forName("com.tencent.mm.crash.RDMCrashReporter").newInstance(); ak.getContext(); localc.hL(); bf.dfB.y("last_login_uin", cxX); b.a(localc); new g(); bool = true; return bool; } catch (Exception localException) { while (true) { y.w("mC", "rdm crash reporter load failed"); f localf = new f(); ak.getContext(); localf.hL(); b.a(localf); m.bY("wechatCrashForJni"); boolean bool = false; } } }
About the author