1,在build.grandle添加,其中規(guī)則寫在proguard-rules.pro中,也可以自定義一個文件,將其代替,比如eclipse常用的 proguard-project.txt
10年積累的成都做網站、成都網站制作經驗,可以快速應對客戶對網站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網絡服務。我雖然不認識你,你也不認識我。但先網站制作后付款的網站建設流程,更有玉門免費網站建設讓你可以放心的選擇與我們合作。
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘
}
}
2,在proguard-rules.pro中加入以下代碼,基本可以涵蓋所有
-optimizationpasses 5 # 指定代碼的壓縮級別
-dontusemixedcaseclassnames # 是否使用大小寫混合
-dontpreverify # 混淆時是否做預校驗
-verbose # 混淆時是否記錄日志
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆時所采用的算法
-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.app.backup.BackupAgentHelper # 保持哪些類不被混淆
-keep public class * extends android.preference.Preference # 保持哪些類不被混淆
-keepclasseswithmembernames class * { # 保持 native 方法不被混淆
native methods;
}
-keepclasseswithmembers class * { # 保持自定義控件類不被混淆
public init(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {# 保持自定義控件類不被混淆
public init(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity { # 保持自定義控件類不被混淆
public void *(android.view.View);
}
-keepclassmembers enum * { # 保持枚舉 enum 類不被混淆
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆
public static final android.os.Parcelable$Creator *;
}
Android Studio上混淆打包apk方法: //混淆,新版本是ninifyEnabled不再是runproguard minifyEnabled true //加載默認混淆配置文件及自定義混淆 配置 proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard.cfg' 設置minifyEnabled true,就會在打包的時候進行代碼混淆處理. 其中proguard-android.txt不用管,在sdk目錄里面,主要是配置了proguard.cfg文件。 直接在android studio創(chuàng)建項目不會有這個文件,而是 proguard-rules.pro文件,其實一樣的,因為項目是從eclipse遷移過來的,之前在eclipse上混淆是 proguard.cfg文件.
為了保護代碼被反編譯,android引入了混淆代碼的概念
1.設置混淆
在工程下找到project.properties文件
在文件中加入proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt這個是系統(tǒng)的
也可以用自己的混淆文件(這樣就可以配置一些自己的東西),去sdk.dir}/tools/proguard/ 下復制proguard-android.txt文件到本地工程中
然后設置成proguard.config=proguard-android.txt
project.properties文件:
[java] view plaincopy
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
proguard.config=proguard-android.txt
# Project target.
target=android-17
-injars androidtest.jar【jar包所在地址】
-outjars out【輸出地址】
-libraryjars 'D:\android-sdk-windows\platforms\android-9\android.jar' 【引用的庫的jar,用于解析injars所指定的jar類】
-optimizationpasses 5
-dontusemixedcaseclassnames 【混淆時不會產生形形色色的類名 】
-dontskipnonpubliclibraryclasses 【指定不去忽略非公共的庫類。 】
-dontpreverify 【不預校驗】
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 【優(yōu)化】
-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.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keep public abstract interface com.asqw.android.Listener{
public protected methods; 【所有方法不進行混淆】
}
-keep public class com.asqw.android{
public void Start(java.lang.String); 【對該方法不進行混淆】
}
-keepclasseswithmembernames class * { 【保護指定的類和類的成員的名稱,如果所有指定的類成員出席(在壓縮步驟之后)】
native methods;
}
-keepclasseswithmembers class * { 【保護指定的類和類的成員,但條件是所有指定的類和類成員是要存在。】
public init(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public init(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {【保護指定類的成員,如果此類受到保護他們會保護的更好 】
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {【保護指定的類文件和類的成員】
public static final android.os.Parcelable$Creator *;
}
=====================================常見異常===================================
參考:
加入第三方jar包之后常出現(xiàn)的幾個異常:
proguard returned with error code 1.See console
情況1:
Proguard returned with error code 1. See console
Error: C:/Documents (系統(tǒng)找不到指定文件)
后來發(fā)現(xiàn)是因為將整個工程放到了桌面上,而桌面的目錄是C:/Documents and Settings/Administrator/桌面,在這里面有空格,而proguard進行發(fā)編譯的時候是不允許有空格的
如果換了正確路徑還不好用的話,直接刪除proguard就好了
注意:SDK和程序路徑最好不要有空格符
情況2:
Proguard returned with error code 1. See console
異常:
java.lang.ArrayIndexOutOfBoundsException
解決辦法:將proguard.cfg中的"-dontpreverify"改成“-dontoptimize”
參考文章:
我把項目中生成的proguard文件夾(此時文件夾是空的)刪掉,然后再重新運行項目,就OK 了。
情況3:
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0] Proguard returned with error code 1. See console
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0] java.io.IOException: Can't read [proguard.ClassPathEntry@106082] (No such file or directory)
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]
at proguard.InputReader.readInput(InputReader.java:230)
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]
at proguard.InputReader.readInput(InputReader.java:200)
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]
at proguard.InputReader.readInput(InputReader.java:178)
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]
at proguard.InputReader.execute(InputReader.java:100)
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]
at proguard.ProGuard.readInput(ProGuard.java:195)
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]
at proguard.ProGuard.execute(ProGuard.java:78)
[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]
at proguard.ProGuard.main(ProGuard.java:499)
拋出這樣的異常的原因是第三方jar的引用路徑不對,沒有找到這個需要忽略混淆的jar包。
========================官方文檔翻譯========================================
原文
混淆器(ProGuard)
在本文中(In this document)
Enabling ProGuard
Configuring ProGuard
Decoding Obfuscated Stack Traces
Debugging considerations for published applications
參見
ProGuard Manual ?
ProGuard ReTrace Manual ?
混淆器通過刪除從未用過的代碼和使用晦澀名字重命名類、字段和方法,對代碼進行壓縮,優(yōu)化和混淆。結果是一個比較小的.apk文件,該文件比較難進行逆向工程。因此,當你的應用程序對安全敏感(要求高),例如當你授權應用程序的時候,混淆器是一種重要的保護手段。
混淆器被集成在android 構建系統(tǒng)中,所以你不必手動調用它。同時混淆器僅在發(fā)布模式下進行構建應用程序的時候才會運行起來,所以在調試模式下構建程序時,你不必處理混淆代碼。讓混淆器運行起來是可選擇的,但是推薦選上。
這個文檔描述了怎樣啟用并配置混淆器,以及使用跟蹤(retrace)工具對混淆的堆棧跟蹤信息(stack traces)進行解碼。
啟用混淆器Enabling ProGuard
當你新建了一個Android工程之后,一個proguard.cfg文件會在工程的根目錄下自動創(chuàng)建。這個文件定義了混淆器是怎樣優(yōu)化和混淆你的代碼的,所以懂得怎樣根據你的需要來定制是非常重要的。缺省的配置文件僅覆蓋到了通常情況,所以根據你的需求,很可能需要編輯它。接下來的內容是關于通過定制混淆器配置文件來對混淆器配置。
為了讓啟用混淆器作為Ant或者Eclipse構建過程中一部分,可以在project_root/default.properties文件中,設置proguard.config屬性。路徑可以是絕對路徑或者工程根目錄的相對路徑。
如果你讓proguard.cfg文件在缺省位置(工程的根目錄),你可以像這樣指定位置:
proguard.config=proguard.cfg
同樣,你可以把該文件放到任意的位置,并指定它的絕對路徑。
proguard.config=/path/to/proguard.cfg
當你在發(fā)布模式下,或者通過運行ant release,或者通過使用Eclipse中的Export Wizard構建你的應用程序的時候,構建系統(tǒng)都會自動地去檢查proguard.config屬性是否被設置了。如果被設置了,混淆器在把所有東西打包成.apk文件之前,自動地對應用程序字節(jié)碼進行混淆處理。而在調試模式中構建則不會調用混淆器,因為那樣調試會更加繁重。
運行混淆器之后輸出的文件有:
dump.txt
描述.apk包中所有class文件的內部結構。
mapping.txt
列出了源代碼與混淆后的類,方法和屬性名字之間的映射。這個文件對于在構建之后得到的bug報告是有用的,因為它把混淆的堆棧跟蹤信息反翻譯為源代碼中的類,方法和成員名字。更多信息,查看解碼混淆過的堆棧跟蹤信息。
seeds.txt
列出那些未混淆的類和成員。
usage.txt
列出從.apk中剝離的代碼。
這些文件放在以下目錄中:
注意:每次在發(fā)布模式下構建時,這些文件都會被最新的文件覆蓋。所以每次發(fā)布程序時候,為了反混淆來自構建時產生的bug報告,請保存這些文件的一個拷貝。對于為什么要保存這些文件的重要性的更多信息,請查看程序發(fā)布調試注意事項。
混淆器配置(proguard config)
某些情況下,proguard.cfg文件的缺省配置可以滿足需求了。但是,對于混淆器來說,大多數(shù)情況做出正確的分析是困難的,并且它或許會刪除在它看來是無用的,但對于程序來說卻確實需要的代碼。一些例子如下:
一個僅引用于AndroidManifest.xml文件的類。
一個通過JNI調用的方法。
動態(tài)引用的屬性和方法。
project_root/bin/proguard 當你使用Ant時
project_root/proguard 當你使用Eclipse時
解碼混淆過的堆棧跟蹤信息(Decoding Obfuscated Stack Traces)
當混淆代碼并輸出了一個堆棧調試信息時,這些方法名字是混淆過的,雖然可以進行調試,但是調試變得困難。幸運的是,每當混淆器運行時候,它都會輸出到文件project_root/bin/proguard/mapping.txt中,該文件包含了從原始類,方法和屬性名字到混淆后名字的映射。
Windows系統(tǒng)中retrace.bat腳本命令或者Linux和Mac OS X系統(tǒng)中retrace.sh腳本命令能把混淆后的堆棧調試信息轉換為可以理解的文件。它被放在sdk_root/tools/proguard/目錄下。運行retrace工具的命令語法是:
retrace.bat|retrace.sh [-verbose] mapping.txt [stacktrace_file]
例如:
retrace.bat -verbose mapping.txt obfuscated_trace.txt
如果你沒有為stracktrace_file指定值,那么retrace工具從標準輸入讀取。
已發(fā)布應用程序的調試注意事項(Debugging considerations for published applications)
保存好每一個已發(fā)布給用戶的程序的mapping.txt文件。通過保存發(fā)布構建版本的mapping.txt文件拷貝,確保當用戶碰到bug,并把混淆后的堆棧調試跟蹤信息提交給你時,你可以進行調試從而修復問題。程序的mapping.txt文件在每次發(fā)布構建時都會被覆蓋,所以你一定要注意保存正確的版本。
例如,假設你已經發(fā)布了一個應用程序并在繼續(xù)在新的版本中開發(fā)添加新的功能。接著你馬上啟動混淆器并創(chuàng)建一個新的發(fā)布版本。該操作把mapping.txt文件覆蓋了。一個用戶提交了來自當前發(fā)布版本的bug報告,該報告包含了堆棧調試信息。你再也不能對用戶的堆棧信息進行調試了,因為這個對應用戶本機上版本的mapping.txt文件不存在了。其他覆蓋mapping.txt文件的情況還有很多,所以對于每一個可能需要調試的版本,你都要確保有一份拷貝。
方案一:
一、 下載dex2jar包,解壓
二、把apk包的后綴名改為.zip
三、把apk壓解壓拿到classes.dex文件,并放到dex2jar所在的目錄下
四、運行命令dex2jar.exe classes.dex
五、下載jd-gui
六、把jar包加載到jd.gui,查看源碼,源碼中的類名,方法名,變量名是否已經改變
方法二:
一、下載apktool工具
二、運行apktool.bat d xxx.apk,把apk反編譯成smali
三、如果想要進一步查看源碼,可下載smali2java
四、使用smali文件的文件名進行分析,如果存在1個或1個以上的資源類的smali文件,就可以證明該apk沒有被混淆過。
一般四大組件不混淆的,主要有以下原因:
1.四大組件聲明必須在manifest中注冊,如果混淆后類名更改,而混淆后的類名沒有在2.manifest注冊,是不符合Android組件注冊機制的.
3.外部程序可能使用組件的字符串類名,如果類名混淆,可能導致出現(xiàn)異常
4.四大組件是要配置在清單文件的,混淆了找不到