Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 代碼混淆

代碼混淆

編輯:關於Android編程

一.概述

1.Android Studio中做混淆,基本就是對Proguard-rules.pro文件的操作。混淆的過程也是有規律可循 2.寫出適合自己代碼的混淆規則 3.minifyEnabled主要用來控制是否運行混淆的 4.然後我們就可以到proguard-rules.pro文件中加入我們的混淆規則了。 5.代碼混淆(Obfuscated code)亦稱花指令,是將計算機程序的代碼,轉換成一種功能上等價,但是難於閱讀和理解的形式的行為。

二.ProGuard作用

1 壓縮(Shrinking):默認開啟,用以減小應用體積,移除未被使用的類和成員,並且會在優化動作執行之後再次執行(因為優化後可能會再次暴露一些未被使用的類和成員)。 2.優化(Optimization):默認開啟,在字節碼級別執行優化,讓應用運行的更快。 3.混淆(Obfuscation):默認開啟,增大反編譯難度,類和類成員會被隨機命名,除非用keep保護。 4.混淆後默認會在工程目錄
app/build/outputs/mapping/release下生成一個mapping.txt文件,這就是混淆規則,我們可以根據這個文件把混淆後的代碼反推回源本的代碼,所以這個文件很重要,注意保護好。原則上,代碼混淆後越亂越無規律越好,但有些地方我們是要避免混淆的,否則程序運行就會出錯,所以就有了下面我們要教大家的,如何讓自己的部分代碼避免混淆從而防止出錯 5.移除是指在壓縮(Shrinking)時是否會被刪除

三.部分代碼避免混淆,設置混淆規則

1.一顆星表示只是保持該包下的類名,而子包下的類名還是會被混淆;兩顆星表示把本包和所含子包下的類名都保持;用以上方法保持類後,你會發現類名雖然未混淆,但裡面的具體方法和變量命名還是變了,這時如果既想保持類名,又想保持裡面的內容不被混淆,我們就需要以下方法了
\

2.在此基礎上,我們也可以使用Java的基本規則來保護特定類不被混淆,比如我們可以用extend,implement等這些Java規則。如下例子就避免所有繼承Activity的類被混淆
\

3.如果我們要保留一個類中的內部類不被混淆則需要用$符號,如下例子表示保持ScriptFragment內部類JavaScriptInterface中的所有public內容不被混淆。

4.如果我們要保留一個類中的內部類不被混淆則需要用$符號,如下例子表示保持ScriptFragment內部類JavaScriptInterface中的所有public內容不被混淆。
\

5.再者,如果一個類中你不希望保持全部內容不被混淆,而只是希望保護類下的特定內容,就可以使用
\ 6.你還可以在或前面加上private 、public、native等來進一步指定不被混淆的內容,如 表示One類下的所有public方法都不會被混淆,當然你還可以加入參數,比如以下表示用JSONObject作為入參的構造函數不會被混淆
\
\ 7.有時候你是不是還想著,我不需要保持類名,我只需要把該類下的特定方法保持不被混淆就好,那你就不能用keep方法了,keep方法會保持類名,而需要用keepclassmembers ,如此類名就不會被保持,為了便於對這些規則進行理解,官網給出了以下表格
\

四.不能被混淆的注意事項

1.jni方法不可混淆,因為這個方法需要和native方法保持一致;
\

2.反射用到的類不混淆(否則反射可能出現問題,可能會出現問題,如NoSuchFiledException或者NoSuchMethodException等,.) 因為反序列化創建對象本質還是利用反射,會根據json字符串的key作為屬性名稱,value則對應屬性值.

3.AndroidMainfest中的類不混淆,所以四大組件和Application的子類和Framework層下所有的類默認不會進行混淆。自定義的View默認也不會被混淆;所以像網上貼的很多排除自定義View,或四大組件被混淆的規則在Android Studio中是無需加入的;

4.與服務端交互時,使用GSON、fastjson等框架解析服務端數據時,所寫的JSON對象類不混淆,否則無法將JSON解析成對應的對象,實體類由於涉及到與服務端的交互,各種gson的交互如此等等,是要保留的。將你項目中實體類都拎出來, 如果你的實體類都在一個包下,那你就幸福了;

5.使用第三方開源庫或者引用其他第三方的SDK包時,如果有特別要求,也需要在混淆文件中加入對應的混淆規則,打開你的build.gradle文件,查看你用了哪些第三方的包,去他們的官網把已經寫好的混淆copy下來,一般官網都是有混淆的,沒有的話就google,也沒有的話自己按照上面的寫法自己寫,還不會的話。。。。。只能換個包。。。。。如果你是直接包含的jar包的話,你這樣寫。

\

6.有用到WebView的JS調用也需要保證寫的接口方法不混淆,原因和第一條一樣; 7.Parcelable的子類和Creator靜態成員變量不混淆,否則會產生Android.os.BadParcelableException異常;
\ 8.使用enum類型時需要注意避免以下兩個方法混淆,因為enum類的特殊性,以下兩個方法會被反射調用,見第二條規則。
\

9.發布一款應用除了設minifyEnabled為ture,你也應該設置zipAlignEnabled為true,像Google Play強制要求開發者上傳的應用必須是經過zipAlign的,zipAlign可以讓安裝包中的資源按4字節對齊,這樣可以減少應用在運行時的內存消耗。

五.工具

1.但是也會導致我們收集到的崩潰的stacktrace變得更加難以讀懂。 ,retrace,用來將混淆後的stacktrace還原成混淆之前的信息。 2.路徑為./tools/proguard/bin/retrace.sh

六.資源文件的混淆
資源文件的混淆,所以這塊內容還是等到一個相對穩定,並且重構完成後再來更新

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved