首页 > 代码库 > Android日志:代码混淆,使用说明

Android日志:代码混淆,使用说明

上一篇介绍了Google官方的一些解释,这一篇主要介绍如何实战(Eclipse开发)使用Googel提供的这个工具.如对代码混淆的概念不是很了解的建议先看上一篇--Android日志:代码混淆,官方文档介绍-----来自Google最新文档


主要先简单的介绍三个主要文件,在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.可以运用反编译检查混淆结果,也可以发现问题



本文出自 “blacktao” 博客,请务必保留此出处http://blacktao.blog.51cto.com/8456396/1580327

Android日志:代码混淆,使用说明