主要先简单的介绍三个主要文件,在sdk下的proguard里面:  我的SDK路径为H:\Android\android-sdk-windows\tools\proguard

    proguard-android.txt//系统配置好一些默认选项,考虑的比较详细,最好不要修改

    proguard-android-optimize.txt//系统配置好一些默认选项,考虑的比较详细,最好不要修改

    proguard-project.txt//加入一些保持,或者说不希望被混淆的包、类或者方法等

如何使用:

    每一个Eclipse项目生成都会生成两个文件,如果要混淆必须配置这两个:

        proguard-project.txt

        project.properties

        里面的英文介绍就不多少了,直接操作

        步骤一:打开project.properties

            #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-                project.txt

            去掉这一句前面的#,就相当于一个开关,告诉编译器,我要混淆.如果没有用到以下内容,就可以直接打包.系统会自动帮你混淆.但是大部分程序都用到了第三方包,所以我们的自己配置 proguard-project.txt这个文件.请看步骤二.

注意: 只有在生成release版本的apk时,混淆配置才会起作用,debug版本的apk不会进行混淆。

 需要自己配置的包括:

  • 只在 AndroidManifest.xml 引用的类
  • 从JNI调用的方法
  • 动态引用的字段和方法
  • 第三方包

            默认的proguard.cfg文件试图掩盖一般情况下,但你可能会遇到的异常,如ClassNotFoundException的,这发生在ProGuard的除掉整个类,你的应用程序调用。


        步骤二:配置proguard-project.txt,加入需要保持的.jar包和以上需要配置的内容

      

# Add any project specific keep options here:
             在这一句话下面,添加配置内容
             # If your project uses WebView with JS, uncomment the following             如果用到WebView with JS,打开一下五个#
             # and specify the fully qualified class name to the JavaScript interface
             # class:
             #-keepclassmembers class fqcn.of.javascript.interface.for.webview {             #   public *;
             #}

        步骤三:在步骤二中添加配置内容的地方,手动天骄配置,一般以"keep"开头.

添加第三方依赖包

                例如:添加android-support-v4.jar依赖包

    -libraryjars 

 

               
     libs/android-support-v4.jar 

 

               
     -dontwarn 

 

               
     android.support.v4.**{*;} 

 

               
     -keep  
 class  
 android.support.v4.**{*;} 

 
                 -keep interface android.support.v4.**{*;}

    不混淆某个类的子类,某个接口的实现

            例如:不混淆com.example.Test类的子类

        -keep public class * extends com.example.Test

例如:不混淆com.example.TestInterface的实现     


-keep  
 class  
 * implementscom.example.TestInterface { 

 

                   
  
 public  
 static  
 final  
 com.example.TestInterface$Creator *; 

 

                   
 }


不混淆某个类的特定的函数

     

-keepclassmembers class
 

                   
 com.example.Test { 

 

                   
  
 public  
 void  
 setTestString(java.lang.String); 

 

                   
 }

            不混淆某个包所有的类或指定的类

            例如,不混淆package com.example下的所有类/接口

               -keep class com.example.** { * ; }

                例如,不混淆com.example.Test类:

                -keep class com.example.Test { * ; }

                如果希望不混淆某个接口,则把上述命令中的class替换为interface即可。

            不混淆某个类的构造函数

例如:不混淆Test类的构造函数:

-keepclassmembers  
 class 

 

                 
 com.example.Test { 

 

                   
  
 public  
 <init>( 
 int 
 , 
 int 
 ); 

 

                 
 }


            


自己在混淆时遇到的问题解决方法(有点困了,就不多写了):


        1.尽量不要去混淆实体Modle


        2.用到反射的类和方法不要混淆


        3.可以运用反编译检查混淆结果,也可以发现问题


Android 混淆jar android 混淆 proteced_android