[轉]Android-Proguard(代碼混淆)

一:混淆是什么,該怎么做?

? ? ? 如果我們的app正常發布就必須要經歷混淆這一步,混淆可以使我們的app不那么容易被別人用反編譯工具破解,就算被破解,想要讀懂我們的源碼也是非常費勁的,因為混淆過的源碼的類和類成員會被隨機命名,代碼非常的亂和沒有規律,除非之前用keep進行了保護。

? ? ? 以我們的常用開發工具andorid studio 為例,Android Studio自身集成Java語言的ProGuard作為壓縮,優化,混淆和預校驗,并配合Gradle工具進行構建,我們只需要在工程應用目錄的build.gradle文件中設置minifyEnabled為true,然后可以到proguard-rules.pro文件中加入我們的混淆規則即可。如圖:

大家看到了,有兩個混淆文件,proguard-android.txt和proguard-rules.pro,proguard-rules.pro是我們需要自己編寫的混淆文件,proguard-android.txt是系統默認的,那么它在哪里呢?

用工具打開txt文件是這樣的效果:

這里說一下,你只要設置了minifyEnabled true開啟混淆,其他的壓縮,優化,預校驗就默認開啟了,那我們就可以開始proguard-rules.pro 文件的編寫了,如圖:

 剛才是開啟混淆,那我們如何關閉,比如關閉壓縮,關閉優化呢?

總結一下:

我們通常說的proguard包括四個功能,shrinker(壓縮), optimizer(優化),obfuscator(混淆),preverifier(預校驗),他們的作用分別是:

shrink: 檢測并移除沒有用到的類,變量,方法和屬性;

optimize: 優化代碼,非入口節點類會加上private/static/final, 在字節碼級別執行優化,讓應用運行的更快。。

obfuscate: 增大反編譯難度,類和類成員會被隨機命名,除非用keep保護。

preverify: 預校驗代碼是否符合Java1.6或者更高的規范.

除了proguard之外,還有一個DexGuard,是專門用來優化混淆Android應用的。它包括資源混淆,字符串加密,類加密和dex文件分割等。它是在android編譯的時候直接產生Dalvik字節碼.......

混淆后我們會在工程目錄app/build/outputs/mapping/release(debug)下找到一個mapping.txt文件,這就是混淆規則,我們可以根據這個文件把混淆后的代碼反推回源本的代碼,所以這個文件比較重要,請妥善保管.

?

二:接下來我們來說一說混淆的基本規則:

但如果你用兩顆星,會發現,雖然類名被保持了,但里面的變量名啥的都變了,那如果我們既要本包保持類名和內容又要子包保存呢?

-keep class com.xzt.demotwo.**{*;}

剩下的我直接上代碼了,大家自己看吧:

-keep class com.xzt.demotwo.*? # 一顆星只保持本包的類名(不包含內容)-keep class com.xzt.demotwo.** # 二顆星表示保持本包和子包下的類名(不包含內容)
# 只保持本包的類名和內容-keep class com.xzt.demotwo.*{*;}#可以保持本包和子包的類名和內容-keep class com.xzt.demotwo.**{*;}#保持某個具體的類名不被混淆-keep class com.xzt.demotwo.MainActivity#保持某個具體的類及其內容不被混淆-keep class com.xzt.demotwo.MainActivity{*;}#保持類中特定內容,而不是所有的內容可以使用如下:-keep class com.xzt.demotwo.MainActivity{<init>;    #匹配所有構造器<fields>;  #匹配所有域<methods>; #匹配所有方法}?

你還可以在<fields>或<methods>前面加上private 、public、native等來進一步指定不被混淆的內容,如

-keep class com.xzt.demotwo{public <methods>;}

表示MainActivity下的所有public方法都不會被混淆,當然你還可以加入參數,比如以下表示用JSONObject作為入參的構造函數不會被混淆

-keep class com.xzt.demotwo {public <init>(org.json.JSONObject);}
#保持類中特定內容,還可以進一步縮小范圍-keep class com.xzt.demotwo.MainActivity{public;	#保持該類下所有的共有方法不被混淆public *;	#保持該類下所有的共有內容不被混淆private;	#保持該類下所有的私有方法不被混淆private *;	#保持該類下所有的私有內容不被混淆public(java.lang.String);	#保持該類的String類型的構造方法}#在方法后加入參數,限制特定的構造方法-keep class com.xzt.demotwo.MainActivity{public (String);}#要保留一個類中的內部類及其內容不被混淆需要用 $ 符號-keep class com.xzt.demotwo.MainActivity$MyClass{*;}#使用Java的基本規則來保護特定類不被混淆,比如用extends,implement等這些Java規則,#如下:保持Android底層組件和類不要混淆-keep public class * extends android.app.Activity-keep public class * extends android.app.Application-keep public class * extends android.app.Service-keep public class * extends android.content.BroadcastReceiver-keep public class * extends android.content.ContentProvider-keep public class * extends android.view.View#如果不需要保持類名,只需要保持該類下的特定方法保持不被混淆,#需要使用keepclassmembers,而不是keep,因為keep方法會保持類名。#保持MainActivity類下test(String)方法不被混淆-keepclassmembernames class com.xzt.demotwo.MainActivity{public void test(java.lang.String);}

這里我附一張圖:

?

#如果擁有某成員,保留類和類成員? 
-keepclasseswithmembernames class com.xzt.demotwo.MainActivity

注意事項

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

?-keepclasseswithmembernamesclass*{# 保持native方法不被混淆? ? native ;
}

2、反射用到的類不混淆(否則反射可能出現問題);

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

4、與服務端交互時,使用GSON、fastjson等框架解析服務端數據時,所寫的JSON對象類不混淆,否則無法將JSON解析成對應的對象;

5、使用第三方開源庫或者引用其他第三方的SDK包時,如果有特別要求,也需要在混淆文件中加入對應的混淆規則;

6、有用到WebView的JS調用也需要保證寫的接口方法不混淆,原因和第一條一樣;

7、Parcelable的子類和Creator靜態成員變量不混淆,否則會產生Android.os.BadParcelableException異常;

-keepclass*implementsAndroid.os.Parcelable{# 保持Parcelable不被混淆? ? ? ? ? publicstaticfinalAndroid.os.Parcelable$Creator *;
}

8、使用enum類型時需要注意避免以下兩個方法混淆,因為enum類的特殊性,以下兩個方法會被反射調用。

-keepclassmembersenum* {publicstatic**[] values();publicstatic**valueOf(java.lang.String);? 
}

?



作者:薛之濤
鏈接:https://www.jianshu.com/p/fcb7672ec401
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285147.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285147.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285147.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學妹,你要的C語言版AOE網絡數據結構來了,就這么簡單!

文章目錄AOE關鍵路徑編程AOE完整求解程序AOE關鍵路徑編程 不難發現AOE圖最大特點是沒有回路&#xff0c;并且有向圖方向始終是從源點走向匯點&#xff0c;且源點匯點都是一個。 把圖1寫成鄰接矩陣文件&#xff0c;見文件P200G736.TXT&#xff0c;并在此復制G0.C到AOE.C&#x…

C語言試題160之某個公司采用公用電話傳遞數據,數據是四位的整數,在傳遞過程中是加密的,加密規則如下: 每位數字都加上 5,然后用和除以 10 的余數代替該數字,再將第一位和第四位交換,第二位和第三位

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:某個公司采用公用電話傳遞數…

C# 關于狀態機的實現(案例版)

大部分的狀態機都是有限狀態機&#xff0c;某些業務環境&#xff0c;或者其他環境中&#xff0c;如果有狀態機其實還是很方便的。比如&#xff0c;我是用在了單個客戶的Socket通信上&#xff0c;未連接狀態&#xff0c;我就等連接。已連接狀態&#xff0c;就等待下一步指令狀態…

測試并發應用 (一)監控Lock接口

聲明&#xff1a;本文是《 Java 7 Concurrency Cookbook 》的第八章&#xff0c; 作者&#xff1a; Javier Fernndez Gonzlez 譯者&#xff1a;鄭玉婷 校對&#xff1a;方騰飛 監控Lock接口 Lock 接口是Java 并發 API提供的最基本的機制來同步代碼塊。它允許定義臨界區。臨界…

[There will be more story......]

This blog will keep on updating.轉載于:https://www.cnblogs.com/SinGuLaRiTy2001/p/7965776.html

根據生日得到星座

--得到星座 function DataCenter_Setting:GetConstellation(month, day)local dataInfo {121, 220, 321, 421, 522, 622, 723, 824, 924, 1024, 1123, 1222}local Constellations {"水瓶", "雙魚", "白羊", "金牛", "雙子"…

[轉]Android 項目的代碼混淆,Android proguard 使用說明

簡介 Java代碼是非常容易反編譯的。為了很好的保護Java源代碼&#xff0c;我們往往會對編譯好的class文件進行混淆處理。 ProGuard是一個混淆代碼的開源項目。它的主要作用就是混淆&#xff0c;當然它還能對字節碼進行縮減體積、優化等&#xff0c;但那些對于我們來說都算是次要…

數據結構與算法:終于可以用三種語言(C,C#,JavaScript)把圖的廣度優先遍歷講清楚了(推薦收藏)

文章目錄鄰接矩陣存儲圖的廣度優先遍歷過程分析C語言實現隊列編程程序中加入圖的處理函數結果的再次分析C#語言實現圖的廣度優先遍歷、并顯示廣度優先遍歷生成樹JavaScript語言實現圖的廣度優先遍歷、并顯示廣度優先遍歷生成樹鄰接矩陣存儲圖的廣度優先遍歷過程分析 對圖1這樣…

C語言試題161之求100000以內的自守數

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:自守數是…

改造.NET遺留應用

淺議.NET遺留應用改造TLDR&#xff1a;本文介紹了遺留應用改造中的一些常見問題&#xff0c;并對改造所能開展的目標、原則、策略進行了概述。一、背景概述1、概述或許僅“遺留應用”這個標題就比較吸睛&#xff0c;因為我聽過太多人吐槽了。Robert Martin在《修改代碼的藝術》…

GitHub的DGit改進了平臺的可靠性、性能以及可用性

GitHub最近悄悄地發布了DGit&#xff0c;全稱為“分布式Git”。這是一種基于Git創建的分布式存儲系統&#xff0c;其目標是改進使用GitHub時的可靠性、可用性以及性能。\\DGit是一個應用層面的協議&#xff0c;它利用了Git分布式的特性&#xff0c;將每個倉庫在三臺不同的、獨立…

用靜態NAT實現外網PC訪問內網服務器

在我們的生產環境中常常處于安全考慮將服務器置于內網環境中&#xff0c;但同時得向外網提供各種服務功能&#xff0c;此時就需要用到NAT技術。下面是我用思科的仿真軟件搭建的一個實驗環境&#xff0c;實現外網PC訪問內網服務器。先說明一下實驗環境&#xff1a;路由器R0左邊為…

[轉]分布式事務之TCC服務設計和實現注意事項

1、TCC簡介 TCC是一種比較成熟的分布式事務解決方案&#xff0c;可用于解決跨庫操作的數據一致性問題&#xff1b; TCC是服務化的兩階段編程模型&#xff0c;其Try、Confirm、Cancel 3個方法均由業務編碼實現&#xff1b; 其中Try操作作為一階段&#xff0c;負責資源的檢查和…

量化投資策略的評估標準及其計算公式

收益率指標&#xff1a;分為策略的總收益率和策略的年化收益率 策略的總收益率&#xff1a; 策略的總收益率是評價一個策略盈利能力的最基本的指標&#xff0c;其計算方法為&#xff1a; 公式中Vt表示策略最終的股票和現金的總價值&#xff0c;V0表示策略最初的股票和現金的總…

.net post xml 數據

var request WebRequest.Create(url);//url 是post 接口的URL request.Method "post";// 請求方法 request.ContentType "text/xml"; //請求類型 request.Headers.Add("charset:utf-8"); //設置文檔類型的編碼格式 var encoding Encoding.Ge…

【ArcGIS微課1000例】0005:空間連接(Spatial Join)

問題描述 現在要根據范圍,怎樣批量統計各個范圍內的湖泊的總面積、各個省份內的鐵路或河流總長度、各個地區的人口綜合等。 空間連接 根據空間關系將一個要素類的屬性連接到另一個要素類的屬性。目標要素和來自連接要素的被連接屬性寫入到輸出要素類。 用法 空間連接是指根…

【微服務專題之】.Net6中集成消息隊列-RabbitMQ中直接路由模式

微信公眾號&#xff1a;趣編程ACE關注可了解更多的.NET日常實戰開發技巧&#xff0c;如需源碼 請公眾號后臺留言 源碼;[如果覺得本公眾號對您有幫助&#xff0c;歡迎關注]前文回顧【微服務專題之】.Net6下集成消息隊列上-RabbitMQ【微服務專題之】.Net6下集成消息隊列2-RabbitM…

C語言試題162之圓周率π

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:圓周率π…

第14、15教學周作業

要求一 還差一些沒做完。 要求二 USTH_C程序設計&#xff08;基礎&#xff09;14周第一次PTA作業 7-3 將數組中的數逆序存放 1.實驗代碼 #include<stdio.h>int main() {int i,n,t;scanf("%d",&n);int a[n];for(i0;i<n;i){scanf("%d",&t)…

篇三:訪問JSON靜態文件

背景&#xff1a;在定位的時候帶出車牌號的前兩位&#xff0c;這里就有一個地址和車牌號前兩位的映射關系&#xff0c;這個映射關系起初是通過Ajax在頁面加載的時候請求去數據庫里面查出來賦給一個變量&#xff0c;然后去操作&#xff0c;但是這個過程通常需要4~7秒&#xff0c…