• 代码混淆与反射的冲突


    声明:

    1.原文地址:http://blog.csdn.net/musicvs/article/details/7948627

    2.如有转载请复制原文地址,尊重原创作者


            反编译Android的代码,大部分人都知道了,防反编译的方法也大部分都知道了(尽管它不一定一直有效,但起码像我这种水平的人,没办法看到混淆之后的Java代码, 最可恶的是没有注释= =)。

            最近才发现,我的代码在很久之后设置了混淆,也在很久之前不知道什么时候不小心把代码混淆给弄没了(好吧,你可以去反编译我的项目了,我不介意,因为代码很烂,实在是烂)。

            于是,这两个又在搞混淆代码了,混淆代码的方法很简单:

            1.在项目下新建一个文件,命名为“proguard.cfg”,正常情况下包括以下内容:

    -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 enum * {
    
        public static **[] values();
    
        public static ** valueOf(java.lang.String);
    
    }
    
    -keep class * implements android.os.Parcelable {
    
      public static final android.os.Parcelable$Creator *;
    
    }

               2.然后编辑项目下的“project.properties”文件,在最后加上一句:proguard.config=proguard.cfg

              OK,大功告成,记住了,只有打包的时候代码才会混淆,直接运行项目然后去bin目录下找的那个apk包是不会混淆的。


             But,当代码混淆遇上Java反射时,一堆麻烦来了。

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

             是的,我们会发现,Java的反射再也找不到它想找的类,或者方法,或者属性了。
             是的,因为代码混淆的原因,原本的类名、方法名、属性名都改变了,而反射它还是按照原来的名字去反射,结果只能射出一个程序崩溃。

             解决的方法当然有~
             那就是,让和反射有关的那些代码或者类,不进行混淆,那就不会有上述的问题了~!

             再看看proguard.cfg文件,里面那么多代码,不可能没有用的,来,先随便整一句看看


    -keep public class * extends android.app.Activity



            很简单的,这句话的意思是,保留所有继承Activity的类,不进行混淆。来,马上举一反三:

    -keep public class com.mutou.test.HelloWorld


            这句更加简单了,保留HelloWorld,不进行混淆。

            注意了,所有的类必须指出完整的包路径(废话了,这个文件里又没有import语句,当然要完整路径了,不然它哪知道那个类在哪儿~)。

            不进行混淆的意思就是,当我们的android项目的代码被反编译工具反编译出来之后,代码看起来不会像天书一样,不会所有变量名、方法名都变成a、b、c、d什么的。

            又注意了,有一个比较纠结的地方,一定要小心,通过上面两种方式防止混淆的代码,并不代表,反编译之后和源码一模一样,它的类名什么的都和源码一样,但是变量名、方法名就不一定了,它也有可能是abcd什么的。这个我也不知道为嘛。总之,小心就是了。

            也正因为如此,在有反射的代码里(呐,别问我什么叫做反射啊,我只是要用的时候百度了一下,现在已经忘了具体用法了),不能通过以上两种方式来防止代码混淆。

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

            那,没有办法了吗?
            有啊~木了个头的,没有办法我就不来发帖了~~

            嘻嘻,看看:

    -keepclasseswithmembernames class com.kogame.god.thing.creature.**
    {
    *;
    }


            糟糕~这个有点复杂,别着急~
            先看看这个名字:keepclasseswithmembernames 顾名思义,就是保留类以及它的成员的名字。
            那花括号里面那个”*;”又是什么东西呢?它代表类里的所有成员(包括变量、方法)的名字都不会被混淆,都保留原汁原味的样子。

           于是,整段代码的意思就是,保留所有继承creature类的代码以及它的变量和方法,不进行混淆。

           如果没有听懂的,请移步(更简单明了详细而不复杂的文章):http://www.apkbus.com/android-57338-1-1.html




    • 本文为博主学习笔记,未经博主允许不得转载
    • 本文仅供交流学习,请勿用于非法途径
    • 本文仅是个人意见,如有想法,欢迎交流
  • 相关阅读:
    WEB测试用例(十五)
    WEB测试用例(十二)
    WEB测试用例(九)
    WEB测试用例(六)
    WEB测试用例(四)
    WEB测试用例(一)
    WEB测试方法(十一)
    WEB测试方法(十)
    Python 知识要点:对象的 init 和 del 方法
    Python 知识要点:类 和 对象
  • 原文地址:https://www.cnblogs.com/JianXu/p/5158422.html
Copyright © 2020-2023  润新知