• ProGuard java代码进行混淆


          Java的字节码一般是非常容易反编译的。为了很好的保护Java源代码,我们往往会对编译好的class文件进行混淆处理。ProGuard的主要作用就是混淆。当然它还能对字节码进行缩减体积、优化等,但那些对于我们来说都算是次要的功能。


    一、Android Eclipse开发环境与ProGuard

           Android 2.3以前,混淆Android代码只能手动添proguard来实现代码混淆,非常不方便。而2.3以后,Google已经将这个工具加入到了SDK的工具集里。具体路径:SDK\tools\proguard当创建一个新的Android工程时,在工程目录的根路径下,会出现一个proguard的配置文件proguard.cfg也就是说,我们可以通过简单的配置,在我们的elipse工程中直接使用ProGuard混淆Android工程。

           具体混淆的步骤非常简单。首先,我们需要在 工程描述文件project.properties中,添加一句话,启用ProGuard。如下所示:

    ---------------------- cut here ------------------------

    # This file is automatically generated by Android Tools.
     # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
     #
     # This file must be checked in Version Control Systems.
     #
     # To customize properties used by the Ant build system use,
     # "build.properties", and override values to adapt the script to your
     # project structure.
     # Indicates whether an apk should be generated for each density.
     split.density=false
     # Project target.
     target=android-10
     proguard.config=proguard.cfg

    ------------------- cut here ----------------------

     这样,Proguard就可以使用了当你 用eclipse编译apk的时候Proguard就会自动启用,优化混淆你的代码


        编译apk成功后,你可以反编译看看混淆的效果。一些类名、方法名和变量名等,都变成了一些无意义的字母或者数字


    二、proguard.cfg配置 --此文件里 写的就是 指明 编译时不混淆的内容

           稍微深入想一下混淆后的结果,你就会发现,如果一些提供给外部的类、方法、变量等名字被改变了,那么程序本身的功能就无法正常实现。那么Proguard如何知道哪些东西是可以改名,而哪些是不能改变的呢?

           这个是proguard.cfg文件来进行配置的。Android的eclipse工程中默认自动生成的proguard.cfg文件,此文件 已经针对Android的一般情况进行了配置,我们打开这个配置文件。内容大概如下:

    ------------------------- cut here -----------------------

    -optimizationpasses 5
    -dontusemixedcaseclassnames
    -dontskipnonpubliclibraryclasses
    -dontpreverify
    -verbose
    -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

    -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.app.backup.BackupAgentHelper
    -keep public class * extends android.preference.Preference
    -keep public class com.android.vending.licensing.ILicensingService

    -keepclasseswithmembernames class * {
        native <methods>;
    }

    -keepclasseswithmembers class * {
        public <init>(android.content.Context, android.util.AttributeSet);
    }

    -keepclasseswithmembers class * {
        public <init>(android.content.Context, android.util.AttributeSet, int);
    }

    -keepclassmembers class * extends android.app.Activity {
       public void *(android.view.View);
    }

    -keepclassmembers enum * {
        public static **[] values();
        public static ** valueOf(java.lang.String);
    }

    -keep class * implements android.os.Parcelable {
      public static final android.os.Parcelable$Creator *;
    }

    ----------------------- cut here --------------------------

            它主要保留了继承自ActivityApplicationServiceBroadcastReceiverContentProviderBackupAgentHelperPreferenceILicensingService的子类。因为这些子类,都是可能被外部调用的。

    另外,它还保留了含有native方法的类、构造函数从xml构造的类(一般为View的子类)、枚举类型中的valuesvalueOf静态方法、继承Parcelable的跨进程数据类。

           在实际的一个工程项目中,可能Google自动生成的配置不能胜任我们的混淆工作。所以,我们往往需要自己编写一些ProGuard配置。


    三、proguard在Android 源码中的 几种使用方法:

     1.指定 不需要混淆的 native方法 与 变量 的proguard.flags文件

               如:LOCAL_PROGUARD_FLAG_FILES := proguard.flags

     

     2.指定编译的工程,不要使用代码混淆的工具进行代码混淆

              如:LOCAL_PROGUARD_ENABLED := disabled

       

     3.不设置,默认使用LOCAL_PROGUARD_ENABLED := full.即将该工程代码全部混淆


    源码下的proguard.flags文件的编写:创建一个文本文件,将其命名为proguard.flags,并将该文件放到与该模块的Android.mk相同的目录下;文件内容 参考 android源码 packages/apps/Launcher2/proguard.flags文件;

    Android的proguard源代码位于external/proguard下。









      






  • 相关阅读:
    自动生成接口文档
    Haystack全文搜索
    redis操作
    缓存及跨域问题
    url控制器、解析器、响应器、分页器
    频率组件
    序列化、认证、权限、视图回顾
    认证、权限、视图组件
    序列化组件
    Rest Framework
  • 原文地址:https://www.cnblogs.com/liulaolaiu/p/11744724.html
Copyright © 2020-2023  润新知