




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Android混淆配置一、proguard原理Java 代碼編譯成二進(jìn)制 class 文件,這個(gè) class 文件也可以反編譯成源代碼。除了注釋外,原來(lái)的 code 基本都可以看到。為了防止重要 code 被泄露,我們往往需要混淆(Obfuscationcode),也就是把方法,字段,包和類這些 java 元素的名稱改成無(wú)意義的名稱,這樣代碼結(jié)構(gòu)沒(méi)有變化,還可以運(yùn)行,但是想弄懂代碼的架構(gòu)卻很難。proguard 就是這樣的混淆工具,它可以分析一組 class 的結(jié)構(gòu),根據(jù)用戶的配置,然后把這些 class 文件的可以混淆 java 元素名混淆掉。在分析 class 的,同時(shí)他還有其他兩個(gè)功能,
2、刪除無(wú)效代碼(Shrinking 收縮),和代碼進(jìn)行優(yōu)化(OptimizationOptions)。缺省情況下,proguard 會(huì)混淆所有代碼,但是下面幾種情況是不能改變 java 元素的名稱,否則就會(huì)這樣就會(huì)導(dǎo)致程序出錯(cuò)。一,我們用到反射的地方。二,我們代碼依賴于系統(tǒng)的接口,比如被系統(tǒng)代碼調(diào)用的回調(diào)方法,這種情況最復(fù)雜。三,是我們的 java 元素名稱是在配置文件中配置好的。所以使用 proguard 時(shí),我們需要有個(gè)配置文件告訴 proguard 哪些 java 元素是不能混淆的。二、proguard酉己置Proguard.cfg 文件是用來(lái)描述混淆配置的描述文件。自 Android2.
3、3SDK 發(fā)布后,Google 便在 AndroidSDKTools 里加入了 proguard,proguard 是一個(gè)可以對(duì).java 文件進(jìn)行一定程度上的代碼混淆,使用 proguard 是一件極方便工作,在你項(xiàng)目中沒(méi)有其他外部Jar 包的情況下,在perties”文件里,添加一行:proguard.config=proguard.cfg 代碼即可,然后通過(guò) AndroidTools(右擊項(xiàng)目名)里導(dǎo)出 APK 即可。如果項(xiàng)目所使用的的 SDK 版本低于 2.3,只需要進(jìn)行android_dir%/tools/lib 目錄,復(fù)制 proguard.cfg 文件到項(xiàng)目
4、的根目錄下導(dǎo)出 APK 即可。(2.3 之前版本可以拷貝 proguard.cfg 文件到項(xiàng)目工程下)這里我們重點(diǎn)看看 proguard.cfg 文件是如何配置的?Google 默認(rèn)的 proguard.cfg 文件內(nèi)容如下:-optimizationpasses5-dontusemixedcaseclassnames-dontskipnonpubliclibraryclasses-dontpreverify-verbose-optimizations!code/simplification/arithmetic,!field/*,!class/merging/*-keeppublicclas
5、s*extendsandroid.app.Activity-keeppublicclass*extendsandroid.app.Application-keeppublicclass*extendsandroid.app.Service-keeppublicclass*extendsandroid.content.BroadcastReceiver-keeppublicclass*extendsandroid.content.ContentProvider-keeppublicclasscom.android.vending.licensing.ILicensingService-keepc
6、lasseswithmembernamesclass*native;)-keepclasseswithmembernamesclass*public(android.content.Context,android.util.AttributeSet);)-keepclasseswithmembernamesclass*public(android.content.Context,android.util.AttributeSet,int);)-keepclassmembersenum*publicstatic*values();publicstatic*valueOf(java.lang.St
7、ring);)-keepclass*implementsandroid.os.Parcelablepublicstaticfinalandroid.os.Parcelable$Creator*;)混淆中保留了繼承自 Activity、Service、ApplicationBroadcastReceiver、ContentProvider 等基本組件以及 com.android.vending.licensing.ILicensingService,并保留了所有的 Native 變量名及類名,所有類中部分以設(shè)定了固定參數(shù)格式的構(gòu)造函數(shù),枚舉等等。最常用的配置選項(xiàng):-dontwarn 缺省 pro
8、guard 會(huì)檢查每一個(gè)引用是否正確,但是第三方庫(kù)里面往往有些不會(huì)用到的類,沒(méi)有正確引用。如果不配置的話,系統(tǒng)就會(huì)報(bào)錯(cuò)。-keep 指定的類和類成員被保留作為入口。-keepclassmembers 指定的類成員被保留。-keepclasseswithmembers 指定的類和類成員被保留,假如指定的類成員存在的話。三、proguard問(wèn)題和風(fēng)險(xiǎn)代碼混淆后雖然有混淆優(yōu)化的好處,但是它往往也會(huì)帶來(lái)如下的幾點(diǎn)問(wèn)題:1,混淆錯(cuò)誤,用到第三方庫(kù)的時(shí)候,必須告訴 proguard 不要檢查,否則 proguard 會(huì)報(bào)錯(cuò)。2,運(yùn)行錯(cuò)誤,當(dāng) code 不能混淆的時(shí)候,我們必須要正確配置,否則程序會(huì)運(yùn)行出錯(cuò)
9、,這種情況問(wèn)題最多。3,調(diào)試苦難,出錯(cuò)了,錯(cuò)誤堆棧是混淆后的代碼,自己也看不懂。四、解決方案為了防止混淆出問(wèn)題,你需要熟悉你所有的 code,系統(tǒng)的架構(gòu),以及系統(tǒng)和你 code 的集成的接口,并細(xì)心分析。同時(shí)你必須需要一輪全面的測(cè)試。所以混淆也還是有一定風(fēng)險(xiǎn)的。為了避免風(fēng)險(xiǎn),你可以只是混淆部分關(guān)鍵的代碼,但是這樣你的混淆的效果也會(huì)有所降低。常見(jiàn)的不能混淆的 androidCode(1)Android 程序,下面這樣代碼混淆的時(shí)候要注意保留。(2)Android 系統(tǒng)組件,系統(tǒng)組件有固定的方法被系統(tǒng)調(diào)用。(3)被 AndroidResource 文件引用到的。名字已經(jīng)固定,也不能混淆,比如自定義
10、的 View。(4)AndroidParcelable,需要使用 android 序列化的。其他 Anroid 官方建議不混淆的,如android.app.backup.BackupAgentHelper(6)android.preference.Preferencecom.android.vending.licensing.ILicensingService(8)Java 序列化方法,系統(tǒng)序列化需要固定的方法。(9)枚舉,系統(tǒng)需要處理枚舉的固定方法。(10)native 本地方法,不能修改本地方法名(11)annotations 注釋(12)數(shù)據(jù)庫(kù)驅(qū)動(dòng)(13)有些 resource 文件(1
11、4)用到反射的地方,比如調(diào)用 aidl如何實(shí)施?(1)保留系統(tǒng)默認(rèn)混淆設(shè)置。默認(rèn)系統(tǒng)的混淆配置會(huì)保留:Android 系統(tǒng)組件自定義 ViewAndroidParcelableAndroidR 文件AndroidParcelable枚舉各個(gè)開(kāi)發(fā)人員必須檢查自己的 code 是否用到反射,和其他不能混淆的地方。告訴我來(lái)修改配置文件(已經(jīng)保留的就不需要了)目前系統(tǒng)不檢查的第三方庫(kù)為:-dontwarnandroid.support.*-dontwarncom.tencent.*-dontwarnorg.dom4j.*-dontwarnorg.slf4j.*-dontwarnorg.http.mut
12、ipart.*-dontwarnorg.apache.*-dontwarnorg.apache.log4j.*-mons.logging.*-mons.codec.binary.*-dontwarnweibo4android.*proguard 參數(shù):-includefilename從給定的文件中讀取配置參數(shù)-injarsclass_path指定要處理的應(yīng)用程序 jar,war,ear 和目錄-outjarsclass_path指定處理完后要輸出的 jar,war,ear 和目錄的名稱-libraryjarsclasspath指定要處理的應(yīng)用程序 jar,war,ear 和目錄所需要的程序庫(kù)文
13、件-dontskipnonpubliclibraryclasses 指定不去忽略非公共的庫(kù)類。保留選項(xiàng):-keepModifierclass_specification保護(hù)指定的類文件和類的成員-keepclassmembersmodifierclassspecification保護(hù)指定類的成員,如果此類受至 U 保護(hù)他們會(huì)保護(hù)的更好-keepclasseswithmembersclass_specification保護(hù)指定的類和類的成員,但條件是所有指定的類和類成員是要存在。-keepnamesclass_specification保護(hù)指定的類和類的成員的名稱(如果他們不會(huì)壓縮步驟中刪除)-
14、keepclassmembernamesclass_specification保護(hù)指定的類的成員的名稱(如果他們不會(huì)壓縮步驟中刪除)-keepclasseswithmembernamesclass_specification保護(hù)指定的類和類的成員的名稱,如果所有指定的類成員出席(在壓縮步驟之后)-printseedsfilename列出類和類的成員-keep 選項(xiàng)的清單,標(biāo)準(zhǔn)輸出到給定的文件壓縮-basedirectorydirectoryname指定基礎(chǔ)目錄為以后相對(duì)的檔案名稱-dontskipnonpubliclibraryclassmembers指定不去忽略包可見(jiàn)的庫(kù)類的成員。-prin
15、tusagefilename-whyareyoukeepingclass_specification優(yōu)化-dontoptimize 不優(yōu)化輸入的類文件-assumenosideeffectsclass_specification優(yōu)化時(shí)假設(shè)指定的方法,沒(méi)有任何副作用-allowaccessmodification 優(yōu)化時(shí)允許訪問(wèn)并修改有修飾符的類和類的成員混淆-dontobfuscate 不混淆輸入的類文件-printmappingfilename-applymappingfilename重用映射增加混淆-obfuscationdictionaryfilename使用給定文件中的關(guān)鍵字作為要混淆
16、方法的名稱-overloadaggressively 混淆時(shí)應(yīng)用侵入式重載-useuniqueclassmembernames 確定統(tǒng)一的混淆類的成員名稱來(lái)增加混淆-flattenpackagehierarchypackage_name重新包裝所有重命名的包并放在給定的單一包中-repackageclasspackage_name重新包裝所有重命名的類文件中放在給定的單一包中-dontusemixedcaseclassnames 混淆時(shí)不會(huì)產(chǎn)生形形色色的類名-keepattributesattribute_name,保護(hù)給定的可選屬性,例如LineNumberTable,LocalVariab
17、leTable,SourceFile,Deprecated,Synthetic,Signature,andInnerClasses.-dontshrink不壓縮輸入的類文件(2)解決 export 打包的報(bào)錯(cuò)這個(gè)時(shí)候 export 提示“conversiontoDalvikformatfailedwitherror1”錯(cuò)誤,網(wǎng)上說(shuō)法有好多種,最后我還是把 proguard 從 4.4 升級(jí)到 4.8 就解決了。官方地址是http:/。上面的配置文件參數(shù)可以在這里查閱。升級(jí)辦法很簡(jiǎn)單,就是把 androidsdk 目錄下的 tool/proguard 目錄覆蓋一下即可。(3)打包出來(lái)的程序如何調(diào)
18、試?一旦打包出來(lái),就不能用 eclipse 的 logcat 去看了,這里可以用 androidsdk 中 ddms.bat 的tool 來(lái)看,一用就發(fā)現(xiàn)和 logcat 其實(shí)還是一個(gè)東西,就是多了個(gè)設(shè)備的選擇。(4)使用 gson 需要的配置當(dāng) Gson 用到了泛型就會(huì)有報(bào)錯(cuò),這個(gè)真給郁悶了半天,提示“Missingtypeparameter。最后找到一個(gè)資料給了一個(gè)解決辦法,參考:http:/ JsonObject,提交的 Object 里面的 members 居然被改成了 a。所以上面給的東西還不夠,還要加上#用到自己拼接的 JsonObject-keepclasscom.google.
19、gson.JsonObject*;個(gè)人建議減少這些依賴包混淆帶來(lái)的麻煩,干脆都全部保留不混淆。例如-keepclasscom.badlogic.*;-keepclass*implementscom.badlogic.gdx.utils.Json*-keepclasscom.google.*;-renamesourcefileattributestring設(shè)置源文件中給定的字符串常量(5)使用 libgdx 需要的配置參考 http:/code.google.eom/p/libgdx-users/wiki/Ant(6)引入第三方 Jar 包時(shí)配置在其中加入以下代碼:-libraryjars%li
20、b_jar_path%有幾個(gè) Jar 包,便添加幾次,如在項(xiàng)目的 libs 目錄下有 a.jar,b.jar,c.jar 三個(gè) Jar 包:-libraryjarslibs/a.jar-libraryjarslibs/b.jar-libraryjarslibs/c.jar此外,還有些特殊情況,會(huì)令導(dǎo)出發(fā)生異常,視具體異常情況而定,修改 proguard.cfg 文件。比如出現(xiàn)了以下異常:Warning:com.google.android.maps.MapView:cantfindreferencedclasscom.android.mkstubs.stubber.MethodStubberW
21、arning:com.google.android.maps.MapView$1:cantfindreferencedclasscom.android.mkstubs.stubber.MethodStubber 即:Warning:%class_full_name%:cantfindreferencedclass%class_full_name%這種異常情況,需要在 proguard.cfg 文件中,添加以下代碼:-dontwarn%class_full_name%不檢查指定包的文件即可,便以上面例子而言,應(yīng)當(dāng)如下:-dontwarncom.google.android.maps.*等等,此類
22、情況修改 proguard.cfg 文件即可,還有種特殊情況,需要對(duì)引入的 Jar 包進(jìn)行修改,如下:Warning:libraryclassandroid.content.res.XmlResourceParserextendsorimplementsprogramclassorg.xmlpull.vl.XmlPullParserWarning:libraryclassandroid.view.LayoutInflaterdependsonprogramclassorg.xmlpull.vl.XmlPullParser這是因?yàn)橐玫?Jar 包中含有 xmlpull 類庫(kù),Android 系
23、統(tǒng)的類庫(kù)中已經(jīng)包含了 xmlpull,這樣混淆出現(xiàn)了沖突,解決辦法是把它里面已存在的和系統(tǒng)庫(kù)沖突的類去掉,就可以了,產(chǎn)生沖突的類可見(jiàn)控制臺(tái)輸出。另外對(duì)不想混淆的類/方法/變量,可以使用-keep 指定,具體參考 proguard.cfg 文件寫(xiě)法。(7)驗(yàn)證打包效果利用了 apktool 的反編譯工具,把打包文件又解壓了看了一下,如果包路徑、類名、變量名、方法名這些變化和你期望一致,那就 OK 了。命令:apktool.batdxxx.apkdestdir五、配置實(shí)例-injarsandroidtest.jar【jar 包所在地址】-outjarsout【輸出地址】-libraryjarsD:
24、android-sdk-windowsplatformsandroid-9android.jar 【弓 I 用的庫(kù)的 jar,用于解析 injars所指定的 jar 類】-optimizationpasses5-dontusemixedcaseclassnames【混淆時(shí)不會(huì)產(chǎn)生形形色色的類名】-dontskipnonpubliclibraryclasses【指定不去忽略非公共的庫(kù)類。】-dontpreverify【不預(yù)校驗(yàn)】-verbose-dumpclass_files.txt-printseedsseeds.txt-printusageunused.txt-printmappingmap
25、ping.txt-optimizations!code/simplification/arithmetic,!field/*,!class/merging/*【優(yōu)化】-allowaccessmodification-keepattributes*Annotation*/保持 Annotion 屬性-renamesourcefileattributeSourceFile-keepattributesSourceFile,LineNumberTable-repackageclasses-keeppublicclass*extendsandroid.app.Activity【不進(jìn)行混淆保持原樣】-k
26、eeppublicclass*extendsandroid.app.Application-keeppublicclass*extendsandroid.app.Service-keeppublicclass*extendsandroid.content.BroadcastReceiver-keeppublicclass*extendsandroid.content.ContentProvider-keeppublicclass*extendsandroid.app.backup.BackupAgentHelper-keeppublicclass*extendsandroid.preferen
27、ce.Preference-keeppublicclasscom.android.vending.licensing.ILicensingService-keeppublicabstractinterfacecom.asqw.android.Listenerpublicprotected;【所有方法不進(jìn)行混淆】)-keeppublicclasscom.asqw.androidpublicvoidStart(java.lang.String);【對(duì)該方法不進(jìn)行混淆】)-keepclasseswithmembernamesclass*【保護(hù)指定的類和類的成員的名稱,如果所有指定的類成員出席(在壓縮
28、步驟之后)】native;)-keepclasseswithmembersclass*1 保護(hù)指定的類和類的成員, 但條件是所有指定的類和類成員是要存在?!縫ublic(android.content.Context,android.util.AttributeSet);)-keepclasseswithmembersclass*public(android.content.Context,android.util.AttributeSet,int);)-keepclassmembersclass*extendsandroid.app.Activity【保護(hù)指定類的成員,如果此類受至 U保護(hù)他
29、們會(huì)保護(hù)的更好】publicvoid*(android.view.View);)-keepclassmembersenum*publicstatic*values();publicstatic*valueOf(java.lang.String);)-keepclass*implementsandroid.os.Parcelable【保護(hù)指定的類文件和類的成員】publicstaticfinalandroid.os.Parcelable$Creator*;)# Explicitlypreserveallserializationmembers.TheSerializableinterface#
30、isonlyamarkerinterface,soitwouldntsavethem.-keepclassmembersclass*implementsjava.io.SerializablestaticfinallongserialVersionUID;privatestaticfinaljava.io.ObjectStreamField 口 serialPersistentFields;privatevoidwriteObject(java.io.ObjectOutputStream);privatevoidreadObject(java.io.ObjectlnputStream);jav
31、a.lang.ObjectwriteReplace();java.lang.ObjectreadResolve();)# #Begin:proguardconfigurationforGson# Gsonusesgenerictypeinformationstoredinaclassfilewhenworkingwithfields.Proguard# removessuchinformationbydefault,soconfigureittokeepallofit.-keepattributesSignature# Gsonspecificclasses# keepclasssun.mis
32、c.Unsafe*;# -keepclasscom.google.gson.stream.*;# Applicationclassesthatwillbeserialized/deserializedoverGson# keepclasscom.google.gson.examples.android.model.*;# #End:proguardconfigurationforGson/不混淆指定包下的類-keepclasscom.aspire.*參考:http:/ Warning:cantfindsuperclassorinterface/Warning:cantfindreference
33、dclass 等警告信息!解決方法:(1)在配置文件中使用-libraryjars 選項(xiàng)來(lái)指定代碼里引用到的所有庫(kù),包括 Java 運(yùn)行庫(kù)。(2)確保報(bào)錯(cuò)的類沒(méi)有在你的項(xiàng)目中使用到,使用-dontwarn 類名正則表達(dá)式”屏蔽警告(3)使用 keep 保持第三方內(nèi)容(jar 包)不混淆。以引入 android-support-v4.jar 包為例,那么在工程打包混淆時(shí),就會(huì)出現(xiàn)報(bào)錯(cuò)提示。例如提示你:Youmayneedtospecifyadditionallibraryjars(using-libraryjars)。修改 progurad.cfg 文件,添加如下配置:在 proguard.cf
34、g 里的后面,添加如下內(nèi)容:java-libraryjars/android-support-v4.jar/指定引入的外部 jar 包-dontwarnandroid.support.v4.*/聲明指定包不做引用檢查,用來(lái)屏蔽警告-keepclassandroid.support.v4.*;/聲明不混淆的類-keeppublicclass*extendsandroid.support.v4.*-keeppublicclass*extendsandroid.app.Fragment然后你再打包看看,應(yīng)該可以正常生成 apk 安裝包了。出錯(cuò)情況一:類 1cantfindreferencedclas
35、s 類 2字面上的意思就是類 1 找不到類 2 的引用;它會(huì)建議你:Youmayneedtospecifyadditionallibraryjars(using-libraryjars).;需要使用-libraryjars 加上項(xiàng)目中使用到的第三方庫(kù)就 OK 了。例如:-libraryjars/android-support-v4.jar注意:這里引用方式是當(dāng)前工程的根目錄(也可以配置其他目錄),也就是說(shuō),你要把第三方 jar 放到當(dāng)前目錄下,否則就會(huì)警告說(shuō)找不到 jar 文件!情況二:例如:cantfindsuperclassorinterfaceandroid.os.Parcelable$
36、ClassLoaderCreator,碰至 U 這樣的情況,可以使用-dontwarncom.xx.yy.*,不對(duì)錯(cuò)誤提出警告。注意: 使用這個(gè)方式的話, 要確保自己沒(méi)有用到這個(gè)庫(kù)里面的類! 否則就會(huì)拋ClassNotFoundException!情況三:在工程中確實(shí)用到了該類,采用上面方式還是不行。這個(gè)時(shí)候就要再增加一項(xiàng):-keepclasscom.xx.yy.*;,讓當(dāng)前類不混淆。小結(jié):對(duì)于引用第三方包的情況,可以采用下面方式避免打包出錯(cuò):-libraryjars/aaa.jar-dontwarncom.xx.yy.*-keepclasscom.xx.yy.*;最后打包成功,還要在機(jī)子上跑
37、跑,看看有沒(méi)有問(wèn)題。注意的是 android-support-v4.jar 這個(gè)包問(wèn)題,這里加上了對(duì)這個(gè) jar 包的處理第三方 jar 的混淆。-optimizationpasses5-dontusemixedcaseclassnames-dontskipnonpubliclibraryclasses-dontpreverify-verbose-optimizations!code/simplification/arithmetic,!field/*,!class/merging/*-keeppublicclass*extendsandroid.app.Activity/承activity,
38、application,service,broadcastReceiver,contentprovider.不進(jìn)行混淆-keeppublicclass*extendsandroid.app.Application-keeppublicclass*extendsandroid.app.Service-keeppublicclass*extendsandroid.content.BroadcastReceiver-keeppublicclass*extendsandroid.content.ContentProvider-keeppublicclass*extendsandroid.app.bac
39、kup.BackupAgentHelper-keeppublicclass*extendsandroid.preference.Preference-keeppublicclasscom.android.vending.licensing.ILicensingService這里處理第三方的 jar 包,第三方 JAR 包處理開(kāi)始-libraryjars/libs/android-support-v4.jar-libraryjars/libs/gdx-backend-android.jar-libraryjars/libs/gdx.jar這里不對(duì)第三方的 jar 包的提出 WARN-dontwa
40、rncom.badlogic.*-dontwarnandroid.support.v4.*-dontwarnandroid.support.v4.view.*/這里對(duì)第三方 jar 包的類不進(jìn)行混淆-keepclasscom.badlogic.gdx.backends.android.*;-keepclasscom.badlogic.gdx.*;-keepclasscom.badlogic.gdx.graphics.g2d.*;-keepclasscom.badlogic.gdx.graphics.*;-keepclassandroid.support.v4.view.*;/這里第三方 JAR
41、 包處理結(jié)束-keepclasseswithmembernamesclass*/natvie 方法不混淆native;-keepclasseswithmembersclass*對(duì)于所有類,有這個(gè)構(gòu)造函數(shù)不進(jìn)行混淆,主要是為了在 layout 中的,自定義的 viewpublic(android.content.Context,android.util.AttributeSet);-keepclasseswithmembersclass*public(android.content.Context,android.util.AttributeSet,int);)-keepclassmembers
42、class*extendsandroid.app.Activity/這個(gè)主要是在 layout 中寫(xiě)的onclick 方法 android:onclick=onClick,不進(jìn)行混淆publicvoid*(android.view.View);)-keepclassmembersenum*publicstatic*values();publicstatic*valueOf(java.lang.String);)# keepclass*implementsandroid.os.Parcelablepublicstaticfinalandroid.os.Parcelable$Creator*;)參
43、考:http:/ gson 的 newtypeToken,結(jié)果打包成 apk 發(fā)布時(shí),發(fā)現(xiàn)拋出異常。解決:第一種:在 proguard.cfg 中添加,-dontobfuscate-dontoptimize第二種:在 proguard.cfg 中添加,# Gsonusesgenerictypeinformationstoredinaclassfilewhenworkingwithfields.Proguard# removessuchinformationbydefault,soconfigureittokeepallofit.-keepattributesSignature# Gsonspe
44、cificclasses# keepclasssun.misc.Unsafe*;# -keepclasscom.google.gson.stream.*;# Applicationclassesthatwillbeserialized/deserializedoverGson# keepclasscom.google.gson.examples.android.model.*;這兩種方法都測(cè)試可行,第一個(gè)方法沒(méi)有混淆編譯,第二個(gè)方法能夠混淆編譯。參考:http:/ BaseDao,本來(lái)在平常的時(shí)候,調(diào)試都沒(méi)有出問(wèn)題,可是直到用了 Proguard 混淆以后,就出現(xiàn)各種錯(cuò)誤。下面就把我遇見(jiàn)的問(wèn)題
45、分享出來(lái)吧。第一個(gè),類型轉(zhuǎn)換錯(cuò)誤。因?yàn)槲矣玫姆盒?,所以在調(diào)用某些方法的時(shí)候,會(huì)出現(xiàn)這種錯(cuò)誤,后面在混淆配置文件加了一個(gè)過(guò)濾泛型的語(yǔ)句,如下。-keepattributesSignature過(guò)后,就沒(méi)有出現(xiàn)類似的類型轉(zhuǎn)換錯(cuò)誤。第二個(gè),空指針異常。原來(lái)我 model 的 set/get 方法名全部都被混淆了,導(dǎo)致找不到實(shí)體類無(wú)法 get 或者 set,返回的也就是 null 值,自然下面用到這個(gè)方法的返回值就會(huì)拋出空指針異常。這個(gè)時(shí)候應(yīng)該做的事情是阻止proguard 對(duì)實(shí)體類的混淆,比如:-keeppublicclassmypackage.MyBeanpublicvoidsetMyPropert
46、y(int);publicintgetMyProperty();或者干脆把 model 包下面的所有類,全部過(guò)濾掉。-keeppublicclassmypacke.MyBean總結(jié):如要用到反射,反射一般就會(huì)利用到泛型,所以必須要把泛型的全部過(guò)濾掉,如果有根據(jù)變量名或者方法名判斷的,記得所在的類需過(guò)濾掉,之中還有用到 annotation 的地方,要加入一行代碼,如下:-keepattributesAnnotation*這樣就能過(guò)濾掉所有的 annotation,否則也會(huì)拋出空指針異常。附錄proguard.cfg文件#Begin:proguardconfigurationcommonfora
47、llAndroidapps#指定車入/輸出 jar 以及第三方庫(kù)-injarsin.jar-outjarsout.jar-libraryjars$java.home/lib/rt.jar-optimizationpasses5#混淆時(shí)不會(huì)產(chǎn)生形形色色的類名-dontusemixedcaseclassnames#指定不去忽略非公共的庫(kù)類。-dontskipnonpubliclibraryclasses#指定不去忽略包可見(jiàn)的庫(kù)類的成員-dontskipnonpubliclibraryclassmembers#不預(yù)校驗(yàn)-dontpreverify-verbose-dumpclass_files.tx
48、t-printseedsseeds.txt-printusageunused.txt-printmappingmapping.txt#優(yōu)化-optimizations!code/simplification/arithmetic,!field/*,!class/merging/*-allowaccessmodification#保才 aannotation 注釋屬性,泛型中常用-keepattributes*Annotation*-renamesourcefileattributeSourceFile#保持 SourceFile/LineNumberTable 屬性-keepattribute
49、sSourceFile,LineNumberTable-repackageclasses#繼承之下面的類不進(jìn)行混淆保持原樣-keeppublicclass*extendsandroid.app.Activity-keeppublicclass*extendsandroid.app.Application-keeppublicclass*extendsandroid.app.Service-keeppublicclass*extendsandroid.content.BroadcastReceiver-keeppublicclass*extendsandroid.content.ContentP
50、rovider-keeppublicclass*extendsandroid.app.backup.BackupAgentHelper-keeppublicclass*extendsandroid.preference.Preference#不進(jìn)行混淆的類-keeppublicclasscom.android.vending.licensing.ILicensingService-dontnotecom.android.vending.licensing.ILicensingService#序歹 U 化Explicitlypreserveallserializationmembers.TheSeri
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 診所裝修環(huán)保保證金協(xié)議
- 農(nóng)業(yè)科技節(jié)水灌溉技術(shù)推廣應(yīng)用策略
- 公司可行性分析報(bào)告
- 廣汽充電樁 遠(yuǎn)程
- 垃圾發(fā)電采購(gòu)
- 高速電動(dòng)汽車充電樁
- 保險(xiǎn)行業(yè)保險(xiǎn)科技創(chuàng)新與風(fēng)險(xiǎn)管理方案
- 智能家電產(chǎn)品開(kāi)發(fā)與生產(chǎn)標(biāo)準(zhǔn)
- 農(nóng)業(yè)信息化應(yīng)用培訓(xùn)工作方案
- 項(xiàng)目會(huì)議紀(jì)要與行動(dòng)方案輸出
- 江蘇省南京師范大學(xué)附屬中學(xué)樹(shù)人學(xué)校2023-2024學(xué)年九年級(jí)下學(xué)期3月月考數(shù)學(xué)試卷
- 阿拉伯國(guó)家聯(lián)盟課件
- 油氣管道視頻監(jiān)控系統(tǒng)總體設(shè)計(jì)方案
- 知識(shí)產(chǎn)權(quán)案件調(diào)解實(shí)務(wù)
- 毫米波集成電路詳述
- 打印設(shè)備維護(hù)服務(wù)投標(biāo)方案
- JGT454-2014 建筑門窗、幕墻中空玻璃性能現(xiàn)場(chǎng)檢測(cè)方法
- 一定溶質(zhì)質(zhì)量分?jǐn)?shù)的氯化鈉溶液的配制
- DB5301∕T 24-2019 園林綠化養(yǎng)護(hù)規(guī)范
- 地坪漆施工合同地坪漆施工合同范本
- 高風(fēng)險(xiǎn)供應(yīng)商管理程序(經(jīng)典-專業(yè)-建議收藏)
評(píng)論
0/150
提交評(píng)論