
好久我這個小屌絲兒沒有寫博客了,今天又重新開了一個簡書,開始重操舊業(yè)啦!了解Android的人都知道應用的代碼是用java編寫的,輕輕松松就可以反編譯源碼。開發(fā)者一般會不約而同的想到使用 ProGuard,對這就一般意義上的混淆,最近在研究混淆的問題,非常納悶混淆的真正原因,(一看到這里有的小伙伴兒就要開噴了,鍵盤俠們別激動等我把話說完,再噴我^O^),Android做為前端,大部分地方是用來與用戶進行數(shù)據(jù)互動。(何為數(shù)據(jù)互動就是把后臺的數(shù)據(jù)用漂亮的界面顯示在前端)這些代碼不存在安全性可言,那混淆的真正作用是什么,
1.保護源碼不被篡改
我先給大家講一個例子。比如一個應用有個功能是付費的,恰好這個功能在沒有付費之前已經(jīng)寫在本地只是一個判斷的語法而已。那么我們最快的做法就反編譯去掉這一行判斷重新打包就可以了,那么大家應該明白了這個突出了混淆最重要的一個作用那就是保護源碼不被篡改。(現(xiàn)在最新的做法是把代碼放到后臺只有真正付費才會下到本地,這種做法的實現(xiàn)方式有很多,什么動態(tài)加載,代理都可以實現(xiàn)這里就不一一去說了。等有時間我再寫這方面的內(nèi)容)。開發(fā) Android 沒有人不知道 Jake Wharton 大神吧,也沒有人沒用過 Square 的開源庫吧?Jake 除了寫開源軟件(當然沒必要混淆)以外,也寫商業(yè) app。他對于 ProGuard 的態(tài)度就很有意思 —— 完全不去用。原因很簡單:他們的價值不在 client 而在 server 端,對滴這就是我今天費勁周折要說的重點,雖然現(xiàn)在Android機器的硬件已經(jīng)非常厲害,比如本屌絲的機子4核3g已經(jīng)算是低配了(呵呵噠,有點慚愧啊),但是真正的邏輯是要在后臺實現(xiàn),不管后臺邏輯多么復雜,只要讓前端多快一點都是需要這么做的,前端真正意義是在于如何以窗口的形式顯示后臺給的數(shù)據(jù),并更好的與用戶互動。(但是你也是知道的很多不太主流的公司,還是什么事情如果前臺能處理那就前臺處理,生怕浪費了我們的4核cpu,導致前臺不能把更多精力放在顯示界面上,而用來對數(shù)據(jù)進行整理,失去了前端真正的意義)
2.真正需要考慮安全的代碼,真的會用java編譯嗎?
答案可想而知,如果嘗試的反編譯微信,支付寶的代碼的可以看到里面大量的.so文件,他們真正有價值的代碼是用c寫的,通過jni調(diào)用,這樣不僅安全而且一套代碼Android,iOS都可用。這個才是最安全的做法!


3.對包的大小和性能的影響
ProGuard的原理是把類和方法名變成a b c d 換成這樣普通人看不太懂的名稱,這樣的目的可以想而知,讓破解更有難度,但是對于Dalvik虛擬機來講的話,字節(jié)少很多,編譯速度會更快,對應的apk就會小。

隨著公司的發(fā)展對功能的要求越來越多,而這一切就寄托在app上,代碼量就會越來越大,而且很多開發(fā)者采用的是解耦比較好的MVP或MVVM的框架,看似讓代碼更加易于開發(fā)者閱讀,實際上會多出很多回調(diào)方法(這就是任何一種框架好的地方必然會有他的規(guī)則限制)讓代碼的方法數(shù)大很多,所以混淆在包的大小和性能上提升的意義很大!
今天就到這里吧!以后周六周日有時間繼續(xù)分享!
歡迎來github提問https://github.com/JunWeiUp/ProGuard
,如果喜歡的話可以star一下。╭(╯ε╰)╮