Java 当使用ProGuard进行模糊处理时,-keepattributes SourceFile,LineNumberTable是否使生成的apk更容易进行反向工程?

Java 当使用ProGuard进行模糊处理时,-keepattributes SourceFile,LineNumberTable是否使生成的apk更容易进行反向工程?,java,android,proguard,Java,Android,Proguard,我发现自己需要在报告的堆栈跟踪中获得更多细节,但我担心通过包含额外数据(通过使用-keepattributes SourceFile,LineNumberTable),我使我的应用程序更容易进行反向工程。是这样的吗?如果是这样的话,会有多少?我不太确定会发生什么,但是如果源文件名包含类的实际名称,有人可以使用它将模糊的类名映射为真实的类名。既然obfsucation已经把一切都搞乱了,为什么还要保留源文件呢?一切都应该并且将继续运行,运行时不需要调试细节,因此保留它们没有任何意义。你删除的越多,

我发现自己需要在报告的堆栈跟踪中获得更多细节,但我担心通过包含额外数据(通过使用-keepattributes SourceFile,LineNumberTable),我使我的应用程序更容易进行反向工程。是这样的吗?如果是这样的话,会有多少?

我不太确定会发生什么,但是如果源文件名包含类的实际名称,有人可以使用它将模糊的类名映射为真实的类名。既然obfsucation已经把一切都搞乱了,为什么还要保留源文件呢?一切都应该并且将继续运行,运行时不需要调试细节,因此保留它们没有任何意义。你删除的越多,你的目标就越好。

SourceFile属性是必需的,因为Oracle/Sun的Java虚拟机在堆栈跟踪中不包含行号,这正是您真正想要的(而且它本身是无害的)。我还没有检查Android的Dalvik虚拟机是否如此

至于解决方案,ProGuard可以保留SourceFile属性,但将其内容替换为您选择的无意义字符串,例如

-renamesourcefileattribute SourceFile

字符串的值对于解释堆栈跟踪并不重要。选择“SourceFile”这样的字符串可以避免增加类文件大小,因为根据定义,该字符串已经存在。

我认为您可以使用:

-keepattributes LineNumberTable


只要让filename为空就行了

@Eric,如果要保留源文件属性,为什么要修改类名?当然stacktraces是无用的,但这不是观察点吗?@mP上述配置保留SourceFile属性,但替换其内容。JVM随后将打印出完整的堆栈跟踪,但名称模糊。在ProGuard为开发人员生成的映射文件的帮助下,这些对于调试模糊的应用程序非常有用。“这是非常无害的”,如果任何人在反编译后都能看到实际的文件名,这又是如何无害的呢?这使得模糊处理完全无用。@xmenW.K。参见上面的注释——实际的文件名消失了;它被一个无意义的字符串替换,例如“SourceFile”。只有在使用“-renamesourcefileattribute”后才可以使用“是”
-renamesourcefileattribute
-keepattributes SourceFile, LineNumberTable,Signature,Exceptions,InnerClasses,EnclosingMethod
-renamesourcefileattribute ''
-keepattributes SourceFile, LineNumberTable,Signature,Exceptions,InnerClasses,EnclosingMethod