1.將以下proguard.config=proguard.cfg添加到項目文件project.properties中,如下所示:
target=android-8
proguard.config=proguard.cfg
Eclipse將通過這個配置在項目目錄中生成proguard.cfg文件。
2.生成密鑰庫(如果可用,可以直接使用)
根據目錄下d:\ program files \ Java \ JDK 1 . 6 . 0 _ 07 \ bin >中的以下命令行,輸入keytool-genkey-alias Android。keystore-keyalg RSA-validity 100000-keystore Android。密鑰庫。
參數意義:-有效期主要是證書的有效期,寫成100000天;空格和退格鍵都是密碼。
命令將在d:\ program files \ Java \ JDK 1 . 6 . 0 _ 07 \ bin >目錄下生成android.keystore文件。
3.Eclipce中的操作
文件-& gt;導出->;導出Android應用程序-& gt;選擇項目-& gt;使用現有的密鑰庫,並輸入密碼-& gt;選擇目標APK文件
混淆源代碼後,原來的類名和方法名會類似於a,B,c,B,c。。混淆的原理其實就是類名和方法名的映射。
普羅瓜德,妳自己拿壹個就好。
-
進步原則
Java代碼被編譯成二進制類文件,該文件
文件也可以反編譯成源代碼,源代碼除了註釋基本都能看到。防止重要代碼
要泄露,我們經常需要混淆(混淆代碼,就是把方法、字段、包、類放到java裏。
把元素的名字改成了沒有意義的名字,這樣代碼結構沒變,可以運行,但是很難理解代碼的架構。proguard
就是這樣壹個混淆工具,它可以分析壹組類的結構,根據用戶的配置,然後用java把這些類文件混淆起來。
元素名稱混亂。在分析類的同時,他還有另外兩個功能:刪除無效代碼(收縮)和優化代碼。
(優化選項).
默認情況下,proguard
會把所有的代碼搞混,但是在以下情況下不能更改java元素的名稱,否則會導致程序錯誤。
第壹,我們使用反射。
第二,
我們的代碼依賴於系統的接口,比如系統代碼調用的回調方法,這是最復雜的情況。
第三,是我們的java。
元素名稱在配置文件中配置。
所以在使用proguard的時候,我們需要有壹個配置文件來告訴proguard。
這些java元素不能混淆。
Proguard配置
最常用的配置選項
-dontwarn默認程序
會檢查每個引用是否正確,但是第三方庫中往往有壹些類不會用到,沒有正確的引用。如果沒有配置,系統將報告錯誤。
由-keep指定的類和類成員作為條目保留。
-保留類成員
指定的類成員是保留的。
-keepclassewithmembers
如果指定的類成員存在,則保留指定的類和類成員。
Proguard問題和風險
代碼混淆雖然有混淆優化的優點,但也經常帶來以下問題。
1,混淆錯誤。使用第三方庫的時候,壹定要告訴proguard。
不要檢查,否則proguard將報告壹個錯誤。
2、運行錯誤,當代碼
在不能混淆的時候,壹定要正確配置,否則程序會運行錯誤,這是最有問題的情況。
3、調試痛苦,錯誤,錯誤棧是混淆代碼。
我自己也不明白。
為了防止混淆,妳需要熟悉妳所有的代碼和系統架構。
,以及系統和妳的代碼之間的集成接口,仔細分析。同時,妳必須需要壹個全面的測試。所以迷茫還是有風險的。
為了規避風險,只能混淆壹些關鍵代碼,但是妳混淆的效果也會降低。
不能混淆的普通androidCode代碼。
安卓程序
下面這段代碼,混亂的時候要保留。
Android系統組件,系統組件有固定的方法被系統調用。
按Android資源
文件引用的。名稱是固定的,不能混淆,如自定義視圖。
安卓Parcelable,需要用安卓。
連載。
其他官方建議
不混亂,如
Android . app . backup . backupagenthelper
安卓.偏好.偏好
com . Android . vending . licensing . ilicensingservice
Java序列化方法,系統序列化需要壹個固定的方法。
枚舉,系統需要壹個固定的方法來處理枚舉。
本地方法,不能修改本地方法名。
註釋註釋
數據庫驅動程序
壹些資源文件
使用反射的地方。
如何實施
現在的系統已經配置好了,困惑的時候保留。
Android系統組件
自定義視圖
Android Parcelable
Android R文件
Android Parcelable
列舉
每個開發人員都必須檢查他的代碼中是否使用了反射。
,以及其他不能混淆的地方。告訴我修改配置文件(已經保留的是不必要的)
目前系統部檢查的第三方庫有
-唐恩
android.support.**
-唐恩
com.tencent.**
-唐恩
org.dom4j.**
-唐恩
org.slf4j.**
-唐恩
org.mons.logging.**
-唐恩
org . Apache . commons . codec . binary . * *
-唐恩
微博4安卓。**
Proguard參數
-包括{文件名}
從給定文件中讀取配置參數。
-basedirectory {directoryname}
指定基目錄作為將來的相對文件名。
-injars {class_path}
指定要處理的應用程序jar、war、ear和目錄。
-outjars {class_path}
指定處理後要輸出的jar、war、ear和目錄的名稱。
-libraryjars {classpath}
指定要處理的應用程序jar、war、ear和目錄所需的庫文件。
-dontskipnoppubliclibraryclasses
指定不忽略非公共庫類。
-dontskipnoppubliclibraryclassmembers
指定不忽略對包可見的庫類成員。
保留選項
-保持{修飾符} {class_specification}
保護指定的類文件和該類的成員。
-keepclassmembers {modifier}
{class_specification}
保護指定類的成員,如果這個類被保護,他們會得到更好的保護。
-keepclassewithmembers
{class_specification}
保護指定的類和類成員,前提是所有指定的類和類成員都存在。
-keep names { class _ specification }
如果在壓縮步驟中未刪除指定的類和類成員,則保護它們的名稱。
-keepclassmembernames
{class_specification}
如果在壓縮步驟中未刪除指定類成員的名稱,則保護這些名稱。
-keepclasseswithmembernames
{class_specification}
如果所有指定的類成員都存在,則保護指定的類和類成員的名稱(在壓縮步驟之後)
-打印種子{文件名}
列出類和類的成員-保留選項的列表,標準輸出到給定的文件。
壓縮
-唐斯林克
不要壓縮輸入類文件。
-打印用法
{文件名}
-為什麽保持{class_specification}
使最優化
-不要優化
不要優化輸入類文件。
-假設副作用
{class_specification}
優化假設指定的方法沒有任何副作用。
-允許訪問修改
優化允許使用類的修飾符和成員來訪問和修改類。
模糊的
-東托弗斯特
不要混淆輸入類文件。
-打印映射
{文件名}
-應用映射{文件名}
重用映射增加了混亂
-模糊字典{文件名}
使用給定文件中的關鍵字作為要混淆的方法的名稱。
-過度侵略性
混淆時使用介入式重載。
-useuniqueclassmembernames
確定統壹混淆類的成員名稱以增加混淆。
-flattenpackagehierarchy { package _ name }
重新打包所有重命名的包,並將它們放入給定的單個包中。
-重新打包類{package_name}
將所有重命名的類文件重新打包到壹個給定的包中。
-dontusemixedcaseclassnames
混淆不會產生各種各樣的類名。
-keep attributes {屬性名稱,...}
保護給定的可選屬性,如LineNumberTable,
LocalVariableTable,源文件,已棄用,合成,簽名,
和內部類。
-renamesourcefileattribute { string }
設置源文件中給定的字符串常量。
解決出口包裝的錯誤
此時,導出提示“轉換為Dalvik”
格式化失敗,出現錯誤
1”錯誤,網上有很多種說法,最後我把proguard從4.4升級到4.8解決了。官方地址是/question。...
單壹類型參數.
另外,我又用了JsonObject,提交的對象中的成員實際上被改成了a,所以上面給的東西還不夠,還需要添加。
#使用您自己的拼接JsonObject
-保留類com.google.gson.JsonObject
{ *;}
個人建議減少這些依賴包混淆帶來的麻煩,幹脆全部保持不混淆。例如
-保留類com . bad logic . * * { *;
}
-保留類別*工具
com.badlogic.gdx.utils.Json*
-keep class com . Google . * * { *;
}
使用libgdx所需的配置
reference/p/libgdx-users/wiki/Ant
驗證包裝效果
使用apktool的反編譯工具,我解壓了包文件,看了壹下。如果包路徑、類名、變量名、方法名的變化和妳的預期壹致,那就OK了。命令:
apktool.bat d xxx.apk
德斯迪爾
配置實例
-因紮爾
androidtest.jarjar包的地址。
-outjars
Out輸出地址
-圖書館罐子
' d:\ Android-SDK-windows \ platforms \ Android-9 \ Android . jar '
被引用庫的jar,用於解析injars指定的jar類。
-優化過程
五
-dontusemixedcaseclassnames
混淆不會產生各種各樣的類名。
-dontskipnoppubliclibraryclasses
指定不忽略非公共庫類。
-不要預驗證
無預檢
-冗長
-優化
!代碼/簡化/算術,!field/*,!類別/合並/*
使最優化
-保留公共類*擴展
Android.app.Activity不混淆不變。
-保留公共類*擴展
android.app .應用
-保留公共類*擴展
android.app.Service
-保留公共類*擴展
安卓.內容.廣播接收器
-保留公共類*擴展
安卓.內容.內容提供商
-保留公共類*擴展
Android . app . backup . backupagenthelper
-保留公共類*擴展
安卓.偏好.偏好
-保持公開課
com . Android . vending . licensing . ilicensingservice
-保持公共抽象接口
com.asqw.android.Listener{
公共保護;
所有的方法都不會混淆。
}
-保持公開課
com.asqw.android{
public void Start(Java . lang . string);
這個方法不混亂。
}
-keep classes with membernames class * {
如果所有指定的類成員都存在,則保護指定的類和類成員的名稱(在壓縮步驟之後)
原生;
}
-keepclasseswithmembers class * {
保護指定的類和類成員,前提是所有指定的類和類成員都存在。
public (android.content.Context,
Android . util . attributeset);
}
-keepclasseswithmembers class *
{
public (android.content.Context,
android.util.AttributeSet,int);
}
-keepclassmembers類*擴展
Android . app . activity {保護指定類的成員,如果這個類被保護,他們會得到更好的保護。
公共空間
*(Android . view . view);
}
-keepclassmembers枚舉*
{
公共靜態**[]
values();
公共靜態**
value of(Java . lang . string);
}
-保留類別*工具
Android . OS . parcelable {保護指定的類文件和類成員。
公共靜態最終
Android . OS . parcelable $ Creator *;
}
//不要混淆指定包下的類。
-繼續上課
com.aspire.**