??相信大家在開發(fā)過程中都用過一些錯誤日志信息收集工具,比如友盟統(tǒng)計 或者騰訊的Bugly 骂远,或者本地的錯誤日志信息收集方法刻恭。不管哪種方法,它都會記錄一些出錯的代碼段硼一,類似下面這樣的信息:
從這段報錯信息中我們注意到:問題是出在了com.saicfinance.menu1文件夾下的b類的q方法中累澡,那么這個b和q又指的是什么呢?我們該如何找到它混淆之前是什么類和方法呢般贼?
??首先我們需要知道的一個常識是愧哟,當(dāng)我們代碼混淆后會在module->build->outputs->mapping->release文件夾下面生成一個mapping.txt
文件,或者你在項目中找到proguardMapping.txt
也是一樣的哼蛆。這里面記錄了混淆前后對應(yīng)的代碼蕊梧。下面介紹兩種方法來找到混淆前后對應(yīng)的代碼。
使用Android自帶的proguard圖形界面工具來還原代碼
首先找到安裝的Android SDK的文件夾腮介,我這邊的路徑是C:\Users\Administrator\AppData\Local\Android\Sdk
肥矢,然后在tools文件夾下又一個proguard文件夾,打開里面的bin文件夾叠洗,里面會有一個progurad.bat:
甘改,雙擊打開proguard.bat,會出現(xiàn)一個圖形界面:先選中左邊菜單欄的Retrace然后就會出現(xiàn)右邊的界面灭抑,上面是讓你選擇你項目中的Mapping 文件十艾,下面的框框里是需要還原的被混淆的代碼,那就把我們剛才友盟上面的那段代碼貼進去腾节,再點一下右下角的Retrace忘嫉,這時候還原的結(jié)果就出現(xiàn)在了下方。不過尷尬的是案腺,下方顯示的還是混淆的代碼庆冕,并沒有被還原掉(這里猜測一下原因可能是因為這份proguardMapping文件并不是上線打包時的那份文件了,后來幾次打包修改了proguardMapping文件導(dǎo)致無法還原掉)劈榨。這里我嘗試了好幾次访递,還是那樣,代碼無法被還原鞋既,這時候我換了另外一段代碼:
把這段代碼copy到progurad程序中看看:看結(jié)果竟然能夠完整的還原來出來力九,說明這個還是有用的耍铜,然后我嘗試了其他的報錯信息,發(fā)現(xiàn)一些系統(tǒng)的api還有一些大的類庫的混淆可以識別出來跌前,但是自己項目中寫的代碼混淆就沒辦法還原棕兼,暫時還沒找到這個問題的原因。當(dāng)然對于還原不了的代碼我們還有第二種辦法抵乓。
直接在mapping.txt文件中查找
以上面第一個錯誤為例伴挚,報錯信息是:
java.lang.NullPointerException: Attempt to invoke interface method 'void com.saicfinance.pcsdsp.func.menu1.b.q(java.lang.String)' on a null object reference
那么對應(yīng)的在mapping.txt文件中去查找com.saicfinance.pcsdsp.func.menu1.b
先找到b
類,果然找到了對應(yīng)的信息灾炭,如下:
b類對應(yīng)的就是MainMenuContract中的Preseter茎芋,這個Presenter底下有兩個方法,分別是a和q蜈出,那么com.saicfinance.pcsdsp.func.menu1.b.q我們就知道是什么了田弥,就是presenter在調(diào)用menuFunctions方法的時候報了空指針,于是在代碼中找到了報錯的代碼位置:
最后編輯于 :2019.10.14 14:06:19
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者