proguard

proguard 原理

夙愿已清 提交于 2020-02-22 13:56:25
from:http://www.eoeandroid.com/thread-209210-1-1.html proguard 原理 Java代码编译成二进制class 文件,这个class 文件也可以反编译成源代码 ,除了注释外,原来的code 基本都可以看到。为了防止重要code 被泄露,我们往往需要混淆(Obfuscation code , 也就是把方法,字段,包和类这些java 元素的名称改成无意义的名称,这样代码结构没有变化,还可以运行,但是想弄懂代码的架构却很难。 proguard 就是这样的混淆工具,它可以分析一组class 的结构,根据用户的配置,然后把这些class 文件的可以混淆java 元素名混淆掉。在分析class 的同时,他还有其他两个功能,删除无效代码(Shrinking 收缩),和代码进行优化 (Optimization Options)。 缺省情况下,proguard 会混淆所有代码,但是下面几种情况是不能改变java 元素的名称,否则就会这样就会导致程序出错。 一, 我们用到反射的地方。 二, 我们代码依赖于系统的接口,比如被系统代码调用的回调方法,这种情况最复杂。 三, 是我们的java 元素名称是在配置文件中配置好的。 所以使用proguard时,我们需要有个配置文件告诉proguard 那些java 元素是不能混淆的。 proguard 配置

使用proguard混淆android代码

拈花ヽ惹草 提交于 2020-02-22 13:55:49
当前是有些工具比方apktool,dextojar等是能够对我们android安装包进行反编译,获得源代码的。为了降低被别人破解,导致源代码泄露,程序被别人盗代替码,等等。我们须要对代码进行混淆,android的sdk中为我们提供了ProGrard这个工具,能够对代码进行混淆(通常是用无意义的名字来重命名),以及去除没有使用到的代码,对程序进行优化和压缩,这样能够添加�你想的难度。近期我做的项目,是我去配置的混淆配置,因此研究了一下,这里分享一下。 怎样启用ProGuard ant项目和eclipse项目启用方法 在项目的 project.properties 文件里加入�一下代码 proguard.config=proguard.cfg //proguard.cfg为proguard的配置文件 proguard.config=/path/to/proguard.cfg //路径不在项目根文件夹时,填写实际路径 填写这句配置后,在 release 打包时就会依照我们的配置进行混淆,注意,在我们平时的debug时是不会进行混淆的。 Gradle项目(以及Android Studio) 在build.gradle中进行配置 android { buildTypes { release { runProguard true proguardFiles

转:ProGuard 常见命令备份

自古美人都是妖i 提交于 2020-02-22 13:54:37
转: https://my.oschina.net/sunyh/blog/30359 #-dontshrink #不压缩,减少jar的大小一般都压缩掉,为了增加反编译的难度也可以不压缩 #-dontobfuscate #不混淆输入的类文件 这个是默认不混淆的,所以需要注释 #-dontusemixedcaseclassnames #混淆时不会产生形形色色的类名,没有发现啥作用 -overloadaggressively #混淆时应用侵入式重载 名字都变的很长了 需要 #-useuniqueclassmembernames #把混淆类中的方法名也混淆了,keep类中一些不需要keep的类的方法名也混淆了,需要 -allowaccessmodification #优化时允许访问并修改有修饰符的类和类的成员, 混淆后的类名还会改变地方,到其他包中 需要,所有被混淆的都到一个包去,不需要保留原来的结构 -repackageclasses#混淆的类 重新到另外一个包 需要混淆才能出现abc之类名字的类 ProGuard的使用是为了: 1.创建紧凑的代码文档是为了更快的网络传输,快速装载和更小的内存占用. 2.创建的程序和程序库很难使用反向工程. 3.所以它能删除来自源文件中的没有调用的代码 4.充分利用java6的快速加载的优点来提前检测和返回java6中存在的类文件. 参数:

Android Proguard

主宰稳场 提交于 2020-02-22 13:53:44
Android Proguard 14 May 2015 语法 -include {filename} 从给定的文件中读取配置参数 -basedirectory {directoryname} 指定基础目录为以后相对的档案名称 -injars {class_path} 指定要处理的应用程序jar,war,ear和目录 -outjars {class_path} 指定处理完后要输出的jar,war,ear和目录的名称 -libraryjars {classpath} 指定要处理的应用程序jar,war,ear和目录所需要的程序库文件 -dontskipnonpubliclibraryclasses 指定不去忽略非公共的库类。 -dontskipnonpubliclibraryclassmembers 指定不去忽略包可见的库类的成员。 保留选项 -keep {Modifier} {class_specification} 保护指定的类文件和类的成员 -keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好 -keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。 -keepnames

趣拍proguard配置

浪子不回头ぞ 提交于 2020-02-22 13:53:04
   # Add project specific ProGuard rules here.# By default, the flags in this file are appended to flags specified# in E:\android\sdk/tools/proguard/proguard-android.txt# You can edit the include path and order by changing the proguardFiles# directive in build.gradle.## 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

Proguard.cfg 配置

瘦欲@ 提交于 2020-02-22 13:52:08
-optimizationpasses 5 //代码混淆压缩比 默认为5 一般不需要改 -dontusemixedcaseclassnames //混淆后的类名为小写 如public class a -dontskipnonpubliclibraryclasses //混淆第三方 库 加上此句后 可再后面配置某些库不混淆 -dontpreverify // 混淆前认证,可去掉加快混淆速度 -verbose //混淆的log 帮助排错 -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* //代码混淆采用的算法,一般不改变,用谷歌推荐算即可 -keepattributes *Annotation* 假如项目中有用到注解 应用加入 引用外部的jar包 如果不是自己写的 最好不混淆它们,因为外部jar包有可能已经混淆过,根据实际情况来 不混淆某些外部jar 保持外部jar包不变的方法-dontwarn android.support.v4.** //执行下面一行代码如果有警告也不用中止,因为此jar不是我们自己写的,有警告也不处理,故dontwarn-keep class android.support.v4.** //项目中用到此jar包,在打包时必须不混淆

Android混淆打包

送分小仙女□ 提交于 2020-02-22 13:37:44
一、为什么要混淆 为了避免apk在发布后被用户通过反编译拿到源代码和资源文件,然后修改资源和代码之后就变成一个新的apk。而经过混淆后的APK,即使被反编译,也难以阅读,注意混淆不是让apk不能阅读,而是加大阅读的难度,为了避免劳动成果被窃取,也避免出现安全漏洞和隐患,所以在apk发布之前一定要进行混淆。 二、混淆的原理 Java是一种跨平台、解释型语言,Java源代码编译成的class文件中有大量包含语义的变量名、方法名的信息,很容易被反编译为Java源代码。为了防止这种现象,我们可以对Java字节码进行混淆。混淆不仅能将代码中的类名、字段、方法名变为无意义的名称,保护代码,也由于移除无用的类、方法,并使用简短名称对类、字段、方法进行重命名缩小了程序的大小。 ProGuard由shrink、optimize、obfuscate和preverify四个步骤组成,每个步骤都是可选的,需要哪些步骤都可以在脚本中配置。参见ProGuard官方介绍。   压缩(Shrink):默认开启,侦测并移除代码中无用的类、字段、方法和特性,减少应用体积,并且会在优化动作执行之后再次执行(因为优化后可能会再次暴露一些未使用的类和成员)。     -dontshrink 关闭混淆   优化(Optimize):默认开启,分析和优化字节码,让应用运行的更快。     -dontoptimize 关闭优化

ProGuard代码混淆技术详解

本小妞迷上赌 提交于 2020-02-22 13:32:23
前言 受《APP研发录》启发,里面讲到一名Android程序员,在工作一段时间后,会感觉到迷茫,想进阶的话接下去是看Android系统源码呢,还是每天继续做应用,毕竟每天都是画UI和利用MobileAPI处理Json还是蛮无聊的,做着重复的事情,没有技术的上提升空间的。所以,根据里面提到的Android应用开发人员所需要精通的20个技术点,写篇文章进行总结,一方面是梳理下基础知识和巩固知识,另一方面也是弥补自我不足之处。 那么,今天就来讲讲ProGuard代码混淆的相关技术知识点。 内容目录 ProGuard简介 ProGuard工作原理 如何编写一个ProGuard文件 其他注意事项 小结 ProGuard简介 因为Java代码是非常容易反编码的,况且Android开发的应用程序是用Java代码写的,为了很好的保护Java源代码,我们需要对编译好后的class文件进行混淆。 ProGuard是一个混淆代码的开源项目,它的主要作用是混淆代码,殊不知ProGuard还包括以下4个功能。 压缩(Shrink):检测并移除代码中无用的类、字段、方法和特性(Attribute)。 优化(Optimize):对字节码进行优化,移除无用的指令。 混淆(Obfuscate):使用a,b,c,d这样简短而无意义的名称,对类、字段和方法进行重命名。 预检(Preveirfy)

ProGuard详解

◇◆丶佛笑我妖孽 提交于 2020-02-22 13:29:59
ProGuard工作原理简介   ProGuard能够对Java类中的代码进行压缩(Shrink),优化(Optimize),混淆(Obfuscate),预检(Preveirfy)。   1. 压缩(Shrink):在压缩处理这一步中,用于检测和删除没有使用的类,字段,方法和属性。   2. 优化(Optimize):在优化处理这一步中,对字节码进行优化,并且移除无用指令。   3. 混淆(Obfuscate):在混淆处理这一步中,使用a,b,c等无意义的名称,对类,字段和方法进行重命名。   4. 预检(Preveirfy):在预检这一步中,主要是在Java平台上对处理后的代码进行预检。   对于ProGuard执行流程图如下图所示。      对于ProGuard的原理更详细的介绍可以参考 Proguard手册 ,在这里就不在进行更详细的介绍。 ProGuard使用   ProGuard已集成到Android构建系统中,所以我们不用手动调用这个工具。我们可以选择在只发布模式下构建系统的时候再去运行ProGuard。   在AndroidStudio中我们需要将Proguard添加到gradle.build文件的构建类型当中。不过在我们创建一个Android工程的时候,系统已经自动为我们添加到了gradle.build中。 buildTypes { release {

Obfuscate android.support.v7.widget.GridLayout issue

孤人 提交于 2020-02-14 12:20:00
问题 I'm trying to obfuscate my android application, where I use android.support.v7.appcompat and android.support.v7.GridLayout, but the app is crashing with the following exception: android.view.InflateException: Binary XML file line #2: Error inflating class android.support.v7.widget.GridLayout at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:698) at android.view.LayoutInflater.inflate(LayoutInflater.java:466) at android.view.LayoutInflater.inflate(LayoutInflater.java:396) at