Android代码混淆

Android代码混淆

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

 混淆器(ProGuard)

混淆器通过删除从未用过的代码和使用晦涩名字重命名类、字段和方法,对代码进行压缩,优化和混淆。结果是一个比較小的.apk文件,该文件比較难进行逆向project。因此,当你的应用程序对安全敏感(要求高),比如当你授权应用程序的时候,混淆器是一种重要的保护手段。    

混淆器被集成在android 构建系统中,所以你不必手动调用它。同一时候混淆器仅在公布模式下进行构建应用程序的时候才会执行起来,所以在调试模式下构建程序时,你不必处理混淆代码。让混淆器执行起来是可选择的,可是推荐选上。

Android项目中的混淆很easy,之所以写这篇总结是由于近期发现公司的代码居然没有混淆,反编译后代码随手可得。很震惊。

1. 改动project.properties


“`xml


    # 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 edit


    # “ant.properties”, and override values to adapt the script to your


    # project structure.


    #


    # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):


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

    # Project target.


    target=android-19


“`


    将proguard.config前面的凝视去掉

2. 改动proguard-project.txt


“`xml


    # To enable ProGuard in your project, edit project.properties


    # to define the proguard.config property as described in that file.


    #


    # Add project specific ProGuard rules here.


    # By default, the flags in this file are appended to flags specified


    # in ${sdk.dir}/tools/proguard/proguard-android.txt


    # You can edit the include path and order by changing the ProGuard


    # include property in project.properties.


    #


    # For more details, see


    #   http://developer.android.com/guide/developing/tools/proguard.html

    # Add any project specific keep options here:

    # If your project uses WebView with JS, uncomment the following


    # and specify the fully qualified class name to the JavaScript interface


    # class:


    #-keepclassmembers class fqcn.of.javascript.interface.for.webview {


    #   public *;


    #}


“`


    假设在程序中使用了第三方的`jar`包,在混淆后导致出错,这时我们须要在proguard-project.txt中去进行对应的配置,来让其在混淆时不要混淆对应的jar包。对改配置文件里的相关配置解释例如以下:


“`java


    -keep public class * extends android.app.Activity  【不进行混淆类名的类,保持其原类名和包名】

    -keep public abstract interface com.asqw.android.Listener{


    public protected <methods>;  【全部public protected的方法名不进行混淆】


    }


    -keep public class com.asqw.android{


    public void Start(java.lang.String); 【对该方法不进行混淆】


    }


    -keepclasseswithmembernames class * { 【对全部类的native方法名不进行混淆】


    native <methods>;


    }


    -keepclasseswithmembers class * { 【对全部类的指定方法的方法名不进行混淆】


    public <init>(android.content.Context, android.util.AttributeSet);


    }


    -keepclassmembers class * extends android.app.Activity {【对全部类的指定方法的方法名不进行混淆】


    public void *(android.view.View);


    }


    -keepclassmembers enum * {【对枚举类型enum的全部类的下面指定方法的方法名不进行混淆】


    public static **[] values();


    public static ** valueOf(java.lang.String);


    }


    -keep class * implements android.os.Parcelable {【对实现了Parcelable接口的全部类的类名不进行混淆,对其成员变量为Parcelable$Creator类型的成员变量的变量名不进行混淆】


    public static final android.os.Parcelable$Creator *;


    }


    -keepclasseswithmembers class org.jboss.netty.util.internal.LinkedTransferQueue {【对指定类的指定变量的变量名不进行混淆】


        volatile transient org.jboss.netty.util.internal.LinkedTransferQueue$Node head;


        volatile transient org.jboss.netty.util.internal.LinkedTransferQueue$Node tail;


        volatile transient int sweepVotes;

    }


    -keep public class com.unionpay.** {*; }【对com.unionpay包下全部的类都不进行混淆,即不混淆类名,也不混淆方法名和变量名】


“`
        

经过上面这两部之后反编译后就能混淆了,可是四大组件还在,为什么四大组件还在呢,由于四大组件是在清单文件里进行配置的,假设混淆后就不能依据清单文件的配置去寻找了。     

假设对于一些自己的代码中要想提供出来让别人通过反射调用的方法时,我们不想让部分代码被混淆,或者是我们使用别人提供的第三方jar包,由于第三方的jar包一般都是已经混淆过的,我们要是再混淆就会报错了,所以我们要保证这些内容不用混淆,这里我们仅仅需改动这个文件,然后加上后面的一句话,他就不会混淆我们给出的内容    


“`xml


-keepattributes *Annotation*          


-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.BackupAgent


-keep public class * extends android.preference.Preference


-keep public class * extends android.support.v4.app.Fragment


-keep public class * extends android.app.Fragment


-keep public class com.android.vending.licensing.ILicensingService


-keep class com.itheima.mobilesafe.engine.AppInfoProvider


-keep class net.youmi.android.** {


*;


}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/118894.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 利用IAR Timeline工具测试delay函数执行时间

    利用IAR Timeline工具测试delay函数执行时间”要把大象放冰箱,总共分几步”,呵呵,写到本篇博客的时候突然想起小品宋丹丹说的那句经典台词了(俺们东北人儿对本山大叔的作品真是滚瓜烂熟了,搞的舍友还时不时跟我学上一学),哈哈,所以就索性给题目也加上了“几步”的说法,把复杂的事情简单化,也起到吸引人眼球的作用(当然本篇也是有实料的,进来的不会让你失望的,呵呵)。咳咳,至于到底是几步,是不是传说中的“三步”来,哈哈,那还得下面分解。。。  

  • Matlab中axis函数使用

    Matlab中axis函数使用目录一.语法1.输入参数2.输出参数二.说明三.示例1.设置坐标轴范围2.使用半自动坐标轴范围3.设置多个坐标轴的坐标轴范围4.显示绘图而不显示坐标区背景5.使用紧凑的坐标轴范围并返回值6.更改坐标系的方向7.添加新绘图时保留当前的坐标轴范围axis函数是设置坐标轴范围和纵横比。一.语法axis(limits)axisstyleaxismodeaxisydirectionaxisvisibility

  • Python学习笔记(15)-Python代码转换为exe可执行程序详解

    Python学习笔记(15)-Python代码转换为exe可执行程序详解一,简介Python写完程序,要靠命令执行那么行,太低调了,还不华丽了。再说别人的电脑,都没有Python库,怎么执行,还能不能愉快的一起玩耍了。所以哪怕只会写一个HelloWorld,也要弄成exe程序,方便伟大的代码传播事业。其实很简单,有一个现成的pyInstaller工具,直接用就是了。二,pyInstaller安装配置1,打开网址:pyInstalller下载网址如图:因为我的Pyth

  • Swiper实现全屏视觉差轮播

    Swiper实现全屏视觉差轮播

  • java有序map[通俗易懂]

    java有序map[通俗易懂]我们知道TreeMap的key是有顺序的,是自然顺序,也可以指定比较函数。但TreeMap默认不是按插入的顺序。为了让Map按照插入顺序显示,可以使用LinkedHashMap吧。它内部有一个链表,保持插入的顺序。迭代的时候,也是按照插入顺序迭代,而且迭代比HashMap快。转载于:https://www.cnblogs.com/lixiaoran/p/6780898.html…

  • Spring Boot 中使用@KafkaListener并发批量接收消息[通俗易懂]

    Spring Boot 中使用@KafkaListener并发批量接收消息[通俗易懂]kakfa是我们在项目开发中经常使用的消息中间件。由于它的写性能非常高,因此,经常会碰到Kafka消息队列拥堵的情况。碰到这种情况时,有不能直接清理整改消息队列,因为还有别的服务正在使用该队列。因此只能额外启动一个相同名称的consumer-group来加快消息消费(经测试,如果该topic只有一个分区,实际上再启动一个新的消费者作用不到)。具体代码在这里,欢迎加星号,fork。官方文档……

    2022年10月15日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号