1. 程式人生 > >Android--混淆打包找不到資源類的問題

Android--混淆打包找不到資源類的問題

原文地址 :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的。