介绍 之前介绍了如何使用命令行将Jar包根据配置文件进行ProGuard,以及ProGuard的过程,会遇到的问题等。接下来会介绍常用的ProGuard如何配置参数。...不常用的可以在官网中查询如何使用。 java -jar proguard.jar @myconfig.pro Filter 每一个类、属性、方法都会有一个全名,例如java.lang.String。...指定的Library应该至少包含一个Class文件被Application Class文件中使用extended继承了。...默认ProGuard会读取public以及non-public的类。然而,non-public的类通常没有关联的。可以忽略他们,提升ProGuard速度,而且也不会影响output。...的使用
插件,使用的proguard-base版本是5.3.3 这里使用java8,因此libs那里照常配置rt.jar,jce.jar,如果是java9的话,则需要换成相应的模块。...java版本号 -dontshrink ##默认是开启的,这里关闭shrink,即不删除没有使用的类/成员 -dontoptimize ##默认是开启的,这里关闭字节码级别的优化 -useuniqueclassmembernames...##对于类成员的命名的混淆采取唯一策略 -adaptclassstrings ## 混淆类名之后,对使用Class.forName('className')之类的地方进行相应替代 -dontusemixedcaseclassnames...## 混淆时不生成大小写混合的类名,默认是可以大小写混合 -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile...配置仅仅是根据自身工程的情况来量身定做的,不是通用的,具体的场景还需要根据具体情况对proguard参数进行调整。
当一些类和方法会被动态访问到时(如使用反射),在某些情况下,ProGuard 在构建调用图时不能正确的决定他们的「生死」,导致这些代码被错误的移除掉。...这会在下面的场景中发生: 当 ProGuard 移除过多的类 在某些情况下,ProGuard 并不知道一个类或者方法被使用了,例如这个类仅在反射时被使用或者仅在 XML 中被引用。...当运行时发生了 ClassNotFoundException 或 MethodNotFoundException 异常意味着您肯定缺失了某些类或者方法,也许是 ProGuard 移除了他们,又或者是因为错误配置依赖而导致无法找到他们...这在许多情况下可以时您的应用避免崩溃的发生,但是这些配置并不是 100% 适合您的应用。您可以移除掉默认的 ProGuard 文件而使用您自己的。...文件中的规则将会在应用构建时附加到应用主 ProGuard 配置并被使用。
ProGuard是android提供的一个免费的工具,它能够移除工程中一些没用的代码,或者使用语义上隐晦的名称来重命名代码中的类、字段和函数等,达到压缩、优化和混淆代码的功能。...具体来说,使用ProGuard工具,可以达到下面两个目的: 删除了源文件中没有调用的那部分代码,最大化的精简了字节码文件,使得最终生成的apk文件更小。...更多的理解,可以参考ProGuard工具的官方文档地址:http://developer.android.com/tools/help/proguard.html ProGuard工具的集成与使用环境...但是有一点需要注意,仅在程序处于Release模式时ProGuard才有效,反之在Debug模式是不能通过ProGuard来混淆代码的。...根据ProGuard的具体使用环境,我分在Eclipse工具和android源码两种编译环境浅谈ProGuard的使用方法。
背景 在Method与Filed数超限的背景下,我们将多工程拆分成多个Dex打到Apk中解决该问题,但是在使用MultiDex的时候,还会遇到一些问题。 在启动的时候会发生如下Crash。...java.lang.RuntimeException: Unable to instantiate application com.xxxx.xxxx.AApplication: java.lang.ClassNotFoundException...ZygoteInit.java:676) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.ClassNotFoundException...因为5.0以下的手机使用的是Dalvik虚拟机,在Dex加载的时候,通过JIT即时编译生成字节码然后运行,而Art虚拟机则是在安装的时候,已经将Dex转换成aot文件,而aot文件已经是可以执行的二进制文件...所以,在5.0以下的手机中,Dalvik会优先加载第一个Dex,然后反射到Application然后进行初始化,如果子类不在第一个Dex中,那么就会出现ClassNotFoundException的异常
当使用Xpath方法时,除了导入的Jsoup.jar包外,还必须导入JsoupXpath.jar; 但是在这里还是提示报错了:Caused by: java.lang.ClassNotFoundException...: org.apache.commons.lang3.StringUtils 错误原因1:jar包版本过低,没有大量的类方法。...按照提示下载导入commons-lang3-3.9.jar;(或者下载一个JsoupXpath.jar高版本的jar包?...没有试过) (commons-lang3这个jar包,后面是版本号,最好使用3以上版本) ? ? 导入后发现正常运行了。
最近公司有一个项目,是外包项目,由于对方也有技术人员,出于技术上的保密,需要对class文件进行二次处理,于是网上找了好久,只发现Proguard是用的最广泛而且网上资料最多的。.../下载proguard,目前我下载并使用的是proguard5.1(注:本人下载频道也有proguard5.1)。...5)下面开始添加支持库,这个地方很重要,很多同学刚开始使用这个工具的时候就是这里老是出问题。 点击右边的“add”。... 混淆时应用侵入式重载 -useuniqueclassmembernames 确定统一的混淆类的成员名称来增加混淆 -flattenpackagehierarchy {package_name... 混淆时不会产生形形色色的类名 -keepattributes {attribute_name,...}
步骤:将剩下的classes,field,methods使用无意义的短的字符串重命名 这些步骤主要是为了让代码变得更精简,更高效,变得对逆向更难。...ProGaurd使用它们来重建正确处理所需的类依赖关系,Library它们本身会保持不变,你可以把他们放到最终应用的Class Path中。...例如,Class.forName()可能会在Runtime引用很多的Class。而这种方式的类,我们无法预见哪些类必须使用原始名称来保留,例如Class的名称是从配置文件中读取的。...混淆很多反射的代码需要反复测试,尤其是不需要内部构建的代码。 使用(Usages) 如果想要执行ProGuard,只需: java -jar proguard.jar options ......例如: ##This is Comment## 如果特殊的文件名带有空格,则需要使用单引号或者双引号。 Options可以通过命令行参数以及配置文件中任意组合。
ProGuard是一个广泛使用的免费工具,可以用来优化、缩小和混淆Java字节码。本文将详细介绍如何使用ProGuard对JavaWeb项目进行代码混淆。1....2.2 配置环境变量为了方便在命令行中使用ProGuard,建议将ProGuard的bin目录添加到系统的PATH环境变量中。3....使用ProGuard对JavaWeb项目进行代码混淆是一项重要的安全措施,可以有效防止代码被反编译和盗用。通过本文的介绍,相信你已经掌握了使用ProGuard的基本步骤和技巧。...下面是一个具体的示例,展示如何在 Java Web 项目中配置和使用 ProGuard 进行代码混淆。1. 准备工作首先,确保你的项目中已经包含了 ProGuard 的 jar 包。...下面详细介绍如何在 Java Web 项目中使用 ProGuard 混淆代码。准备工作下载 ProGuard:首先需要从官方网站下载 ProGuard 的最新版本,并解压到你的本地机器上。
序 本文主要研究一下如何使用proguard混淆java9代码 maven com.github.wvengen...6.0.1版本的proguard-base proguard.cfg -target 9 -dontshrink -dontoptimize -useuniqueclassmembernames -adaptclassstrings...如果没有使用到log4j的话,可以在progurard.cfg文件中配置dontwarn忽略 can’t find referenced class [proguard] Warning: cn.example.Demo...definition of program/library class Eclipse打包Android项目时用到proguard.cfg后,出现的Warning:can’t find referenced...class问题的解决方案
ClassNotFoundException 产生的原因: Java支持使用 Class.forName 方法来动态地加载类,任意一个类的类名如果被作为参数传,递给这个方法都将导致该类被加载到 JVM...NoClassDefFoundError 产生的原因: 当 Java 虚拟机 或 ClassLoader 实例试图在类的定义中加载(作为通常方法调用的一部分,或者是使用 new 来创建新的对象)时,却找不到类的定义...即当前执行的类被编译时,所搜索的类定义存在,但无法再找到该定义。 这个错误往往是你使用 new 操作符来创建一个新的对象,但却找不到该对象对应的类。...当应用程序试图通过类的字符串名称,使用常规的三种方法装入类,但却找不到指定名称的类定义时就抛出该异常。 NoClassDefFoundError 当目前执行的类已经编译,但是找不到它的定义时。...加载时从外存储器找不到需要的 Class 就出现 ClassNotFoundException 连接时从内存找不到需要的 class 就出现 NoClassDefFoundError 写在最后: 异常的出现让我们编写的程序运行起来更加的健壮
介绍 ClassNotFoundException 和NoClassDefFoundError都发生在JVM在classpath下找不到所需的类时。 虽然看起来很相似,但是两者有很大不同。...ClassNotFoundException 当应用尝试在类路径中用全限量名去加载某个类时,如果找你不到它的定义就会报CLassNotFoundException 。它是一个可检测异常。...我们在使用反射的时候,要特别注意这个异常。 下面这个例子,我们尝试加载的JDBC驱动没有添加到类路径中(没有添加依赖),将会报ClassNotFoundException。...如果应用中用到了多个类加载器,一个类加载器加载的类,无法再其他的类加载器中使用。...5、总结 ClassNotFoundException与NoClassDefException核心区别是,前者强调运行时无法匹配到指定参数名称的类,后者强调编译时没问题,运行时却无法实例化一个类。
c.a.c.c.hessian.io.SerializerFactory - Hessian/Burlap: 'XX.XX.XBean' is an unknown class in java.net.URLClassLoader@988246e: java.lang.ClassNotFoundException...转换DTO的时候使用的是BeanUtils.copyProperties,浅拷贝,Spring在5.3.0版本之前这个方法的源码中没有泛型的判断,所以通过反射的方法赋值会出现实际的类型与声明的不一致。...,是通过反射中的Method完成的,所以如果Bean不声明属性的set和get方法,则不能属性间的copy。...Method的invoke方法,只是把sourceBean的get方法获取的值通过targetBean的set方法设置,所以并不涉及深拷贝,只是拷贝属性的引用。...,所以通过反射的方法赋值会出现实际的类型与声明的不一致。
上篇文章已经介绍过Java的类加载机制,在类加载的过程中我们最常遇到的异常就是: ClassNotFoundException NoClassDefFoundError 但是你知道他们的区别吗?...如果你还不清楚,那么不着急,我们来仔细分析一下: 先来说说第一个异常提示名字已经非常友好了,就是告诉我们使用类加载器就加载某个类的时候,发现所有的path下面都没有找到,从引导类路径,扩展类路径到当前的...总结: 本文主要对比介绍了ClassNotFoundException与NoClassDefFoundError的区别和发生条件,从上面的测试我们可以分析出,直接采用反射或者类加载器的loadClass...方法去动态加载一个所有classpath里面的都不存在的类,类加载器在运行时的load阶段就会直接抛出ClassNotFoundException异常。...这两种异常本质上的侧重点还是不一样的,前者侧重在类加载器加载阶段找不到类信息,后者则侧重在使用阶段时却出现了问题比如实例化依赖类找不到或者类本身就初始化失败了。
问题随记在集成 Jwt 认证时出现以下错误:java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverterat java.base/...这导致了许多使用 JAXB 的旧代码在升级到 Java 9 或更高版本时遇到类加载问题。...解决方法 解决方案:使用 JDK 的 JAXB 模块:如果你的应用程序依赖于 JAXB,可以考虑以下两种方法来解决这个问题:在 Maven 或 Gradle 中添加依赖:如果你使用 Maven,则可以添加以下依赖...-- 适合你的项目版本 -->如果使用 Gradle,可以添加以下依赖:implementation 'javax.xml.bind:jaxb-api:2.3.1' // 适合你的项目版本手动添加...:另一种选择是将你的项目迁移到使用新的 XML 处理库,如 javax.xml.stream,或者使用更现代的替代方案,如 JSON 格式的数据交换。
Difference between NoClassDefFoundError vs ClassNotFoundExcepiton in Java ---- 如果JVM或者ClassLoader在加载类时找不到对应的类...另外一方面,ClassNotFoundException和编译期没什么关系,当你在程序运行时利用反射加载类时,就可能遇到ClassNotFoundException异常,例如加载SQL驱动时,对应的类加载器找不到驱动类...(使用Class.forName())时没有找到对应的类,则会抛出java.lang.ClassNotFoundException。...NoClassDefFoundError是Error,是unchecked,因此也不需要使用try-catch或者finally语句块包围;另外,ClassNotFoundException是受检异常(...如果你在J2EE开发中遇到NoClassDefFoundError,那么最有可能的原因就是存在多个类加载器和多个目标类,即我们常说的Jar包冲突——关于Jar包冲突,一般可以使用下面两种方法解决: 使用
Maven WEB 项目使用ProGuard进行混淆,最佳解决方案 近期公司的Android项目做了混淆,虽说对于保护代码并不是100%的,但混淆后的代码可以使那些不法份子难以阅读,这样也能对代码的保护做出贡献...) 本文的重头戏,使用Maven集成的ProGuard插件,混淆配置不用单独建立文件 时能打包src目录下的XML文件--> src...-- 使用插件的什么功能,当然是混淆--> proguard 的classes文件,里面包含完整的项目结构 proguard_map.txt 混淆内容的映射 proguard_seed.txt 参与混淆的类 混淆完成后,将classes-pg.jar
文章目录 一、Proguard 混淆后的报错信息 二、Proguard 混淆映射文件 mapping.txt 更多 ProGuard 混淆配置参考 : https://www.guardsquare.com.../en/products/proguard/manual/usage 一、Proguard 混淆后的报错信息 ---- 前提 : proguard-rules.pro 混淆配置中配置保留行数 ; # 保留行数...报错信息不可读 ; 下面是截取出的混淆后的报错信息 : 2020-11-10 12:01:59.426 28142-28142/?...(Handler.java:30) , 报错的是混淆后的信息 , 可读性很差 ; 二、Proguard 混淆映射文件 mapping.txt ---- 前提 : proguard-rules.pro 混淆配置中配置保留行数...; # 保留行数 -keepattributes SourceFile,LineNumberTable Proguard 混淆后 , 会提供一个 原始代码 与 混淆过的代码 的对应关系文件 mapping.txt
更新微信sdk导致ComposeData中的内部类ComposeDataSender方法被混淆 根本原因,fastjson使用姿势不对。...问题描述: 一个发件人列表里,应当呈现的数据(这里命名为ComposeData)为空 (1)业务逻辑层 获取发件人列表时,如果Composedata超时,会从网络重新拉取Json格式的ComposeData...getAlias()方法) 导致发件人列表为空的原因: 获取发件人列表时,依赖于需要读取DB中的各个别名帐号的alias和type , 旧包中,getAlias()和getType()方法没有混淆,toString...()时存入DB的数据是可用的(实际上,nick字段在4.1.1也丢失了,但由于没有使用到这个字段,不会引起问题) 新包中,getType()方法没有混淆,其他getter被混淆,toString()存入...中有RContact这个类,包含了getAlias方法,因为是第三方库,其中public的getAlias方法没有被混淆, 因为proguard混淆时,同名的方法(不论是否在同一个类中)是被替换为相同的名字
常见的场景就是: 1 调用class的forName方法时,找不到指定的类 2 ClassLoader 中的 findSystemClass() 方法时,找不到指定的类 3 ClassLoader...中的 loadClass() 方法时,找不到指定的类 开发者平时会有这样一种使用方法,类似JDBC加载驱动!...针对上面的第二点,做了个关于包名的验证: 另一种情况就是由于你通过了编译,但是这个类是有包名的,因此在编译时需要指定classpath,在使用的时候需要加上包名才可以。 ...很明显,报错信息中指出了包的信息!那么怎么办呢? 在编译时,加上【 -d . 】这样可以把当前的目录加入到classpath中。 ? 在使用时,加上包名就可以了! ...也就是说,这个含有包名的类,编译时,需要指定classpath的路径,并且使用的时候指定包名全路径,才可以。