java 扰码工具_【Developer Log】ProGuard扰码可执行JAR包
在项目上线之前需要通过ProGuard来对java的class进行混淆,以避免反编译方式,来保护自己的代码。ProGuard网上有很多资料,可以参考:http://blog.csdn.net/zhangdaiscott/article/details/45368261。在此,记录扰码可执行JAR包出现的问题,已经相关的解决方式。
1、引用第三方库的处理方式
引用第三方库,应避免修改第三方库的类名和public的方法、参数,否则在proguard回报很多warning,而执行失败。在Eclipse打包为可执行jar包时有以下的几个选择。
Extract方式是缺省的方式,会将第三方jar包解压成为具体的*.class ,然后和我们自己的*.class一起封装成为jar。Proguard会对所有class进行扰码,因此包括了第三方jar包。
最直接的方式就是让第三方jar包不参与proguard的混淆,因此我们可以选择余下两种方式,这里我选择了Package方式。我们用7Zip对jar包进行解压,会看到第三方jar包仍以jar包的方式存在。
2、可执行main要保留
我们需要保留jar包中的资源,特别是MANIFEST.MF文件,下面是这个文件的例子:
Rsrc-Class-Path: ./ log4j-core-2.4.1.jar log4j-api-2.4.1.jar gson-2.4. jar mysql-connector-java-5.1.37.jar
Class-Path: .
Rsrc-Main-Class: MyPackage.App
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
这里设计两个具有Main的可执行类MyPackage.App,和org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader(顾名思义,load第三方库的)。我们必须确保能够找到这两个类的main,也就是这两个类的全名(包名和类名)以及mian的方法名字都必须保留正确。增加一下配置即可:
-adaptresourcefilecontents **.properties,META-INF/MANIFEST.MF
-whyareyoukeeping class *
-keep public class MyPackage.App {
public static void main(java.lang.String[]);
}
-keep public class org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader {
public static void main(java.lang.String[]);
}
对应与GUI中,如下几图:
有些参数是可以调整的,例如可以不选择Keep parameter
3、关于Gson
如果我们采用Gson来进行Json的处理,由于Gson和类中定义的成员名字有关,如果对这些名字进行混淆,则无法正确进行Json的解析,有两种方法处理:
1)在上图中右下方的“Keep additional names and class membe names”中选择相关的类和成员。一般这些成员都是private的。
2)更合适的方式如下,在代码中加入@SerializedName
@SerializedName("clientName")
private String clientName;
@SerializedName("ServerName")
private String ServerName;
此外,对于要封装成JSON字符串的属性,必须提供getter方法,例如上面如果不提供getClientName,则json字符串中没有该属性。对应的,如果进行解析,则必须提供setter方法。
出现一个奇怪的现象待查。如果定义一个数组Vector urls,当然也给出@SerializedName("urls")。如果我们将此定义在继承类,在运行的时候会报错,如下所示。需要将此定义在基类来解决,有些奇怪,先记录下来
错误:java.lang.IllegalArgumentException: class c.d declares multiple JSON fields named h
java.lang.IllegalArgumentException: class c.d declares multiple JSON fields named h
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:167) ~[gson-2.4.jar:?]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:97) ~[gson-2.4.jar:?]
at com.google.gson.Gson.getAdapter(Gson.java:360) ~[gson-2.4.jar:?]
at com.google.gson.internal.bind.ArrayTypeAdapter$1.create(ArrayTypeAdapter.java:48) ~[gson-2.4.jar:?]
at com.google.gson.Gson.getAdapter(Gson.java:360) ~[gson-2.4.jar:?]
at com.google.gson.Gson.fromJson(Gson.java:813) ~[gson-2.4.jar:?]
at com.google.gson.Gson.fromJson(Gson.java:752) ~[gson-2.4.jar:?]错误:java.lang.IllegalArgumentException: class c.d declares multiple JSON fields named h
java.lang.IllegalArgumentException: class c.d declares multiple JSON fields named h
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:167) ~[gson-2.4.jar:?]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:97) ~[gson-2.4.jar:?]
at com.google.gson.Gson.getAdapter(Gson.java:360) ~[gson-2.4.jar:?]
at com.google.gson.internal.bind.ArrayTypeAdapter$1.create(ArrayTypeAdapter.java:48) ~[gson-2.4.jar:?]
at com.google.gson.Gson.getAdapter(Gson.java:360) ~[gson-2.4.jar:?]
at com.google.gson.Gson.fromJson(Gson.java:813) ~[gson-2.4.jar:?]
at com.google.gson.Gson.fromJson(Gson.java:752) ~[gson-2.4.jar:?]
相关链接:开发日志
java 扰码工具_【Developer Log】ProGuard扰码可执行JAR包相关推荐
- java excel 插件开发工具_程序员常用的15 种开发者工具推荐
程序员常用的15 种开发者工具推荐:Java 线上诊断工具 Arthas.IDE 插件 Cloud Toolkit.混沌实验注入工具 ChaosBlade.Java 代码规约扫描插件.应用实时监控工具 ...
- java -jar 工作原理_可执行Jar包运行原理
spring boot有一个很方便的功能就是可以将应用打成可执行的jar.那么大家有没想过这个jar是怎么运行起来的呢?本篇博客就来介绍下spring boot可执行jar包的运行原理. 1. 打可执 ...
- linux 测试环境启用jar_Linux下用java -jar运行可执行jar包的方法教程
问题来源 一般来说,一个稍微大些的项目都会有一些依赖的Jar包,而在将项目部署到服务器的过程中,如果没有持续集成环境的话,也就是说服务器不支持在线编译及打包,那么需要自己上传依赖的Jar包,然而可能服 ...
- centos 命令行执行多个命令_命令行如何执行jar包里面的方法
最近遇到一个尴尬的问题,由于公司机测试环境的机房迁移,导致办公区的网络跟测试环境网络之前延迟比较大,大到什么程度呢?大到不能正常使用测试环境. 由于网络组一直在排查,暂时没有答复,所以只能采取一个比较 ...
- java -jar 执行jar包出现 java.lang.NoClassDefFoundError
http://www.cnblogs.com/xuzimian/p/7599304.html 我用idea工具将自己开发java程序打成一个可执行的jar包,当然用eclipse或者直接用jar命令行 ...
- java 执行jar包命令
不依赖外部jar包 执行java -cp xxx.jar xxx.xxxx.xxxx.MainClass 参数一,参数二 依赖外部jar包 当main类依赖多个jar时,可以把多个jar打包到一个目录 ...
- java9可执行jar_单个java文件打成可执行jar包
1 概述 使用JDK自带的jar与java将单个java文件打成可执行jar包并运行. 当然也可以使用IDE完成,使用Maven只需要一个简单的package,但是单个文件嘛,没必要这么"凶 ...
- java执行jar中的main_浅谈java 执行jar包中的main方法
浅谈java 执行jar包中的main方法 通过 OneJar 或 Maven 打包后 jar 文件,用命令: java -jar ****.jar 执行后总是运行指定的主方法,如果 jar 中有多个 ...
- idea 执行 java jar_idea打包java可执行jar包的实现步骤
1,在项目上鼠标右键 --> Open Module Settings 2, Artifacts --> + --> JAR --> From modules with dep ...
最新文章
- 技校毕业是什么学历_技校毕业了是什么学历
- MySQL 日志文件 说明
- 如何解决SVN 清理失败
- 在java 中调c_在Java中调用C
- solaris 查看CPU资源占用情况!
- unef螺纹_螺纹标准大全
- 【Unity3D 灵巧小知识点】 ☀️ | 层级面板中的 ‘小手指‘ 作用: 在Scen中将该物体设置为不可选中状态
- (保姆级教程)免费将pdf转化为word文档,不限页数
- 剑指spring源码(三)
- python椭圆曲线加密算法_ECC 椭圆曲线加密算法学习————安全性问题与实战...
- 回顾敏捷实践踩过的坑:如果重新做,我会这样做(一)
- 正面杠腾讯音乐与网易云音乐,抖音与快手谁能“弯道超车“?
- 横河电机与ICQ Consultants签署生物制药业务合作协议
- 亲爱的老狼-搜索引擎的区分及现在各大浏览器的引擎细分
- 逐梦壹号STC32四驱智能小车开发文档(一):原理图设计
- MySQL高可用之基于Galera复制跨地域节点分布的滥用
- 有没有便宜的易优cms授权(易优cms授权便宜获取)
- Lisp语言:列表(List)
- 第一次私服游戏搭建总结
- 树莓派开发实战项目 智能家居--简单工厂模式(简单工厂模式介绍)