Android--混淆打包找不到資源類的問題
阿新 • • 發佈:2019-01-26
原文地址 :http://blog.sina.com.cn/s/blog_7bac470701014jp3.html
android打包apk的時候一般都會混淆,而在eclipse中常使用的是proguard來混淆。有很多時候引用了第三方包的時候會導致打包不成功,或者打包成功不能執行的情況。
首先看看正常的proguard.cfg檔案裡面可以怎麼寫:
簡單的android系統,沒有第三方包
- -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系統
- -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 <</span>init>(android.content.Context);
- public <</span>init>(android.content.Context, android.util.AttributeSet);
- public <</span>init>(android.content.Context, android.util.AttributeSet, int);
- public void set*(...);}
- -keepclasseswithmembers class * {
- public <</span>init>(android.content.Context, android.util.AttributeSet);}
- -keepclasseswithmembers class * {
- public <</span>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 <</span>fields>;}
如果加了android.support包的話,那麼要加上
- -keep class android.support.**{*;}
- -dontwarn android.support.**
一勞永逸,免得打包的時候就報錯。加上keep就是 告訴proguard不用混淆這個包裡面的類,如果不加這個,報錯會比較明顯,會報出support包的錯,其它的第三方的包最好也不要混淆,原樣就可以了。
還有一些是打包的時候不會出錯,但是在打成包之後安裝執行就不行了。這時候要注意觀察一下提示的資訊,比如空指標異常,或者是反射的時候報錯,那麼這個時候要注意了,是不是實體類被混淆了。導致找不到實體類無法get或者set,那麼這個時候應該做的事情是阻止proguard對實體類的混淆,比如:
- -keep public class mypackage.MyBean { public void setMyProperty(int); public int getMyProperty();}
這樣的話實體類被儲存下來了,就不會出現找不到的情況了,一般引用了json類的包或者orm類的包可能會有這樣的錯誤出現。
當有註解的時候
- -keepattributes Signature
- -keepattributes *Annotation*
別忘了加上這兩句,減少錯誤的發生。
如果還有一些不明的錯誤的話,可以試著更新一下proguard的版本,使用最新的版本。畢竟再成熟的系統也是有BUG的。