怎样用 proguard 不混淆方法混淆后的包替换源程序

你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
问题一??在proguard文件中加入以下keep,为什么给的Demo里却没有加??
-keep class com.easemob.** {*;}
-keep class org.jivesoftware.** {*;}
-keep class org.apache.** {*;}
com.easemob.**
#2.0.9后的不需要加下面这个keep
#-keep class org.xbill.DNS.** {*;}
#另外,demo中发送表情的时候使用到反射,需要keep SmileUtils,注意前面的包名,
#不要SmileUtils复制到自己的项目下keep的时候还是写的demo里的包名
-keep class com.easemob.chatuidemo.utils.SmileUtils {*;}
问题二??class后面整个改为自己的包名,还是拿部分??
#2.0.9后加入语音通话功能,如需使用此功能的api,加入以下keep
-dontwarn ch.imvs.**
-dontwarn org.slf4j.**
-keep class org.ice4j.** {*;}
-keep class net.java.sip.** {*;}
-keep class org.webrtc.voiceengine.** {*;}
-keep class org.bitlet.** {*;}
-keep class org.slf4j.** {*;}
-keep class ch.imvs.** {*;}
demo又不混淆,反射的那个写类的全路径
要回复问题请先或
发展中程序员
关注: 0 人
知识价值的认可,源自您的赞赏
扫描二维码,你的支付将由imGeek代收后转给对方
感谢您的赞赏
一个开放、互助、协作、创意的社区
一个开放、互助、协作、创意的社区创建日期: 14:47:05
原文:/view/31ca66d380ebcdd.html
地址&http://proguard.sourceforge.net/启动proguard&解压下载的proguard4.4beta3,解压后进入lib文件把proguard.jar拷贝到自己新建的文件夹里如图:&
把需要混淆的jar和jar所依赖的包也放到新建的文件夹,都放在一起,如下图。&
写一个配置文件,名称自己定,举个简单配置文件例子,内容如下,其中-injars:是你需要混淆的jar,-outjars:是你混淆后输出的jar,-libraryjars:是你混淆的jar需要所依赖的jar包,后面的不在一一说明,可以参考proguard文档,配置文件可以参考文档来对自己混淆的需求来写配置文件。&
-injars&TheFirstDesktopApplication1.jar
-outjars&TheFirstDesktopApplication1_out.jar
-libraryjars&&java.home&/lib/rt.jar
-libraryjars&appframework-1.0.3.jar
-libraryjars&swing-worker-1.1.jar
-printmapping&proguard.map
-overloadaggressively
-defaultpackage&''
-allowaccessmodification
-dontoptimize&
-keep&public&class&*
public&protected&*;
-keep&public&class&org.**
-keep&public&class&it.**
4.&把配置文件保存到你建的文件夹下,如下图。&
5.点击开始,运行,输入cmd,进入你建的文件夹下,如下图。&
6.&然后输入命令语句:java&-jar&proguard.Jar&@a&然后回车,如下图。&
7.&混淆成功,在产生TheFirstDesktopApplication1_out.jar如下图。&
混淆器后,利用反编译器对没TheFirstDesktopApplication1_out.jar反编译,多了好多a,b,c之类的类文件,对反编译的java文件是很难编译的,即说明混淆成功。&
混淆器原理功能&通常情况下,编译后的字节码仍然包含了大量的调试信息:源文件名,行号,字段名,方法名,参数名,变量名等等。这些信息使得它很容易被反编译和通过逆向工程获得完整的程序。例如像ProGuard这样的混淆器就能删除这些调试信息,并用无意义的字符序列来替换所有名字,使得它很难进行逆向工程,它进一步免费的精简代码。除了异常堆栈信息所需要的类名,方法名和行号外,程序只会保留功能上的等价。&
Navigation
李岩的个人博客,记录工作和生活总遇到的问题并付解决方法,也为大家提供方便。
评论最多的文章
访问最多的文章android源码使用proguard混淆编译及错误总结
关于混淆编译也主要是从网上学习的,决定对网上的进行总结,供大家一起学习,研究,东西主要都是网友们写的,我这里借鉴了,文章最后是网友的原文地址;
1,什么是混淆编译
ProGuard是一个免费的java类文件压缩,优化,混淆器.它探测并删除没有使用的类,字段,方法和属性.它删除没有用的说明并使用字节码得到最大优化.它使用无意义的名字来重命名类,字段和方法.
ProGuard的使用是为了:
1.创建紧凑的代码文档是为了更快的网络传输,快速装载和更小的内存占用.
2.创建的程序和程序库很难使用反向工程.
3.所以它能删除来自源文件中的没有调用的代码
4.充分利用java6的快速加载的优点来提前检测和返回java6中存在的类文件.
ProGuard支持那些种类的优化:
除了在压缩操作删除的无用类,字段和方法外,ProGuard也能在字节码级提供性能优化,内部方法有:
1 常量表达式求值
2 删除不必要的字段存取
3 删除不必要的方法调用
4 删除不必要的分支
5 删除不必要的比较和instanceof验证
6 删除未使用的代码
7 删除只写字段
8 删除未使用的方法参数
9 像push/pop简化一样的各种各样的peephole优化
10 在可能的情况下为类添加static和final修饰符
11 在可能的情况下为方法添加private, static和final修饰符
12 在可能的情况下使get/set方法成为内联的
13 当接口只有一个实现类的时候,就取代它
14 选择性的删除日志代码
实际的优化效果是依赖于你的代码和执行代码的虚拟机的。简单的虚拟机比有复杂JIT编译器的高级虚拟机更有效。无论如何,你的字节码会变得更小。
需要优化的不被支持技术:&
1 使非final的常量字段成为内联
2 像get/set方法一样使其他方法成为内联
3 将常量表达式移到循环之外
4 Optimizations that require escape
2,启动android中的混淆功能(关于eclipse中混淆,网上一大堆,这里不做解释)
在需要混淆的工程目录下(package/apps/下的工程)添加proguard.flags文件,该文件即为网络传说中的proguard.cfg,只是命名不一样而已,然后再Android.mk中添加如下两句:
LOCAL_PROGUARD_ENABLED := full
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
上面的full 也可以是custom,如果不写这句,那还得添加如下一句:
TARGET_BUILD_VARIANT := user或者TARGET_BUILD_VARIANT :=
这样后在工程目录下执行mm便可以看到在out目录下生成了形如proguard.classes.jar的东东,这就说明已在编译中启动了proguard
但反编译一看,并未出现网络云说的abcd替代符号,其实代码并未真正混淆:
android在编译时默认关闭了混淆选项,有去研究build/core目录的同志会发现这里也有个proguard.flags文件,其实在proguard的过程中,编译器会调用包括本地目录下和系统定义了的多个proguard.flags文件,而在这个文件中混淆的选项被禁止了,故而编译出来的apk仍未混淆。因此将如下句子注释掉便可实现真正的混淆编译:
# Don't obfuscate. We only need dead code striping.
-dontobfuscate(将该句加个#号注释掉)
好奇的同志还可以继续看看,为什么TARGET_BUILD_VARIANT :=
user和LOCAL_PROGUARD_ENABLED :=
full二选一即可,详见build/core/package.mk:
LOCAL_PROGUARD_ENABLED:=$(strip
$(LOCAL_PROGUARD_ENABLED))
ifndef LOCAL_PROGUARD_ENABLED
ifneq ($(filter user userdebug,
$(TARGET_BUILD_VARIANT)),)
# turn on Proguard by default for user &
userdebug build
LOCAL_PROGUARD_ENABLED :=full
ifeq ($(LOCAL_PROGUARD_ENABLED),disabled)
# the package explicitly request to disable proguard.
LOCAL_PROGUARD_ENABLED :=
proguard_options_file :=
ifneq ($(LOCAL_PROGUARD_ENABLED),custom)
ifneq ($(all_resources),)
proguard_options_file :=
$(package_expected_intermediates_COMMON)/proguard_options
endif # all_resources
endif # !custom
LOCAL_PROGUARD_FLAGS := $(addprefix -include
,$(proguard_options_file)) $(LOCAL_PROGUARD_FLAGS)
3,如何书写proguard.flags文件
参数解释:
-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 {class_specification} &
&保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)
-keepclassmembernames {class_specification} &
&保护指定的类的成员的名称(如果他们不会压缩步骤中删除)
-keepclasseswithmembernames {class_specification}
&保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)
-printseeds {filename} &
&列出类和类的成员-keep选项的清单,标准输出到给定的文件
-dontshrink &
&不压缩输入的类文件
-printusage {filename}
-whyareyoukeeping {class_specification} &
-dontoptimize &
&不优化输入的类文件
-assumenosideeffects {class_specification} &
&优化时假设指定的方法,没有任何副作用
-allowaccessmodification &
&优化时允许访问并修改有修饰符的类和类的成员
-dontobfuscate &
&不混淆输入的类文件
-printmapping {filename}
-applymapping {filename} &
&重用映射增加混淆
-obfuscationdictionary {filename} &
&使用给定文件中的关键字作为要混淆方法的名称
-overloadaggressively &
&混淆时应用侵入式重载
-useuniqueclassmembernames &
&确定统一的混淆类的成员名称来增加混淆
-flattenpackagehierarchy {package_name} &
&重新包装所有重命名的包并放在给定的单一包中
-repackageclass {package_name} &
&重新包装所有重命名的类文件中放在给定的单一包中
-dontusemixedcaseclassnames &
&混淆时不会产生形形色色的类名
-keepattributes {attribute_name,...} &
&保护给定的可选属性,例如LineNumberTable, LocalVariableTable,
SourceFile, Deprecated, Synthetic, Signature, and
InnerClasses.
-renamesourcefileattribute {string} &
&设置源文件中给定的字符串常量
4,实例(SkyvideoPlayer)
-optimizationpasses 3
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
# The support library contains references to newer platform
# Don't warn about those in case this app is linking against
# platform version. &We know about them, and
they are safe.
-optimizations
!code/simplification/arithmetic,!field/*,!class/merging/*
# -dontoptimize &#是否对类内部代码进行优化,默认优化
# Don't obfuscate. We only need dead code striping.
# -dontobfuscate &#不进行优化
#项目使用到的第三方jar包
-libraryjars ../libs/fastjson-1.1.23.jar
# removes such information by default, so configure it to keep
all of it.
-keepattributes Signature & #不优化泛型和反射
#android默认项
-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
# for skyworth fastjson
-keep class com.alibaba.fastjson.** { *; }
#以下为android默认项
-keepclasseswithmembernames class * {
-keepclasseswithmembernames class * {
& & public
(android.content.Context, android.util.AttributeSet);
-keepclasseswithmembernames class * {
& & public
(android.content.Context, android.util.AttributeSet, int);
-keepclassmembers enum * {
& & public static **[]
& & public static **
valueOf(java.lang.String);
-keep class * implements android.os.Parcelable {
& public static final
android.os.Parcelable$Creator *;
5,错误总结
问题一:使用gson包解析数据时,出现missing type parameter异常
程序中用到了gson的new
typeToken,结果打包成apk发布时,发现抛出异常,但不通过打包apk时发现一切正常,百思不得其解,最初怀疑没有将gson-1.7.1.JAR打包进去,后来经过测试发现gson的其他方法经过打包也能正常运行,最后上网找了2天,终于在google
gson论坛中找到了解决方法。
第一种:在 proguard.cfg中添加
-dontobfuscate
-dontoptimize
第二种:在 proguard.cfg中添加
# removes such information by default, so configure it to keep
all of it.
-keepattributes Signature
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized
-keep class com.google.gson.examples.android.model.** { *;
这两种方法都测试可行,第一个方法没有混淆编译,第二个方法能够混淆编译
反射类不能进行混淆编译,需加入
-keep class com.test.model.response.** {*;}
android辅助jar包异常,在proguard.cfg中加入
-dontwarn android.support.v4.**
-keep class android.support.v4.** {*;}
问题四:(同1)
类型转换错误,因为我用的泛型,所以在调用某些方法的时候,会出现这种错误,后面在混淆配置文件加了一个过滤泛型的语句,如下。
-keepattributes Signature
过后,就没有出现类似的类型转换错误。
问题五:空指针异常,这个错误是我对比前面的错误来说,所用的时间比较短,开始是找不到方法到底是哪个(原因是上面提到的混淆后方法名相同),所以就把这个类里面的所有方法都过滤掉,这样我没用多少时间,也就找到了具体的方法,可还是不明白原因,后面发现了其中的一个if判断,我利用反射筛选方法,关键字是“get”,突然我就震精了,大叫一声——soga,原来我
set/get方法名全部都被混淆了,所以筛选不到方法,返回的也就是null值,自然下面用到这个方法的返回值就会抛出空指针异常。
解决方法:把 model包下面的所有类,全部过滤掉。
总结:如要用到反射,反射一般就会利用到泛型,所以必须要把泛型的全部过滤掉,如果有根据变量名或者方法名判断的,记得所在的类需过滤掉,之中还有用到
annotation的地方,要加入一行代码,如下:
-keepattributes *Annotation*
这样就能过滤掉所有的annotation,否则也会抛出空指针异常。
推荐文章,内容都是他们写的,我只是整理了一下,呵呵
http://blog.csdn.net/hehe9737/article/details/8152330
http://charles-/post//
/zouzheng/archive//72639.html
/thread--1.html
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。由于工作需要,这两天和同事在研究android下面的ProGuard工具的使用,通过查看android官网对该工具的介绍以及网络上其它相关资料,再加上自己的亲手实践,算是有了一个基本了解。下面将自己的理解和认识简要的做个笔记,有异议或者不解的,可以直接留言。
什么是ProGuard工具?
ProGuard是android提供的一个免费的工具,它能够移除工程中一些没用的代码,或者使用语义上隐晦的名称来重命名代码中的类、字段和函数等,达到压缩、优化和混淆代码的功能。具体来说,使用ProGuard工具,可以达到下面两个目的:
删除了源文件中没有调用的那部分代码,最大化的精简了字节码文件,使得最终生成的apk文件更小。
使用语义混淆的命名替换了代码中的类、字段和函数等,使得其他人无法反编译获取源代码,起到对代码的保护作用。
我看网上有不少人根据ProGuard工具的作用,直接称呼其为&混淆代码工具&,本文也暂时用这个词简称。
更多的理解,可以参考ProGuard工具的官方文档地址:
ProGuard工具的集成与使用环境
其实,ProGuard工具是已经集成到我们android系统中的,所以不需要用户手动的去集成。但是有一点需要注意,仅在程序处于Release模式时ProGuard才有效,反之在Debug模式是不能通过ProGuard来混淆代码的。
根据ProGuard的具体使用环境,我分在Eclipse工具和android源码两种编译环境浅谈ProGuard的使用方法。
Eclipse环境中ProGuard的使用
以我电脑的android4.0环境为例,当我们在Eclipse中新建一个项目,或者导入一个已存在项目(保证当前项目没有语法错误)后,在工程的根目录,会自动生成两个ProGuard的混淆文件:proguard-project.txt和project.properties(在老版本的ADT中,只会生成一个叫proguard.cfg的文件)。我们先看下文件project.properties :
# 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-16
看后面一段注释:To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home) ,意指要让ProGuard 来压缩和混淆代码,把这句注释去掉即可!所以,我们只要把下面一句注释取消即可,如下所示:
# 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
我们仔细的看下这部分代码:这个地方是通过设置proguard.config属性来指定混淆代码的配置文件为本机SDK目录下面的proguard-android.txt文件,以及制定混淆的个性化配置文件为当前工程(eclipse下)根目录下面的proguard-project.txt文件 ,而后面这个文件,恰是我们刚才看到的原本在根目录下自动生成的另外一个文件!
其实打开了这个地方,我们就已经可以混淆代码了,不过这里要注意:不能试图通过运行eclipse中的Run as 和 Debug as 菜单来生成混淆代码,必须通过如下图所示的方法将apk导出才行,当然你可以选择&签名&或者&不签名&:
这样一步操作后,算是代码混淆完成了。那么怎么才能检验我们真的混淆了代码了呢?首先,我们能够看到在工程的根目录新生产了一个文件夹proguard,里面有四个文件,其内容如下:
dump.txt : 描述了apk中所有类 文件中内部的结构体。( Describes the internal structure of all the class files in the .apk file )
mapping.txt : 列出了原始的类、方法和名称与混淆代码见得映射。( Lists the mapping between the original and obfuscated class, method, and field names. )
seeds.txt : 列出了没有混淆的类和方法。( Lists the classes and members that are not obfuscated )
usage.txt : 列出congapk中删除的代码。( Lists the code that was stripped from the .apk )
同时使用反编译软件对新生成的apk反编译后会发现,里面的类名、方法和变量等,都变成了简单的a、b、c、d等毫无含义的字母,这样就达到了混淆的目的:
但在实际使用过程中,我们会发现当前apk中的有些方法和类,是要供外部使用的,而此时混淆了名称,外部调用就会报错了,那么怎么解决这个问题?此时就要用到我们刚才提到的混淆的个性化配置文件proguard-project.txt,在其中去配置不需要混淆的类、方法和变量等。关于混淆文件的具体配置方法,请看下面的最后一个标题会有详述。
Android源码环境中ProGuard使用
在Google发布的android源码中,面对那么多代码和文件目录,此时该如何混淆代码与配置混淆文件呢?
android中默认是将代码混淆ProGuard关闭的,在alps/build/core/proguard.flags中有下面一句,意指将默认不混淆,不需要代码删除,我们将这一句注释起来,就起到代码混淆编译的作用。
# Don't obfuscate. We only need dead code striping.
-dontobfuscate
可以说,这句是android工程中代码混淆的总开关,然而,注释了上面的代码后,整个工程就已经是代码混淆了吗?不是的,这里还要关注一个文件alps/build/core/package.mk,在这个文件中有这么一段:
ifndef LOCAL_PROGUARD_ENABLED
ifneq ($(filter user userdebug, $(TARGET_BUILD_VARIANT)),)
# turn on Proguard by default for user & userdebug build
#LOCAL_PROGUARD_ENABLED :=full
切记:当我们需要对整个工程进行代码混淆的时候,就把此处的 #LOCAL_PROGUARD_ENABLED :=full注释去掉,成为有效的宏即可。如果不想对整个工程代码混淆,而只是相对某个模块混淆的话,就先不要动这里的代码。
接着建议将真个工程new一遍,之后就可以针对具体的apk文件进行混淆文件的设置和定制了。下面以alps/packages/apps/Music为例说说该如何对特定模块做到混淆代码:
在Music目录下,我们看到一个平时不太关注,但今天一定很在意的文件名:proguard.flags ,对了,这个文件就是Music的混淆配置文件,可以打开看看(有些地方没有这个文件,用户可以自己手动新建一下,最好名称也叫proguard.flags,android下默认都是这个名字)。当然,设置了配置文件还是不够的,还需要在同目录的Android.mk中如下设置如下两句:
LOCAL_PROGUARD_ENABLED
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
只有这样才能让混淆代码有效,并且将混淆配置文件关联起来。(有些模块没有这两句句,就自己手动加上)
反之,如果用户已经在alps/build/core/package.mk打开了全工程混淆编译的控制点后,又在针对某个模块时不想混淆编译怎么办?这就简单了,将模块下的Android.mk中设置为**LOCAL_PROGUARD_ENABLED := disabled**即可。
这样,我们通过mm编译后的代码生成的apk,或者new真个工程后生成的烧机代码,都是已经添加相应配置的混淆代码了。
反编译后,除过proguard.flags中定制的不需要混淆的代码外,其他都是被混淆了,如图所示是android中Music模块的混淆后反编译结果:
混淆文件的配置
在实际使用过程中,我们会发现当前apk中的有些方法和类,是要供外部使用的,而此时混淆了名称,外部调用就会报错了,那么怎么解决这个问题?此时就需要我们配置混淆的个性化文件proguard-project.txt(eclipse环境中)或者proguard.flags(android源码环境),在其中去配置不需要混淆的类、方法和变量等。关于混淆文件的具体配置方法,大家可以去搜索下,我这里提供一段网上有人共享的配置代码,这个配置代码保留了工程文件中的Activity、Application、Service、BroadcastReceiver、ContentProvider、BackupAgentHelper、Preference和ILicensingService的子类,并保留了所有的Native变量名及类名,所有类中部分以设定了固定参数格式的构造函数,枚举等等,用来防止外部调用出错,大家可以借鉴下,以后来配置自己的文件:
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-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
-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 class * extends android.app.Activity {
public void *(android.view.View);
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
阅读(...) 评论()}

我要回帖

更多关于 proguard 不混淆jar 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信