生活随笔
收集整理的這篇文章主要介紹了
android打包apk时混淆遇到的问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
android打包apk的時候一般會選擇混淆,而在eclipse中常使用的是proguard來混淆。有很多時候引用了第三方包的時候會導致打包不成功,或者打包成功不能運行的情況。
? ? ? ? ? ? ? ? 首先看看正常的proguard.cfg文件里面可以怎么寫:
簡單的android系統,沒有第三方包
[html]?view plaincopyprint?
-injars??????bin/classes?? -outjars?????bin/classes-processed.jar?? -libraryjars?/usr/local/java/android-sdk/platforms/android-9/android.jar?? ?? -dontpreverify?? -repackageclasses?''?? -allowaccessmodification?? -optimizations?!code/simplification/arithmetic?? ?? -keep?public?class?mypackage.MyActivity??
完整的android系統
[html]?view plaincopyprint?
-injars?bin/classes?? -injars?libs?? -outjars?bin/classes-processed.jar?? -libraryjars?/usr/local/java/android-sdk/platforms/android-9/android.jar?? -dontpreverify?? -repackageclasses?''?? -allowaccessmodification?? -optimizations?!code/simplification/arithmetic?? -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?android.os.Parcelable$Creator?CREATOR;}?? -keepclassmembers?class?**.R$*?{?public?static?<fields>;}??
如果加了android.support包的話,那么要加上
[html]?view plaincopyprint?
-keep?class?android.support.**{*;}??
[html]?view plaincopyprint?
-dontwarn?android.support.**??
一勞永逸,免得打包的時候就報錯。加上keep就是 告訴proguard不用混淆這個包里面的類,如果不加這個,報錯會比較明顯,會報出support包的錯,其它的第三方的包最好也不要混淆,原樣就可以了。
還有一些是打包的時候不會出錯,但是在打成包之后安裝運行就不行了。這時候要注意觀察一下提示的信息,比如空指針異常,或者是反射的時候報錯,那么這個時候要注意了,是不是實體類被混淆了。導致找不到實體類無法get或者set,那么這個時候應該做的事情是阻止proguard對實體類的混淆,比如:
[html]?view plaincopyprint?
-keep?public?class?mypackage.MyBean?{?public?void?setMyProperty(int);?public?int?getMyProperty();}??
這樣的話實體類被保存下來了,就不會出現找不到的情況了,一般引用了json類的包或者orm類的包可能會有這樣的錯誤出現。
當有注解的時候
[html]?view plaincopyprint?
-keepattributes?Signature?? -keepattributes?*Annotation*??
別忘了加上這兩句,減少錯誤的發生。
如果還有一些不明的錯誤的話,可以試著更新一下proguard的版本,使用最新的版本。畢竟再成熟的系統也是有BUG的。好了,先總結這么多吧。晚安~!
總結
以上是生活随笔為你收集整理的android打包apk时混淆遇到的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。