如果没有源更改,Proguard是否保证提供相同的映射?

在这种情况下,如果我愿意

  • 建立一个项目
  • 清理所有二进制文件
  • 再次构建它(没有源/资源等已经改变)。

Proguard是否保证提供相同的mapping.txt文件?

  • 通过ProGuard防止类成员名称混淆
  • Android上的ProGuard和Gson(ClassCastException)
  • proguard.cfg文件丢失
  • 如何在ProGuard中使用-dontwarn?
  • Proguard找不到引用的com.google.ads.internal.state.AdState类
  • com.google.android.gms.internal.zzhu:找不到引用的类android.security.NetworkSecurityPolicy
  • 如何解决proguard警告'找不到引用的方法'现有的方法'clone'和'finalize'类java.lang.Object
  • 将内部接口方法名称保留在proguard中
  • ProGuard是确定性的:对于相同的输入,它将生成相同的输出。

    但有一个微妙之处:如果操作系统以不同的顺序列出目录中的输入文件(特别是不在存档中的类文件),则可以按不同的顺序处理它们,并且输出可以不同。

    它可能实际发生,但我不认为proguard保证这一点。

    我在Proguard文档中发现了这一点,它允许您重用mapping.txt以避免对映射进行更改

    -applymapping文件名

    指定重用在先前的ProGuard混淆运行中打印出的给定名称映射。 映射文件中列出的类和类成员将接收与其一起指定的名称。 未提及的类和类成员会收到新名称。 映射可以指输入类以及库类。 此选项对于增量混淆非常有用,即处理现有代码段的附加组件或小补丁。 如果代码结构发生根本变化,ProGuard可能会打印出应用映射导致冲突的警告。 您可以通过在两个混淆运行中指定选项-useuniqueclassmembernames来降低此风险。 只允许一个映射文件。 仅在混淆时适用。

    如果需要保证,则必须使用映射文件作为混淆过程的输入。 但是,您必须仔细检查有关该映射文件的冲突的所有警告。 如果忽略这一点,在使用reflection时可能会出现细微的错误。