关闭

通过注解完美解决混淆问题

标签: androidjava混淆注解
4078人阅读 评论(4) 收藏 举报
分类:

混淆是代码安全一个很有效的措施,防止代码在市场中裸奔,Android studio通过写proguard-rules.pro文件来混淆,mainfest中的类不混淆,四大组件和Application的子类和Framework层下所有的类默认不会进行混淆,对于四大组件是不可以混淆的,之前还有人和我争论过,manifest中需要的是配置完整路径,一旦混淆了,路径或者名称就变了,怎么还能找到?

第三方会提供防混淆代码,避免必要的包和类被混淆掉,但是对于一些日常开发中使用proguard-rules.pro文件来混淆会有一下弊端:

  • 灵活性差,需要绝对路径
  • 不便于扩展,每次都需要去proguard-rules.pro文件下配置
  • 冗余太多,比如一个包下面部分类不需要混淆,这就造成了一堆混淆代码

既然混淆文件中可以保留指定的注解,那何不使用注解来解决上面所述的一大堆问题呢?代码量很少,却很有用,如下:

/**
 * 可配置类,方法,属性,配置后,将不会被混淆
 * Created by apple on 2017/8/3.
 */

@Retention(RetentionPolicy.CLASS)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD})
public @interface KeepNotProguard {
}

proguard-rules.pro文件下需要如下配置:

-keep @com.zero.framework.annotation.KeepNotProguard class * {*;}
-keep class * {
    @com.zero.framework.annotation.KeepNotProguard <fields>;
}
-keepclassmembers class * {
    @com.zero.framework.annotation.KeepNotProguard <methods>;
}

gradle文件如下:

buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

默认的minifyEnabled是false,改为true才会进行混淆。

下面做一组对比,如下:

/**
 * Created by Zero on 2017/5/31.
 */

public class TestPresenter extends BasePresenter {

    private ITest iView;
    private int test = -1;

    @Override
    protected void initBaseData(Context context, Handler handler, BaseInterface iView, Intent intent) {
        if (iView!=null) {
            if (iView instanceof ITest) {
                this.iView = (ITest) iView;
            }
        }
    }

    @Override
    protected void handMsg(Message msg) {

    }

    public void commit(){

    }

    public void getCommit() {

    }
}

混淆

在需要使用的地方只需要一个注解就可以搞定,示例如下:

/**
 * Created by Zero on 2017/5/31.
 */

public class TestPresenter extends BasePresenter {

    @KeepNotProguard
    private ITest iView;
    private int test = -1;

    @Override
    @KeepNotProguard
    protected void initBaseData(Context context, Handler handler, BaseInterface iView, Intent intent) {
        if (iView!=null) {
            if (iView instanceof ITest) {
                this.iView = (ITest) iView;
            }
        }
    }

    @Override
    @KeepNotProguard
    protected void handMsg(Message msg) {

    }

    public void commit(){

    }

    public void getCommit() {

    }
}

未混淆

PS:以上只是一个示例,在类上加了@KeepNotProguard整个类便不会被混淆。

对于反编译没了解的,可以通过Android逆向分析之反编译 Android逆向分析之从Smali到java 获取,博客中附上反编译工具下载地址。

项目已上传,戳此进入github。

微信扫我^_^

这里写图片描述

0
2
查看评论

android那些事--混淆语法

初步了解手动混淆配置的规则手动添加的配置,一般以”-keep”开头,常用的配置命令分别示例如下: 假设android工程中有一个接口和一个类:package com.ticktick.example;public interface TestInterface { public void ...
  • lucky9322
  • lucky9322
  • 2016-10-22 23:11
  • 2030

Android代码混淆之混淆规则

因为Android是使用Java开发的,所以开发者可以使用ProGuard对代码进行混淆。SDK已经集成了ProGuard工具,开发者可以从SDK目录下的\tools\proguard目录中进行查看。         ProGuard是一个免费的Java类文件...
  • fengyuzhengfan
  • fengyuzhengfan
  • 2015-02-18 14:51
  • 36618

不混淆注解

在proguard-project.txt文件中,配置: -keepattributes Signature # The "Signature" attribute is required to be able to access generic types whencomp...
  • yhtppp
  • yhtppp
  • 2015-03-04 14:26
  • 788

android混淆排除所有注解类(android annotation proguard config)

###排除所有注解类 -keep class * extends java.lang.annotation.Annotation { *; } -keep interface * extends java.lang.annotation.Annotation { *; } ###保留使...
  • cfh0081
  • cfh0081
  • 2015-03-06 11:22
  • 2966

Android 利用java的注解方法快速keep住混淆实践操作

先上一遍混淆说明文章,里面对混淆的方法说的很详细了(点我戳我),本遍思路来源于这遍文章的最底部@Keep,          所以这里不吹详细理论,只讲操作,也当是自己的笔记吧。(本次操作于Android studio)    ...
  • a807891033
  • a807891033
  • 2017-05-24 15:19
  • 711

Android 代码混淆心得!

原创地址:http://blog.csdn.net/tl792814781/article/details/51447255 原创作者:迷途开发者的博客 代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理...
  • zuo8787
  • zuo8787
  • 2016-05-19 10:18
  • 12129

Android优雅的进行混淆——使用@Keep注解 重要

http://www.jianshu.com/p/be7ec1819d2f http://www.jianshu.com/p/be7ec1819d2f http://www.jianshu.com/p/be7ec1819d2f http://www.jianshu.com/p/be...
  • u011904605
  • u011904605
  • 2017-12-06 22:30
  • 99

[组合数学]关于一类棋盘的完美覆盖问题

这篇文章主要讲不规则和规则棋盘能否被1*2骨牌完美覆盖的问题 今天学了一点新的姿势,本人蒟蒻,神犇们看完不要D我先来看一个经典的问题:8*8的棋盘是否能被1*2的骨牌覆盖? 答案是肯定的,我们只要随便摆一下就能够知道了。那么去掉左上角和右上角的两个格子,还会有肯定的答案吗? 答案是否定的,不存在的。...
  • qq_15412011
  • qq_15412011
  • 2017-04-09 22:34
  • 384

什么是WebGL?

:点上面关注免费学习前端知识!WebGL(全写 Web Graphics Library )是一种 3D 绘图标准,这种绘图技术标准允许把 JavaScript 和 OpenGL ES 2.0 结合在一起,通过增加 OpenGL ES 2.0 的一个 JavaScript 绑定, WebGL 可以为...
  • gtLBTNq9mr3
  • gtLBTNq9mr3
  • 2017-12-17 00:00
  • 47

使用注解改进代码检查

使用注解改进代码检查 本文内容 向您的项目添加注解 添加支持注解库依赖项运行代码检查 Nullness 注解 Nullability 分析 资源注解线程注解值约束注解权限注解 间接权限 返回值注解CallSuper 注解Typedef 注解 ...
  • qianxiangsen
  • qianxiangsen
  • 2017-07-06 14:57
  • 273
    个人资料
    • 访问:263215次
    • 积分:2992
    • 等级:
    • 排名:第13893名
    • 原创:46篇
    • 转载:0篇
    • 译文:0篇
    • 评论:329条
    QQ交流群

    Android路上

    611566797
    博客专栏
    我的公众号