首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

有没有可能让ProGuard用RetentionPolicy.SOURCE保留元素?

ProGuard是一个Java字节码优化和混淆工具,用于减小应用程序的大小并提高运行效率。它通过删除未使用的代码、优化字节码和重命名类、方法和字段来实现这些目标。

RetentionPolicy.SOURCE是Java中的一个元注解,用于指定注解的保留策略。它表示注解仅在源代码中可见,编译后不会包含在生成的字节码中。

由于ProGuard是在编译后的字节码上操作的,而RetentionPolicy.SOURCE指定的注解在编译后不会包含在字节码中,所以不可能让ProGuard使用RetentionPolicy.SOURCE保留元素。

然而,ProGuard可以与其他保留策略一起使用,例如RetentionPolicy.CLASS和RetentionPolicy.RUNTIME。RetentionPolicy.CLASS表示注解在编译后的字节码中可见,但在运行时不可访问。RetentionPolicy.RUNTIME表示注解在编译后的字节码中可见,并且在运行时可以通过反射机制访问。

总结起来,ProGuard不能使用RetentionPolicy.SOURCE保留元素,但可以与其他保留策略一起使用以实现不同的需求。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

关于Java中枚举Enum的深入剖析

javac编译上面的类,得到class文件. javac Season.java 然后,我们利用反编译的方法来看看字节码文件究竟是什么.这里使用的工具是javap的简单命令,先列举一下这个Season下的全部元素...而开发人员处理混淆更多的是将某些元素加入不混淆的名单,这里枚举就是需要排除混淆的....keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } 关于为什么要保留...values()方法和valueOf()方法,请参考文章读懂 Android 中的代码混淆 关于枚举的部分 使用proguard优化 使用Proguard进行优化,可以将枚举尽可能的转换成int。...配置如下 -optimizations class/unboxing/enum 确保上述代码生效,需要确proguard配置文件不包含-dontoptimize指令。

70030

关于Java中枚举Enum的深入剖析

javac编译上面的类,得到class文件. javac Season.java 然后,我们利用反编译的方法来看看字节码文件究竟是什么.这里使用的工具是javap的简单命令,先列举一下这个Season下的全部元素...而开发人员处理混淆更多的是将某些元素加入不混淆的名单,这里枚举就是需要排除混淆的....enumerations-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } 关于为什么要保留...values()方法和valueOf()方法,请参考文章读懂 Android 中的代码混淆 关于枚举的部分 使用proguard优化 使用Proguard进行优化,可以将枚举尽可能的转换成int。...配置如下 -optimizations class/unboxing/enum 确保上述代码生效,需要确proguard配置文件不包含-dontoptimize指令。

92730

android开发笔记之 Android代码混淆打包

那就让我们了解下这个东西吧 作用:为了防止自己的劳动成果被别人窃取,混淆代码能有效防止被反编译 缺省情况下,proguard 会混淆所有代码,但是下面几种情况是不能改变java 元素的名称,否则就会这样就会导致程序出错...三, 是我们的java 元素名称是在配置文件中配置好的。 所以使用proguard时,我们需要有个配置文件告诉proguard 那些java 元素是不能混淆的。...-keep 指定的类和类成员被保留作为 入口 。 -keepclassmembers 指定的类成员被保留。...看到这里, 感觉混淆还是小case的哈~~ 如果是一个外来人或者是其他反编译出你的APK来看,是不是一脸蒙逼, 当然包括自己也是,那有没有办法可以看到怎么混淆的呢,答案是肯定的。...先说如何使用别人写好的,我们引用的第三方 库无论开源还是闭源如有特殊情况我们都可以在他的User Guide中找到混 淆代码的配置,如我们引用了大名鼎鼎的guillep PullToRefresh,我们

71720

如何在10分钟内让Android应用大小减少 60%?

提示:要想做进一步的代码压缩,尝试使用位于同一位置的proguard-android-optimize.txt文件。...要修正错误并强制 ProGuard 保留特定代码,请在 ProGuard 配置文件中添加一行-keep代码。...在类上添加@Keep原样保留整个类。在方法或字段上添加它可完整保留方法/字段(及其名称)以及类名称。请注意,只有在使用注解支持库时,才能使用此注解。...proguard中一共有三组六个keep关键字的含义 keep 保留类和类中的成员,防止它们被混淆或移除。 keepnames 保留类和类中的成员,防止它们被混淆,但当成员没有被引用时会被移除。...keep关键字的区别: 如果这个类没有native的方法,那么这个类会被混淆 -keepclasseswithmember class * { native ; } 不管这个类有没有

81720

如何在10分钟内让Android应用大小减少 60%?

提示:要想做进一步的代码压缩,尝试使用位于同一位置的proguard-android-optimize.txt文件。...要修正错误并强制 ProGuard 保留特定代码,请在 ProGuard 配置文件中添加一行-keep代码。...在类上添加@Keep原样保留整个类。在方法或字段上添加它可完整保留方法/字段(及其名称)以及类名称。请注意,只有在使用注解支持库时,才能使用此注解。...proguard中一共有三组六个keep关键字的含义 keep 保留类和类中的成员,防止它们被混淆或移除。 keepnames 保留类和类中的成员,防止它们被混淆,但当成员没有被引用时会被移除。...keep关键字的区别: 如果这个类没有native的方法,那么这个类会被混淆 -keepclasseswithmember class * { native ; } 不管这个类有没有

1.6K10

在 Android Instant App(安卓即时应用程序)中启用 ProGuard (混淆)

在共享的即时应用程序/安装应用程序项目中,功能模块替换旧的 com.android.library 模块。 当构建一个安装的应用程序时,ProGuard(混淆)会在构建过程结束时运行。...**因此,与安装的应用程序构建相反,ProGuard(混淆)可以独立运行在每个功能模块的代码中。...简单地说:如果你的 base feature 包含的公共元素(例如 AppCompat 小部件)仅在功能 1 和/或功能 2 中使用但并未在基本功能本身中,则这些元素将被 ProGuard(混淆)删除,...接下来我们将在即时应用程序 ProGuard(混淆)配置来自安装应用中的规则。 2....剩下的就是取出输出的每一行,并将其转换为 aia-proguard-rules.pro 文件中的 ProGuard(混淆)保留规则。

2.5K30

一篇文章带你领略Android混淆的魅力

3.1 -keep 这里说的 keep 命令指的是一系列以 -keep 开头的命令,它主要用来保留 Java 中不需要进行混淆的元素。...如: -keep class twitter4j.** { *; } -dontwarn twitter4j.** 其他的命令用法参考 Android 系统提供的默认混淆规则: #混淆时不生成大小写混合的类名...其实,我们在使用代码混淆时,ProGuard 对我们项目中大部分代码进行了混淆操作,为了防止编译时出错,我们应该通过 keep 命令保留一些元素不被混淆。...原因在于:代码混淆过程中,被反射使用的元素会被重命名,然而反射依旧是按照先前的名称去寻找元素,所以会经常发生 NoSuchMethodException 和 NoSuchFiledException 问题...Android ProGuard 为我们提供了默认的"混淆字典",即将元素名称转为英文小写字母的形式。那么,我们可以定义自己的混淆字典吗?卖个关子,我们先来看一张效果图: ?

92920

Android开发:请你吃一顿史上最全的Android混淆大餐

keep 命令 这里说的 keep 命令指的是一系列以 -keep 开头的命令,它主要用来保留 Java 中不需要进行混淆的元素。...其实,我们在使用代码混淆时,ProGuard 对我们项目中大部分代码进行了混淆操作,为了防止编译时出错,我们应该通过 keep 命令保留一些元素不被混淆。...被反射的元素 被反射使用的类、变量、方法、包名等不应该被混淆处理。...原因在于:代码混淆过程中,被反射使用的元素会被重命名,然而反射依旧是按照先前的名称去寻找元素,所以会经常发生 NoSuchMethodException 和 NoSuchFiledException 问题...Android ProGuard 为我们提供了默认的"混淆字典",即将元素名称转为英文小写字母的形式。那么,我们可以定义自己的混淆字典吗?卖个关子,我们先来看一张效果图: ?

3.8K30

Android 实现代码混淆的实例

'), 'proguard-rules.pro' } 3、proguard又是什么呢 这是java官网给出的定义: ProGuard is a free Java Class file shrinker...的最多的指令 -keep class XXXX 保留类名不变,也就是类名不混淆,而类中的成员名不保证。...当然也可以是继承XXX类的所有类名不混淆 -keepclasseswithmembers class XXXX 保留类名和成员名,当然也可以是类中特定方法 5、哪些不混淆 反射中使用的元素 与网络请求相关实体类...使用注解的元素 四大组件 WebView中与JS交互的类 枚举 等 6、混淆文件编写 按照以上的规则和基本语句,我们将混淆文件分为两个区域: 定制化区域:分为实体类、第三方、js相关、反射相关,...{ <methods ; } 反射相关 没有跳过 -keep class 你的类所在的包.** { *; } ok,这样就可以了,其实混淆很简单!

93141

Android混淆你了解多少?

keep 命令 这里说的 keep 命令指的是一系列以 -keep 开头的命令,它主要用来保留 Java 中不需要进行混淆的元素。...其实,我们在使用代码混淆时,ProGuard 对我们项目中大部分代码进行了混淆操作,为了防止编译时出错,我们应该通过 keep 命令保留一些元素不被混淆。...被反射的元素 被反射使用的类、变量、方法、包名等不应该被混淆处理。...原因在于:代码混淆过程中,被反射使用的元素会被重命名,然而反射依旧是按照先前的名称去寻找元素,所以会经常发生 NoSuchMethodException 和 NoSuchFiledException 问题...Android ProGuard 为我们提供了默认的"混淆字典",即将元素名称转为英文小写字母的形式。那么,我们可以定义自己的混淆字典吗?

1.7K00

android代码混淆

proguard 就是这样的混淆工具,它可以分析一组class 的结构,根据用户的配置,然后把这些class 文件的可以混淆java 元素名混淆掉。...缺省情况下,proguard 会混淆所有代码,但是下面几种情况是不能改变java 元素的名称,否则就会这样就会导致程序出错。 一, 我们用到反射的地方。...三, 是我们的java 元素名称是在配置文件中配置好的。 所以使用proguard时,我们需要有个配置文件告诉proguard 那些java 元素是不能混淆的。...-keep 指定的类和类成员被保留作为 入口 。 -keepclassmembers 指定的类成员被保留。...打包出来的程序如何调试 一旦打包出来,就不能用eclipse的logcat去看了,这里可以android sdk中ddms.bat的tool来看,一就发现和logcat其实还是一个东西,就是多了个设备的选择

1.5K80

最新版SpringBoot结合ProGuard实现代码混淆

t process class [META-INF/versions/11/module-info.class] 问题原因 这个问题的原因有很多方面,最主要的就是我们的jdk版本是1.8,我最开始的...,要和mybatis里面的Mapper映射对应,DAO里面的方法传参要改为map或者实体,另外序列化后的实体要保留 Controller里面的方法入参,如果用了实体,这部分实体也要保留(保证其变量不会被混淆...,不然传值收不到) 另外就是你们spring相关的XML里面,如果单独配置了Bean和Bean属性的,这类bean要保留,不能被混淆 我这里保留了所有的接口和接口里面的方法,已经我们自定义的抽象类BaseService...里面的方法名不会被混淆,这些你们可以自己定义,而且我这里定义了有标注@Component的类也保留类名,按照我上面的配置,基本上可以不用重新构建beanName。...正常的application启动就完事了 其他的没了,就看你们还有没有什么特定的类不能被混淆,以及你们要混淆的力度(我们的要求是保留所有类名、接口信息和抽象类信息,除此之外的所有类和方法都被混淆!)

5.1K40

Java 注解

那么元数据有什么呢?我们可以元数据来创建文档、跟踪代码的依赖性和执行编译时的格式检查,并可以代替系统中原有的配置文件。    ...Java 注解是 Java 代码里的特殊标记,为我们在代码中添加 Java 程序无法表达的额外信息提供了一种格式化方法,使我们可以在编译、类加载、运行时使用这些被注解修饰的程序元素(这些程序元素包括:...程序块直接通往下一种情况,而没有break @SuppressWarnings(value = "path") //在类路径中有不存在的路径 @SuppressWarnings(value = "serial") //在序列化的类上缺少.../** * RetentionPolicy.CLASS : 编译器将把注解记录在 class 文件中,当运行 Java 程序时,虚拟机不再保留注解。...* RetentionPolicy.RUNTIME : 编译器将把注解记录在 class 文件中,当运行 Java 程序时,虚拟机保留注解,程序可以通过反射获得该注解。

1.5K10

Android 代码混淆规则

Proguard介绍 Android SDK自带了混淆工具Proguard。它位于SDK根目录\tools\proguard下面。...3.2 保留选项 -keep [,modifier,…] class_specification:指定需要保留的类和类成员(作为公共类库,应该保留所有公开访问的public方法) -keepclassmembers...-keepclasseswithmembers 保持拥有该成员的类和成员,防止被移除或者被重命名 -keepclasseswithmembernames 保持拥有该成员的类和成员,防止被重命名 保持元素不参与混淆的规则的命令格式...自定义资源保持规则 6.1 keep.xml shrinkResources true开启资源压缩后,所有未被使用的资源默认被移除。...通过一些属性的设置可以实现定义资源保持的需求,可配置的属性有: tools:keep 定义哪些资源需要被保留(资源之间“,”隔开) tools:discard 定义哪些资源需要被移除(资源之间“,”

2.4K10

Android 代码混淆 混淆方案

”可以分为两部分,一部分是Java 代码的优化与混淆,依靠 proguard混淆器来实现;另一部分是资源压缩,将移除项目及依赖的库中未被使用的资源(资源压缩严格意义上跟混淆没啥关系,但一般我们都会放一起...keepclassmembers keepclassmembernames keepclasseswithmembers keepclasseswithmembernames 更多详细的请到官网 需要特别介绍的是与保持相关元素不参与混淆的规则相关的几种命令...防止成员被重命名 -keepclasseswithmembers 防止拥有该成员的类和成员被移除或者被重命名 -keepclasseswithmembernames 防止拥有该成员的类和成员被重命名 保持元素不参与混淆的规则...通过一些属性的设置可以实现定义资源保持的需求,可配置的属性有: keep 定义哪些资源需要被保留(资源之间“,”隔开) discard 定义哪些资源需要被移除(资源之间“,”隔开) shrinkMode...当代码中通过 Resources.getIdentifier() 动态的字符串来获取并使用资源时,普通的资源引用检查就可能会有问题。

2.4K30

Android 混淆那些事儿

,不同的gradle版本带有不同的默认混淆文件,在项目根目录的build/intermediates/proguard-files/proguard-android.txt-2.3.3(笔者的gradle...指定哪个属性不要混淆,一次指定多个属性 -keepattributes [attribute_filter] 通常Exceptions, Signature, Deprecated, SourceFile...,根据项目具体使用情况保留。...csh代码方便,我们需要在proguard_rules.pro中手动添加抛出异常时保留代码行号,并且重命名抛出异常时的文件名称,这样能方便定位问题: 抛出异常时保留代码行号 -keepattributes...(1)微信的资源混淆方案: 微信的资源混淆是自己做了一个安装包解压并且7z极限压缩打包器,修改的内容也是resources.arsc,优点是可以最大地混淆,不依赖源码与编译过程,无需在编译过程中修改源文件

3.2K50

注解反射动态代理的简单学习

@Target 主要限制可以应用注解的java元素类型 ElementType.ANNOTATION_TYPE 可以应用于注解类型。...ElementType.TYPE 可以应用于类的任何元素。 2....仅仅保留在源码中,被编译器忽略,主要应用场景是apt技术,在编译期能够获取注解与注解声明的类包括类中所有成员信息,一般用于生成额外的辅助类。...还有语法检查,类似@IntDef这种 RetentionPolicy.SOURCE 会被编译器保留,但是会被jvm忽略,用处主要是用在字节码增强技术,在编译出Class后,通过修改Class数据以实现修改代码逻辑目的...RetentionPolicy.RUNTIME 的比较多,主要是通过反射技术动态获取注解元素 简单应用 @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD

30900

Java注释@interface的用法

注解相当于一种标记,在程序中加上了注解就等于为程序加上了某种标记,以后, JAVAC编译器,开发工具和其他程序可以反射来了解你的类以及各种元素上有无任何标记,看你有什么标记,就去干相应的事 注解@Override...RetentionPolicy有3个值:CLASS RUNTIME SOURCE @Retention(RetentionPolicy.CLASS)修饰的注解,表示注解的信息被保留在class文件...(字节码文件)中当程序编译时,但不会被虚拟机读取在运行的时候; @Retention(RetentionPolicy.SOURCE )修饰的注解,表示注解的信息会被编译器抛弃,不会留在class文件中...,注解的信息只会留在源文件中; @Retention(RetentionPolicy.RUNTIME )修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时..., 所以他们可以反射的方式读取。

43110
领券