代碼混淆器到底是不是病毒,安卓代碼混淆


代碼混淆器到底是不是病毒,安卓代碼混淆

文章插圖
代碼混淆的介紹:
代碼混淆器到底是不是病毒,安卓代碼混淆

文章插圖
代碼混淆(Obfuscated code)亦稱花指令 , 是將計算機程序的代碼 , 轉換成一種功能上等價 , 但是難于閱讀和理解的形式的行為 。代碼混淆可以用于程序源代碼 , 也可以用于程序編譯而成的中間代碼 。執行代碼混淆的程序被稱作代碼混淆器 。目前已經存在許多種功能各異的代碼混淆器 。將代碼中的各種元素 , 如變量 , 函數 , 類的名字改寫成無意義的名字 。比如改寫成單個字母 , 或是簡短的無意義字母組合 , 甚至改寫成“__”這樣的符號 , 使得閱讀的人無法根據名字猜測其用途 。重寫代碼中的部分邏輯 , 將其變成功能上等價 , 但是更難理解的形式 。比如將for循環改寫成while循環 , 將循環改寫成遞歸 , 精簡中間變量 , 等等 。打亂代碼的格式 。比如刪除空格 , 將多行代碼擠到一行中 , 或者將一行代碼斷成多行等等 。代碼混淆器也會帶來一些問題 。主要的問題包括:被混淆的代碼難于理解 , 因此調試除錯也變得困難起來 。開發人員通常需要保留原始的未混淆的代碼用于調試 。對于支持反射的語言 , 代碼混淆有可能與反射發生沖突 。代碼混淆并不能真正阻止反向工程 , 只能增大其難度 。因此 , 對于對安全性要求很高的場合 , 僅僅使用代碼混淆并不能保證源代碼的安全 。
android中哪些東西不能做代碼混淆:
代碼混淆器到底是不是病毒,安卓代碼混淆

文章插圖
常見的不能混淆的AndroidCodeAndroid 程序  , 下面這樣代碼混淆的時候要注意保留 。
Android系統組件 , 系統組件有固定的方法被系統調用 。
被Android Resource 文件引用到的 。名字已經固定 , 也不能混淆 , 比如自定義的View。
Android Parcelable  , 需要使用android 序列化的 。
其他Anroid 官方建議 不混淆的 , 如
android.app.backup.BackupAgentHelper
android.preference.Preference
com.android.vending.licensing.ILicensingService
Java序列化方法 , 系統序列化需要固定的方法 。
枚舉  , 系統需要處理枚舉的固定方法 。
本地方法 , 不能修改本地方法名
annotations 注釋
數據庫驅動
有些resource 文件
用到反射的地方本被提問者和網友采納
如何混淆代碼和相關配置:
代碼混淆器到底是不是病毒,安卓代碼混淆

文章插圖
項目發布之前混淆是必不可少的工作 , 混淆可以增加別人反編譯閱讀代碼的難度 , 還可以縮小APK包 。
使用步驟:
1、修改project.properties文件:
Java代碼 收藏代碼
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
# proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
去掉proguard.config一行前面的#注釋;
2、配置proguard-project.txt文件:
這個是主配置文件 , 里面配置哪些需要混淆 , 哪些不需要混淆的選項;
提供給外部的類、方法、變量等名字不能混淆;
在AndroidManifest中配置的類(Activity、Service等的子類及Framework類默認不會進行混淆)
不混淆Parcelable的子類 , 防止android.os.BadParcelableException
Jni中調用的類
反射用到的類
項目中的實體類
3、導出項目:
export簽名項目 。
4、查看是否混淆成功:
用反編譯工具反編譯并對比未混淆的代碼;
5、運行ProGuard及其生成的文件介紹
在以release模式下打包apk時會自動運行ProGuard , 這里的release模式指的是通過ant release命令或eclipse project->android tools->export signed(unsigned) application package生成apk 。在debug模式下為了更快調試并不會調用proguard 。
如果是ant命令打包apk , proguard信息文件會保存于<project_root>/bin/proguard文件夾內;如果用eclipse export命令打包 , 會在<project_root>/proguard文件夾內 。其中包含以下文件:
mapping.txt表示混淆前后代碼的對照表 , 這個文件非常重要 。如果你的代碼混淆后會產生bug的話 , log提示中是混淆后的代碼 , 希望定位到源代碼的話就可以根據mapping.txt反推 。

推薦閱讀