安卓APP開(kāi)發(fā)項(xiàng)目制作時(shí)我們要注意對(duì)APP進(jìn)行混淆時(shí),深圳APP開(kāi)發(fā)公司整理常用的指令有以下幾個(gè)。
#混淆后的類名不使用大小寫混合,只用小寫
-dontusemixedcaseclassnames
#指定不去忽略非公共庫(kù)的類
-dontskipnonpubliclibraryclasses
#不做預(yù)校驗(yàn),AndroidAPP不需要preverify,去掉這一步能夠加快混淆速度
-dontpreverify
#指定在處理過(guò)程中寫出更多信息。如果程序以一個(gè)異常終止,則此選項(xiàng)將打印整個(gè)堆棧跟蹤,而不只是異常消息。
-verbose
#指定在更細(xì)粒度級(jí)別啟用和禁用的優(yōu)化
-optimizations
#編譯時(shí),忽略針對(duì)某些類的警告信息
-dontwarn
#類和類成員都不做混淆處理
-keep
#類成員不做混淆處理
-keepclassmembers
#某些屬性不做混淆處理
-keepattributes
開(kāi)發(fā)APP時(shí)ProGuard注意事項(xiàng)
在混淆配置文件中,如果使用了-keep指令,最好同時(shí)使用-dontwarn指令,否則可能會(huì)因?yàn)槌霈F(xiàn)warning導(dǎo)致編譯出錯(cuò)。以下兩個(gè)指令最好也要使用上,否則APP崩潰后,出錯(cuò)信息里沒(méi)有行號(hào),不方便分析解決問(wèn)題。
-renamesourcefileattributeSourceFile
-keepattributesSourceFile,LineNumberTable
混淆功能通常配置是在編譯Release版本時(shí)生效,而開(kāi)發(fā)人員通常只編譯Debug版本,這往往會(huì)導(dǎo)致在開(kāi)發(fā)人員本機(jī)能夠正常編譯,在編譯服務(wù)器編譯Release版本時(shí)因?yàn)闆](méi)有正確配置混淆而出錯(cuò)。
在向代碼服務(wù)器提交代碼前,開(kāi)發(fā)人員最好在本機(jī)也編譯下Release版本,這樣可以提前發(fā)現(xiàn)此類問(wèn)題,避免服務(wù)器編譯出錯(cuò)。有時(shí)會(huì)遇到Release版本有某個(gè)問(wèn)題,但Debug版本沒(méi)有這個(gè)問(wèn)題的情況,是由于Release版本編譯時(shí)修改了類名、方法名和變量名,在運(yùn)行時(shí)找不到對(duì)應(yīng)的名稱,導(dǎo)致出錯(cuò)。解決這樣的問(wèn)題,需在混淆文件中做如下類似配置。
-keep class com. google. protobuf.** {*;}
如果有類是通過(guò)反射來(lái)使用的、應(yīng)用調(diào)用的方法來(lái)自Java原生接口(JNI)或應(yīng)用引用的類只來(lái)自AndroidManifest.xml文件時(shí),也需要用-keep指令,指定對(duì)相關(guān)的類不做混淆處理。如下代碼列出了APP中通常不需要混淆的一些內(nèi)容。
-keepattributes *Annotation* -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. view. View { public < init>( android. content. Context); public < init>( android. content. Context, android. util. AttributeSet); public < init>( android. content. Context, android. util. AttributeSet, int); public void set*(...);
} -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. content. Context { public void *(android. view. View); public void *(android. view. MenuItem); } -keepclassmembers class * implements android. os. Parcelable { static ** CREATOR; } -keepclassmembers class **.R$* { public static < fields>; }
-keepclassmembers class * { @ android. webkit. JavascriptInterface < methods>; }
好了,APP開(kāi)發(fā)公司本文關(guān)于“安卓APP項(xiàng)目開(kāi)發(fā)關(guān)于ProGuard指令介紹”以及解決方法就分享到這里,謝謝關(guān)注,博納網(wǎng)絡(luò)編輯整理。