#dex #class #diff #android #builds #reproducible #hash

bin+lib dexd

用于比较 dex 类文件的程序

1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2018 年 9 月 17 日

#dex 中排名 #6

Apache-2.0

38KB
773 行(不包括注释)

Dex Diff

一个用于比较 Android dex 类文件的程序。该项目的目的是帮助创建可重复的 Android 构建。具有相同源代码的两个构建可能具有导致哈希值不同的细微差异。该程序将帮助识别这些差异。

命令行

要运行,请输入以下命令

dexd classes.dex classes2.dex

将 classes.dex 和 classes2.dex 替换为您的 dex 文件名。

摘要输出

.dex 类文件被分为 18 个编码块。dexd 将检查两个不同的 dex 文件之间的每个块是否相同。这有助于缩小问题的范围。

以下是一个真实示例,其中注释部分在应相同的构建中不匹配。

TYPE_HEADER_ITEM (DIFF)
TYPE_STRING_ID_ITEM (OK)

TYPE_TYPE_ID_ITEM (OK)

TYPE_PROTO_ID_ITEM (OK)

TYPE_FIELD_ID_ITEM (OK)

TYPE_METHOD_ID_ITEM (OK)

TYPE_CLASS_DEF_ITEM (DIFF)
    Matches = 2757 Mismatch = 3391

TYPE_MAP_LIST (OK)

TYPE_TYPE_LIST (OK)

TYPE_ANNOTATION_SET_REF_LIST (DIFF)
    Matches = 266 Mismatch = 613

TYPE_ANNOTATION_SET_ITEM (DIFF)
    Matches = 3491 Mismatch = 6108

TYPE_CLASS_DATA_ITEM (OK)

TYPE_CODE_ITEM (OK)

TYPE_STRING_DATA_ITEM (OK)

TYPE_DEBUG_INFO_ITEM (OK)

TYPE_ANNOTATION_ITEM (OK)

TYPE_ENCODED_ARRAY_ITEM (DIFF)
TYPE_ANNOTATIONS_DIRECTORY_ITEM (DIFF)
    Matches = 2057 Mismatch = 3182

匹配/不匹配给出匹配项的数量,而不是字节数。

详细日志

对于以下块,dexd 将输出它在元素之间找到的确切差异。

  • CLASS_DEF_ITEM
  • ANNOTATION_SET_REF_LIST
  • ANNOTATION_SET_ITEM
  • ANNOTATIONS_DIRECTORY_ITEM

这些块中的每一个在 ./target/dexd 目录下都有相应的 txt 文件。

输出将包含项的对 ({item1}, {item2}),其中 item1(来自第一个 dex 文件)应与 item2(来自第二个 dex 文件)相同。

在下面的情况中,我们看到第一个配对的 AnnotationSetItem 中的项目数量不同。第二个配对具有相同数量的项目,但指向不同的偏移量。

  (
        AnnotationSetItem {
            size: 1,
            entries: [
                AnnotationOffItem {
                    annotation_off: 1333860
                }
            ]
        },
        AnnotationSetItem {
            size: 3,
            entries: [
                AnnotationOffItem {
                    annotation_off: 1333400
                },
                AnnotationOffItem {
                    annotation_off: 1333408
                },
                AnnotationOffItem {
                    annotation_off: 1333408
                }
            ]
        }
    ),
    (
        AnnotationSetItem {
            size: 1,
            entries: [
                AnnotationOffItem {
                    annotation_off: 1333860
                }
            ]
        },
        AnnotationSetItem {
            size: 1,
            entries: [
                AnnotationOffItem {
                    annotation_off: 1335352
                }
            ]
        }
    ),

未来工作

在未来版本中,我计划添加更多块,最终覆盖所有 18 个块。还将添加其他功能,以确定 dex 类差异是否无关紧要(如排序)或重要(如代码或资源的更改)。

其他信息

依赖项

~1MB