美文网首页
使用proguard混淆android代码

使用proguard混淆android代码

作者: AndWang | 来源:发表于2016-03-16 16:58 被阅读0次

因为项目源码安全需要,最近研究了下proguard混淆源码,在这里做一些分享。以下分享基于Android Studio。

如何启用Proguard

通常项目新建完成后,build.gradle文件中会有如下一段配置:

buildTypes {

debug {

minifyEnabledtrue

proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'

signingConfig signingConfigs.config

}

release {

minifyEnabledtrue

proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'

signingConfig signingConfigs.config

}

}

如上截图,将minifyEnabled设置为true,开启混淆代码,可以同时配置多个混淆文件。

配置中默认加入了sdk的混淆文件,proguard-android.txt

Proguard配置

百度了一些语法,方便以后查阅。


保留选项(配置不进行处理的内容)

-keep {Modifier} {class_specification} 保护指定的类文件和类的成员

-keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好

-keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。

-keepnames {class_specification} 保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)

-keepclassmembernames {class_specification} 保护指定的类的成员的名称(如果他们不会压缩步骤中删除)

-keepclasseswithmembernames {class_specification} 保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)

-printseeds {filename} 列出类和类的成员-keep选项的清单,标准输出到给定的文件

压缩

-dontshrink 不压缩输入的类文件

-printusage {filename}

-whyareyoukeeping {class_specification}

优化

-dontoptimize 不优化输入的类文件

-assumenosideeffects {class_specification} 优化时假设指定的方法,没有任何副作用

-allowaccessmodification 优化时允许访问并修改有修饰符的类和类的成员

混淆

-dontobfuscate 不混淆输入的类文件

-obfuscationdictionary {filename} 使用给定文件中的关键字作为要混淆方法的名称

-overloadaggressively 混淆时应用侵入式重载

-useuniqueclassmembernames 确定统一的混淆类的成员名称来增加混淆

-flattenpackagehierarchy {package_name} 重新包装所有重命名的包并放在给定的单一包中

-repackageclass {package_name} 重新包装所有重命名的类文件中放在给定的单一包中

-dontusemixedcaseclassnames 混淆时不会产生形形色色的类名

-keepattributes {attribute_name,…} 保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.

-renamesourcefileattribute {string} 设置源文件中给定的字符串常量

后面的文件名,类名,或者包名等可以使用占位符代替

?表示一个字符

可以匹配多个字符,但是如果是一个类,不会匹配其前面的包名

** 可以匹配多个字符,会匹配前面的包名。


在android中在android Manifest文件中的activity,service,provider, receviter,等都不能进行混淆。一些在xml中配置的view也不能进行混淆,android提供的默认配置中都有。(未知原因)

Proguard输出文件

混淆之后,会给我们输出一些文件,在build/outputs/mapping/debug目录下。


分别有以下文件:

dump.txt 描述apk文件中所有类文件间的内部结构。

mapping.txt 列出了原始的类,方法,和字段名与混淆后代码之间的映射。

seeds.txt 列出了未被混淆的类和成员

usage.txt 列出了从apk中删除的代码


Proguard案例文件


# This is a configuration file for ProGuard.

# http://proguard.sourceforge.net/index.html#manual/usage.html

-dontusemixedcaseclassnames

-dontskipnonpubliclibraryclasses

-verbose

-dontoptimize

-dontpreverify

-keepattributesSignature

-keepattributes*Annotation*

-keepclass sun.misc.Unsafe { *; }

-keepclass com.eastelsoft.zk.bean.** { *; }

-keepclass * implements org.coreframe.ui.I_KJActivity { *; }

-dontwarncom.igexin.**

-keepclass com.igexin.**{*;}

-keepclass com.baidu.**{*;}

-keepclass vi.com.gdi.bgl.**{*;}

-keepclassmembersclass * {

public (org.json.JSONObject);

}

-keepclass com.umeng.**

-keeppublic class com.idea.fifaalarmclock.app.R$*{

public static final int *;

}

-keeppublic class com.umeng.fb.ui.ThreadView {

}

-dontwarncom.umeng.**

-dontwarnorg.apache.commons.**

-keeppublic class * extends com.umeng.**

-keepclass com.umeng.** {*; }

-keepclasseswithmembernamesclass * {

native ;

}

-keepclassmemberspublic class * extends android.view.View {

void set*(***);

*** get*();

}

-keepclassmembersclass * extends android.app.Activity {

public void *(android.view.View);

}

-keepclassmembersenum * {

public static **[] values();

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

}

-keepclass * implements android.os.Parcelable {

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

}

-keepclassmembersclass **.R$* {

public static ;

}

-dontwarnandroid.support.**

配置过程中遇到的坑

1.项目中使用了许多第三方库,如百度地图,友盟,Gson等包,需要根据官方上的说明进行分别配置,

e.g. 百度地图

-keepclass com.baidu.**{*;}

-keepclass vi.com.gdi.bgl.**{*;}

2. 第一次配置完后,软件跑起来各种问题,后面发现全是gson解析失败,所以对model进行了keep操作,也没找到更好的方法。

-keepclass com.eastelsoft.zk.bean.** { *; }

3.项目中如果用了反射,需要额外配置一些.

-keepattributesSignature

-keepattributes*Annotation*

-keepclass * implements org.coreframe.ui.I_KJActivity { *; }

这里对接口进行了keep操作。

当你用了proguard配置后如果出现问题,要一步一步去分析,如果发现按钮不能点击的问题, 就尝试看看activity中的代码是否出现问题,先keep一些类,逐步调试,最后解决问题。

相关文章

  • 缩减apk的体积

    1.使用Progruard Proguard是Android很早就使用的代码混淆工具,除了用于混淆代码提高安全性以...

  • Android中的代码混淆

    混淆规则 因为Android是使用Java开发的,所以开发者可以使用ProGuard对代码进行混淆。SDK已经集成...

  • 使用proguard混淆android代码

    当前是有些工具比如apktool,dextojar等是可以对我们android安装包进行反编译,获得源码的。为了减...

  • 使用proguard混淆android代码

    因为项目源码安全需要,最近研究了下proguard混淆源码,在这里做一些分享。以下分享基于Android Stud...

  • 使用proguard混淆android代码

    当前是有些工具比如apktool,dextojar等是可以对我们android安装包进行反编译,获得源码的。为了减...

  • Android Proguard 代码混淆

    Proguard是Android很早就使用的代码混淆工具,除了用于混淆代码提高安全性以外,他在代码编译的时候也会通...

  • Android代码混淆实战

    什么是代码混淆:     Android SDK 自带了混淆工具Proguard。它位于SDK根目录\tools\...

  • 你混淆Android代码多吗?

    ProGuard是一个开源的Java代码混淆器。它可以混淆Android项目里面的java代码,但是不能混淆资源,...

  • Android Apache HTTP 客户端

    Android 目录工程各文件的说明proguard-rules.pro 代码混淆Android studio写在...

  • Android代码混淆——Proguard

    一、概述 ProGuard 会检测和移除封装应用中未使用的类、字段、方法和属性,包括自带代码库中的未使用项(这使其...

网友评论

      本文标题:使用proguard混淆android代码

      本文链接:https://www.haomeiwen.com/subject/oawqlttx.html