zoukankan      html  css  js  c++  java
  • Android混淆打包找不到资源类的…

        网上淘来的,收藏一下!
        android打包apk的时候一般都会混淆,而在eclipse中常使用的是proguard来混淆。有很多时候引用了第三方包的时候会导致打包不成功,或者打包成功不能运行的情况。


    首先看看正常的proguard.cfg文件里面可以怎么写:

    简单的android系统,没有第三方包

    1. -injars      bin/classes  
    2. -outjars     bin/classes-processed.jar  
    3. -libraryjars /usr/local/java/android-sdk/platforms/android-9/android.jar  
    4.   
    5. -dontpreverify  
    6. -repackageclasses ''  
    7. -allowaccessmodification  
    8. -optimizations !code/simplification/arithmetic  
    9.   
    10. -keep public class mypackage.MyActivity  

    完整的android系统

    1. -injars bin/classes  
    2. -injars libs  
    3. -outjars bin/classes-processed.jar  
    4. -libraryjars /usr/local/java/android-sdk/platforms/android-9/android.jar  
    5. -dontpreverify  
    6. -repackageclasses ''  
    7. -allowaccessmodification  
    8. -optimizations !code/simplification/arithmetic  
    9. -keepattributes *Annotation*  
    10. -keep public class * extends android.app.Activity  
    11. -keep public class * extends android.app.Application  
    12. -keep public class * extends android.app.Service  
    13. -keep public class * extends android.content.BroadcastReceiver  
    14. -keep public class * extends android.content.ContentProvider  
    15. -keep public class * extends android.view.View {   
    16. public <</span>init>(android.content.Context);   
    17. public <</span>init>(android.content.Context, android.util.AttributeSet);   
    18. public <</span>init>(android.content.Context, android.util.AttributeSet, int);   
    19. public void set*(...);}  
    20. -keepclasseswithmembers class * {   
    21. public <</span>init>(android.content.Context, android.util.AttributeSet);}  
    22. -keepclasseswithmembers class * {   
    23. public <</span>init>(android.content.Context, android.util.AttributeSet, int);}  
    24. -keepclassmembers class * extends android.content.Context {   
    25. public void *(android.view.View);   
    26. public void *(android.view.MenuItem);}  
    27. -keepclassmembers class * implements android.os.Parcelable {   
    28. static android.os.Parcelable$Creator CREATOR;}  
    29. -keepclassmembers class **.R$* { public static <</span>fields>;}  

    如果加了android.support包的话,那么要加上

    1. -keep class android.support.**{*;}  
    1. -dontwarn android.support.**  

    一劳永逸,免得打包的时候就报错。加上keep就是 告诉proguard不用混淆这个包里面的类,如果不加这个,报错会比较明显,会报出support包的错,其它的第三方的包最好也不要混淆,原样就可以了。

    还有一些是打包的时候不会出错,但是在打成包之后安装运行就不行了。这时候要注意观察一下提示的信息,比如空指针异常,或者是反射的时候报错,那么 这个时候要注意了,是不是实体类被混淆了。导致找不到实体类无法get或者set,那么这个时候应该做的事情是阻止proguard对实体类的混淆,比 如:

    1. -keep public class mypackage.MyBean { public void setMyProperty(int); public int getMyProperty();}  


    这样的话实体类被保存下来了,就不会出现找不到的情况了,一般引用了json类的包或者orm类的包可能会有这样的错误出现。

    当有注解的时候

    1. -keepattributes Signature  
    2. -keepattributes *Annotation*  
    别忘了加上这两句,减少错误的发生。

    如果还有一些不明的错误的话,可以试着更新一下proguard的版本,使用最新的版本。毕竟再成熟的系统也是有BUG的。

  • 相关阅读:
    MVC模式-----struts2框架(2)
    MVC模式-----struts2框架
    html的<h>标签
    jsp脚本元素
    LeetCode "Paint House"
    LeetCode "Longest Substring with At Most Two Distinct Characters"
    LeetCode "Graph Valid Tree"
    LeetCode "Shortest Word Distance"
    LeetCode "Verify Preorder Sequence in Binary Search Tree"
    LeetCode "Binary Tree Upside Down"
  • 原文地址:https://www.cnblogs.com/crane13/p/3150150.html
Copyright © 2011-2022 走看看