版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Android混淆配置一、proguard原理Java 代碼編譯成二進制 class 文件,這個 class 文件也可以反編譯成源代碼。除了注釋外,原來的 code 基本都可以看到。為了防止重要 code 被泄露,我們往往需要混淆(Obfuscationcode),也就是把方法,字段,包和類這些 java 元素的名稱改成無意義的名稱,這樣代碼結(jié)構(gòu)沒有變化,還可以運行,但是想弄懂代碼的架構(gòu)卻很難。proguard 就是這樣的混淆工具,它可以分析一組 class 的結(jié)構(gòu),根據(jù)用戶的配置,然后把這些 class 文件的可以混淆 java 元素名混淆掉。在分析 class 的,同時他還有其他兩個功能,
2、刪除無效代碼(Shrinking 收縮),和代碼進行優(yōu)化(OptimizationOptions)。缺省情況下,proguard 會混淆所有代碼,但是下面幾種情況是不能改變 java 元素的名稱,否則就會這樣就會導致程序出錯。一,我們用到反射的地方。二,我們代碼依賴于系統(tǒng)的接口,比如被系統(tǒng)代碼調(diào)用的回調(diào)方法,這種情況最復雜。三,是我們的 java 元素名稱是在配置文件中配置好的。所以使用 proguard 時,我們需要有個配置文件告訴 proguard 哪些 java 元素是不能混淆的。二、proguard酉己置Proguard.cfg 文件是用來描述混淆配置的描述文件。自 Android2.
3、3SDK 發(fā)布后,Google 便在 AndroidSDKTools 里加入了 proguard,proguard 是一個可以對.java 文件進行一定程度上的代碼混淆,使用 proguard 是一件極方便工作,在你項目中沒有其他外部Jar 包的情況下,在perties”文件里,添加一行:proguard.config=proguard.cfg 代碼即可,然后通過 AndroidTools(右擊項目名)里導出 APK 即可。如果項目所使用的的 SDK 版本低于 2.3,只需要進行android_dir%/tools/lib 目錄,復制 proguard.cfg 文件到項目
4、的根目錄下導出 APK 即可。(2.3 之前版本可以拷貝 proguard.cfg 文件到項目工程下)這里我們重點看看 proguard.cfg 文件是如何配置的?Google 默認的 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ù),枚舉等等。最常用的配置選項:-dontwarn 缺省 pro
8、guard 會檢查每一個引用是否正確,但是第三方庫里面往往有些不會用到的類,沒有正確引用。如果不配置的話,系統(tǒng)就會報錯。-keep 指定的類和類成員被保留作為入口。-keepclassmembers 指定的類成員被保留。-keepclasseswithmembers 指定的類和類成員被保留,假如指定的類成員存在的話。三、proguard問題和風險代碼混淆后雖然有混淆優(yōu)化的好處,但是它往往也會帶來如下的幾點問題:1,混淆錯誤,用到第三方庫的時候,必須告訴 proguard 不要檢查,否則 proguard 會報錯。2,運行錯誤,當 code 不能混淆的時候,我們必須要正確配置,否則程序會運行出錯
9、,這種情況問題最多。3,調(diào)試苦難,出錯了,錯誤堆棧是混淆后的代碼,自己也看不懂。四、解決方案為了防止混淆出問題,你需要熟悉你所有的 code,系統(tǒng)的架構(gòu),以及系統(tǒng)和你 code 的集成的接口,并細心分析。同時你必須需要一輪全面的測試。所以混淆也還是有一定風險的。為了避免風險,你可以只是混淆部分關(guān)鍵的代碼,但是這樣你的混淆的效果也會有所降低。常見的不能混淆的 androidCode(1)Android 程序,下面這樣代碼混淆的時候要注意保留。(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ù)庫驅(qū)動(13)有些 resource 文件(1
11、4)用到反射的地方,比如調(diào)用 aidl如何實施?(1)保留系統(tǒng)默認混淆設(shè)置。默認系統(tǒng)的混淆配置會保留:Android 系統(tǒng)組件自定義 ViewAndroidParcelableAndroidR 文件AndroidParcelable枚舉各個開發(fā)人員必須檢查自己的 code 是否用到反射,和其他不能混淆的地方。告訴我來修改配置文件(已經(jīng)保留的就不需要了)目前系統(tǒng)不檢查的第三方庫為:-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指定要處理的應用程序 jar,war,ear 和目錄-outjarsclass_path指定處理完后要輸出的 jar,war,ear 和目錄的名稱-libraryjarsclasspath指定要處理的應用程序 jar,war,ear 和目錄所需要的程序庫文
13、件-dontskipnonpubliclibraryclasses 指定不去忽略非公共的庫類。保留選項:-keepModifierclass_specification保護指定的類文件和類的成員-keepclassmembersmodifierclassspecification保護指定類的成員,如果此類受至 U 保護他們會保護的更好-keepclasseswithmembersclass_specification保護指定的類和類的成員,但條件是所有指定的類和類成員是要存在。-keepnamesclass_specification保護指定的類和類的成員的名稱(如果他們不會壓縮步驟中刪除)-
14、keepclassmembernamesclass_specification保護指定的類的成員的名稱(如果他們不會壓縮步驟中刪除)-keepclasseswithmembernamesclass_specification保護指定的類和類的成員的名稱,如果所有指定的類成員出席(在壓縮步驟之后)-printseedsfilename列出類和類的成員-keep 選項的清單,標準輸出到給定的文件壓縮-basedirectorydirectoryname指定基礎(chǔ)目錄為以后相對的檔案名稱-dontskipnonpubliclibraryclassmembers指定不去忽略包可見的庫類的成員。-prin
15、tusagefilename-whyareyoukeepingclass_specification優(yōu)化-dontoptimize 不優(yōu)化輸入的類文件-assumenosideeffectsclass_specification優(yōu)化時假設(shè)指定的方法,沒有任何副作用-allowaccessmodification 優(yōu)化時允許訪問并修改有修飾符的類和類的成員混淆-dontobfuscate 不混淆輸入的類文件-printmappingfilename-applymappingfilename重用映射增加混淆-obfuscationdictionaryfilename使用給定文件中的關(guān)鍵字作為要混淆
16、方法的名稱-overloadaggressively 混淆時應用侵入式重載-useuniqueclassmembernames 確定統(tǒng)一的混淆類的成員名稱來增加混淆-flattenpackagehierarchypackage_name重新包裝所有重命名的包并放在給定的單一包中-repackageclasspackage_name重新包裝所有重命名的類文件中放在給定的單一包中-dontusemixedcaseclassnames 混淆時不會產(chǎn)生形形色色的類名-keepattributesattribute_name,保護給定的可選屬性,例如LineNumberTable,LocalVariab
17、leTable,SourceFile,Deprecated,Synthetic,Signature,andInnerClasses.-dontshrink不壓縮輸入的類文件(2)解決 export 打包的報錯這個時候 export 提示“conversiontoDalvikformatfailedwitherror1”錯誤,網(wǎng)上說法有好多種,最后我還是把 proguard 從 4.4 升級到 4.8 就解決了。官方地址是http:/。上面的配置文件參數(shù)可以在這里查閱。升級辦法很簡單,就是把 androidsdk 目錄下的 tool/proguard 目錄覆蓋一下即可。(3)打包出來的程序如何調(diào)
18、試?一旦打包出來,就不能用 eclipse 的 logcat 去看了,這里可以用 androidsdk 中 ddms.bat 的tool 來看,一用就發(fā)現(xiàn)和 logcat 其實還是一個東西,就是多了個設(shè)備的選擇。(4)使用 gson 需要的配置當 Gson 用到了泛型就會有報錯,這個真給郁悶了半天,提示“Missingtypeparameter。最后找到一個資料給了一個解決辦法,參考:http:/ JsonObject,提交的 Object 里面的 members 居然被改成了 a。所以上面給的東西還不夠,還要加上#用到自己拼接的 JsonObject-keepclasscom.google.
19、gson.JsonObject*;個人建議減少這些依賴包混淆帶來的麻煩,干脆都全部保留不混淆。例如-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 包時配置在其中加入以下代碼:-libraryjars%li
20、b_jar_path%有幾個 Jar 包,便添加幾次,如在項目的 libs 目錄下有 a.jar,b.jar,c.jar 三個 Jar 包:-libraryjarslibs/a.jar-libraryjarslibs/b.jar-libraryjarslibs/c.jar此外,還有些特殊情況,會令導出發(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%不檢查指定包的文件即可,便以上面例子而言,應當如下:-dontwarncom.google.android.maps.*等等,此類
22、情況修改 proguard.cfg 文件即可,還有種特殊情況,需要對引入的 Jar 包進行修改,如下:Warning:libraryclassandroid.content.res.XmlResourceParserextendsorimplementsprogramclassorg.xmlpull.vl.XmlPullParserWarning:libraryclassandroid.view.LayoutInflaterdependsonprogramclassorg.xmlpull.vl.XmlPullParser這是因為引用的 Jar 包中含有 xmlpull 類庫,Android 系
23、統(tǒng)的類庫中已經(jīng)包含了 xmlpull,這樣混淆出現(xiàn)了沖突,解決辦法是把它里面已存在的和系統(tǒng)庫沖突的類去掉,就可以了,產(chǎn)生沖突的類可見控制臺輸出。另外對不想混淆的類/方法/變量,可以使用-keep 指定,具體參考 proguard.cfg 文件寫法。(7)驗證打包效果利用了 apktool 的反編譯工具,把打包文件又解壓了看了一下,如果包路徑、類名、變量名、方法名這些變化和你期望一致,那就 OK 了。命令:apktool.batdxxx.apkdestdir五、配置實例-injarsandroidtest.jar【jar 包所在地址】-outjarsout【輸出地址】-libraryjarsD:
24、android-sdk-windowsplatformsandroid-9android.jar 【弓 I 用的庫的 jar,用于解析 injars所指定的 jar 類】-optimizationpasses5-dontusemixedcaseclassnames【混淆時不會產(chǎn)生形形色色的類名】-dontskipnonpubliclibraryclasses【指定不去忽略非公共的庫類。】-dontpreverify【不預校驗】-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【不進行混淆保持原樣】-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;【所有方法不進行混淆】)-keeppublicclasscom.asqw.androidpublicvoidStart(java.lang.String);【對該方法不進行混淆】)-keepclasseswithmembernamesclass*【保護指定的類和類的成員的名稱,如果所有指定的類成員出席(在壓縮
28、步驟之后)】native;)-keepclasseswithmembersclass*1 保護指定的類和類的成員, 但條件是所有指定的類和類成員是要存在?!縫ublic(android.content.Context,android.util.AttributeSet);)-keepclasseswithmembersclass*public(android.content.Context,android.util.AttributeSet,int);)-keepclassmembersclass*extendsandroid.app.Activity【保護指定類的成員,如果此類受至 U保護他
29、們會保護的更好】publicvoid*(android.view.View);)-keepclassmembersenum*publicstatic*values();publicstatic*valueOf(java.lang.String);)-keepclass*implementsandroid.os.Parcelable【保護指定的類文件和類的成員】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 選項來指定代碼里引用到的所有庫,包括 Java 運行庫。(2)確保報錯的類沒有在你的項目中使用到,使用-dontwarn 類名正則表達式”屏蔽警告(3)使用 keep 保持第三方內(nèi)容(jar 包)不混淆。以引入 android-support-v4.jar 包為例,那么在工程打包混淆時,就會出現(xiàn)報錯提示。例如提示你:Youmayneedtospecifyadditionallibraryjars(using-libraryjars)。修改 progurad.cfg 文件,添加如下配置:在 proguard.cf
34、g 里的后面,添加如下內(nèi)容:java-libraryjars/android-support-v4.jar/指定引入的外部 jar 包-dontwarnandroid.support.v4.*/聲明指定包不做引用檢查,用來屏蔽警告-keepclassandroid.support.v4.*;/聲明不混淆的類-keeppublicclass*extendsandroid.support.v4.*-keeppublicclass*extendsandroid.app.Fragment然后你再打包看看,應該可以正常生成 apk 安裝包了。出錯情況一:類 1cantfindreferencedclas
35、s 類 2字面上的意思就是類 1 找不到類 2 的引用;它會建議你:Youmayneedtospecifyadditionallibraryjars(using-libraryjars).;需要使用-libraryjars 加上項目中使用到的第三方庫就 OK 了。例如:-libraryjars/android-support-v4.jar注意:這里引用方式是當前工程的根目錄(也可以配置其他目錄),也就是說,你要把第三方 jar 放到當前目錄下,否則就會警告說找不到 jar 文件!情況二:例如:cantfindsuperclassorinterfaceandroid.os.Parcelable$
36、ClassLoaderCreator,碰至 U 這樣的情況,可以使用-dontwarncom.xx.yy.*,不對錯誤提出警告。注意: 使用這個方式的話, 要確保自己沒有用到這個庫里面的類! 否則就會拋ClassNotFoundException!情況三:在工程中確實用到了該類,采用上面方式還是不行。這個時候就要再增加一項:-keepclasscom.xx.yy.*;,讓當前類不混淆。小結(jié):對于引用第三方包的情況,可以采用下面方式避免打包出錯:-libraryjars/aaa.jar-dontwarncom.xx.yy.*-keepclasscom.xx.yy.*;最后打包成功,還要在機子上跑
37、跑,看看有沒有問題。注意的是 android-support-v4.jar 這個包問題,這里加上了對這個 jar 包的處理第三方 jar 的混淆。-optimizationpasses5-dontusemixedcaseclassnames-dontskipnonpubliclibraryclasses-dontpreverify-verbose-optimizations!code/simplification/arithmetic,!field/*,!class/merging/*-keeppublicclass*extendsandroid.app.Activity/承activity,
38、application,service,broadcastReceiver,contentprovider.不進行混淆-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 包處理開始-libraryjars/libs/android-support-v4.jar-libraryjars/libs/gdx-backend-android.jar-libraryjars/libs/gdx.jar這里不對第三方的 jar 包的提出 WARN-dontwa
40、rncom.badlogic.*-dontwarnandroid.support.v4.*-dontwarnandroid.support.v4.view.*/這里對第三方 jar 包的類不進行混淆-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*對于所有類,有這個構(gòu)造函數(shù)不進行混淆,主要是為了在 layout 中的,自定義的 viewpublic(android.content.Context,android.util.AttributeSet);-keepclasseswithmembersclass*public(android.content.Context,android.util.AttributeSet,int);)-keepclassmembers
42、class*extendsandroid.app.Activity/這個主要是在 layout 中寫的onclick 方法 android:onclick=onClick,不進行混淆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ā)布時,發(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.*;這兩種方法都測試可行,第一個方法沒有混淆編譯,第二個方法能夠混淆編譯。參考:http:/ BaseDao,本來在平常的時候,調(diào)試都沒有出問題,可是直到用了 Proguard 混淆以后,就出現(xiàn)各種錯誤。下面就把我遇見的問題
45、分享出來吧。第一個,類型轉(zhuǎn)換錯誤。因為我用的泛型,所以在調(diào)用某些方法的時候,會出現(xiàn)這種錯誤,后面在混淆配置文件加了一個過濾泛型的語句,如下。-keepattributesSignature過后,就沒有出現(xiàn)類似的類型轉(zhuǎn)換錯誤。第二個,空指針異常。原來我 model 的 set/get 方法名全部都被混淆了,導致找不到實體類無法 get 或者 set,返回的也就是 null 值,自然下面用到這個方法的返回值就會拋出空指針異常。這個時候應該做的事情是阻止proguard 對實體類的混淆,比如:-keeppublicclassmypackage.MyBeanpublicvoidsetMyPropert
46、y(int);publicintgetMyProperty();或者干脆把 model 包下面的所有類,全部過濾掉。-keeppublicclassmypacke.MyBean總結(jié):如要用到反射,反射一般就會利用到泛型,所以必須要把泛型的全部過濾掉,如果有根據(jù)變量名或者方法名判斷的,記得所在的類需過濾掉,之中還有用到 annotation 的地方,要加入一行代碼,如下:-keepattributesAnnotation*這樣就能過濾掉所有的 annotation,否則也會拋出空指針異常。附錄proguard.cfg文件#Begin:proguardconfigurationcommonfora
47、llAndroidapps#指定車入/輸出 jar 以及第三方庫-injarsin.jar-outjarsout.jar-libraryjars$java.home/lib/rt.jar-optimizationpasses5#混淆時不會產(chǎn)生形形色色的類名-dontusemixedcaseclassnames#指定不去忽略非公共的庫類。-dontskipnonpubliclibraryclasses#指定不去忽略包可見的庫類的成員-dontskipnonpubliclibraryclassmembers#不預校驗-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#繼承之下面的類不進行混淆保持原樣-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#不進行混淆的類-keeppublicclasscom.android.vending.licensing.ILicensingService-dontnotecom.android.vending.licensing.ILicensingService#序歹 U 化Explicitlypreserveallserializationmembers.TheSeri
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年版中國出境旅游行業(yè)運營模式及“一帶一路”發(fā)展規(guī)劃分析報告
- 2024-2030年版中國三聚氰胺氰尿酸鹽(MCA)行業(yè)規(guī)模分析及發(fā)展可行性研究報告
- 2024-2030年江蘇省光纖光纜行業(yè)發(fā)展形勢及投資策略研究報告版
- 2024-2030年新版中國刀具痤套項目可行性研究報告
- 2024-2030年單段煤氣發(fā)生爐搬遷改造項目可行性研究報告
- 2024-2030年全球及中國食品級松香甘油酯行業(yè)銷售模式及需求趨勢預測報告
- 2024-2030年全球及中國鉬鑭合金行業(yè)需求態(tài)勢及投資前景預測報告
- 2024年度衛(wèi)星通信服務(wù)采購合同
- 2024-2030年全球及中國磺胺行業(yè)前景動態(tài)及供需趨勢預測報告~
- 2024-2030年全球及中國電子雪茄行業(yè)銷售情況及營銷前景預測報告
- 2023年12月英語四級真題及答案-第2套
- 2024天貓男裝行業(yè)秋冬趨勢白皮書
- 《正確對待外來文化》名師課件
- 2024年綿陽科技城新區(qū)事業(yè)單位考核公開招聘高層次人才10人(高頻重點復習提升訓練)共500題附帶答案詳解
- 中醫(yī)食療藥膳學智慧樹知到答案2024年四川護理職業(yè)學院
- 建筑項目安全風險分級管控清單建筑風險分級管控清單(范例)
- 馬背上的民族蒙古族少數(shù)民族蒙古族介紹課件
- 工程圖學(天津大學)智慧樹知到期末考試答案章節(jié)答案2024年天津大學
- 農(nóng)村戶改廁施工協(xié)議書
- 當代社會政策分析 課件 第十一章 殘疾人社會政策
- 家政公司未來發(fā)展計劃方案
評論
0/150
提交評論