在新版本的ADT建立項目時,混碼的文件再也不是proguard.cfg,而是project.properties和proguard-project.txt。html
若是須要對項目進行全局混碼,只須要進行一步操做:java
將project.properties的中android
「# proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt」的「#」去掉就能夠了。windows
如 果有一些代碼不能被混淆,好比須要加入了so文件,須要調用裏面的方法,那麼調用JNI訪問so文件的方法就不能被混碼。在導出的時候,可能不會報錯。但 是在手機上運行的時候,須要調用so文件的時候,就會報某某方法沒法找到。這個時候就須要用到proguard-project.txt。安全
在老版本中,建立項目的時候,會給出proguard.cfg,可是在的新版中建立項目則不會有任何提示。這個時候須要只要將proguard.cfg的內容加入到proguard-project.txt中,再根據本身的須要進行編輯便可。app
==================proguard.cfg防反編譯方法==================================ide
To enable ProGuard so that it runs as part of an Ant or Eclipse build, set the proguard.config
property in the<project_root>/project.properties
file. The path can be an absolute path or a path relative to the project's root.工具
If you left the proguard.cfg
file in its default location (the project's root directory), you can specify its location like this:優化
proguard.config=proguard.cfg
You can also move the the file to anywhere you want, and specify the absolute path to it:ui
proguard.config=/path/to/proguard.cfg
When you build your application in release mode, either by running ant release
or by using the Export Wizard in Eclipse, the build system automatically checks to see if the proguard.config
property is set. If it is, ProGuard automatically processes the application's bytecode before packaging everything into an .apk
file. Building in debug mode does not invoke ProGuard, because it makes debugging more cumbersome.
===========【轉】混淆文件proguard.cfg詳解======================================
-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/* 【優化】
-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 *;
}
=====================================常見異常===================================
參考:http://blog.csdn.net/vrix/article/details/7100841
加入第三方jar包以後常出現的幾個異常:
proguard returned with error code 1.See console
狀況1:
Proguard returned with error code 1. See console
Error: C:/Documents (系統找不到指定文件)
後來發現是由於將整個工程放到了桌面上,而桌面的目錄是C:/Documents and Settings/Administrator/桌面,在這裏面有空格,而proguard進行發編譯的時候是不容許有空格的
若是換了正確路徑還很差用的話,直接刪除proguard就行了
注意:SDK和程序路徑最好不要有空格符
狀況2:
Proguard returned with error code 1. See console
異常:
java.lang.ArrayIndexOutOfBoundsException
解決辦法:將proguard.cfg中的"-dontpreverify"改爲「-dontoptimize」
參考文章:http://groups.google.com/group/android-developers/browse_thread/thread/eca3b0f5ce6ad00f
我把項目中生成的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包。
========================官方文檔翻譯========================================
原文
http://developer.android.com/guide/developing/tools/proguard.html
混淆器(ProGuard)
在本文中(In this document)
Decoding Obfuscated Stack Traces
Debugging considerations for published applications
參見
混淆器經過刪除從未用過的代碼和使用晦澀名字重命名類、字段和方法,對代碼進行壓縮,優化和混淆。結果是一個比較小的.apk文件,該文件比較難進行逆向工程。所以,當你的應用程序對安全敏感(要求高),例如當你受權應用程序的時候,混淆器是一種重要的保護手段。
混淆器被集成在android 構建系統中,因此你沒必要手動調用它。同時混淆器僅在發佈模式下進行構建應用程序的時候纔會運行起來,因此在調試模式下構建程序時,你沒必要處理混淆代碼。讓混淆器運行起來是可選擇的,可是推薦選上。
這個文檔描述了怎樣啓用並配置混淆器,以及使用跟蹤(retrace)工具對混淆的堆棧跟蹤信息(stack traces)進行解碼。
當你新建了一個Android工程以後,一個proguard.cfg文件會在工程的根目錄下自動建立。這個文件定義了混淆器是怎樣優化和混淆你的代碼的,因此懂得怎樣根據你的須要來定製是很是重要的。缺省的配置文件僅覆蓋到了一般狀況,因此根據你的需求,極可能須要編輯它。接下來的內容是關於經過定製混淆器配置文件來對混淆器配置。
爲了讓啓用混淆器做爲Ant或者Eclipse構建過程當中一部分,能夠在<project_root>/default.properties文件中,設置proguard.config屬性。路徑能夠是絕對路徑或者工程根目錄的相對路徑。
若是你讓proguard.cfg文件在缺省位置(工程的根目錄),你能夠像這樣指定位置:
proguard.config=proguard.cfg
一樣,你能夠把該文件放到任意的位置,並指定它的絕對路徑。
proguard.config=/path/to/proguard.cfg
當你在發佈模式下,或者經過運行ant release,或者經過使用Eclipse中的Export Wizard構建你的應用程序的時候,構建系統都會自動地去檢查proguard.config屬性是否被設置了。若是被設置了,混淆器在把全部東西打包成.apk文件以前,自動地對應用程序字節碼進行混淆處理。而在調試模式中構建則不會調用混淆器,由於那樣調試會更加繁重。
運行混淆器以後輸出的文件有:
dump.txt
描述.apk包中全部class文件的內部結構。
mapping.txt
列出了源代碼與混淆後的類,方法和屬性名字之間的映射。這個文件對於在構建以後獲得的bug報告是有用的,由於它把混淆的堆棧跟蹤信息反翻譯爲源代碼中的類,方法和成員名字。更多信息,查看解碼混淆過的堆棧跟蹤信息。
seeds.txt
列出那些未混淆的類和成員。
usage.txt
列出從.apk中剝離的代碼。
這些文件放在如下目錄中:
<project_root>/bin/proguard 當你使用Ant時
<project_root>/proguard 當你使用Eclipse時
注意:每次在發佈模式下構建時,這些文件都會被最新的文件覆蓋。因此每次發佈程序時候,爲了反混淆來自構建時產生的bug報告,請保存這些文件的一個拷貝。對於爲何要保存這些文件的重要性的更多信息,請查看程序發佈調試注意事項。
某些狀況下,proguard.cfg文件的缺省配置能夠知足需求了。可是,對於混淆器來講,大多數狀況作出正確的分析是困難的,而且它或許會刪除在它看來是無用的,但對於程序來講卻確實須要的代碼。一些例子以下:
一個僅引用於AndroidManifest.xml文件的類。
一個經過JNI調用的方法。
動態引用的屬性和方法。
缺省的proguard.cfg文件試圖覆蓋普通的狀況,可是你可能碰到相似ClassNotFoundException的異常,這個異常出如今當你的程序去訪問一個被混淆器移除了的類的時候。
你能夠在proguard.cfg文件中添加-keep這一行來修復這些錯誤。例如:
-keep publicclass<MyClass>
-Keep設置有不少可選項和注意地方,因此爲了得到更多關於配置信息,強烈推薦你閱讀混淆器用戶手冊。特別有用的有Keep選項綜述和舉例部分。在混淆器手冊問題解決方案部分,介紹了代碼在混淆過程當中你可能碰到的其餘常見問題。
當混淆代碼並輸出了一個堆棧調試信息時,這些方法名字是混淆過的,雖然能夠進行調試,可是調試變得困難。幸運的是,每當混淆器運行時候,它都會輸出到文件<project_root>/bin/proguard/mapping.txt中,該文件包含了從原始類,方法和屬性名字到混淆後名字的映射。
Windows系統中retrace.bat腳本命令或者Linux和Mac OS X系統中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工具從標準輸入讀取。
保存好每個已發佈給用戶的程序的mapping.txt文件。經過保存發佈構建版本的mapping.txt文件拷貝,確保當用戶碰到bug,並把混淆後的堆棧調試跟蹤信息提交給你時,你能夠進行調試從而修復問題。程序的mapping.txt文件在每次發佈構建時都會被覆蓋,因此你必定要注意保存正確的版本。
例如,假設你已經發布了一個應用程序並在繼續在新的版本中開發添加新的功能。接着你立刻啓動混淆器並建立一個新的發佈版本。該操做把mapping.txt文件覆蓋了。一個用戶提交了來自當前發佈版本的bug報告,該報告包含了堆棧調試信息。你不再能對用戶的堆棧信息進行調試了,由於這個對應用戶本機上版本的mapping.txt文件不存在了。其餘覆蓋mapping.txt文件的狀況還有不少,因此對於每個可能須要調試的版本,你都要確保有一份拷貝。