我使用React-native 0.61.2创建了我的应用程序的发布版本,并启用了Hermes。 在我的Crashlytics中,我收到有关崩溃的信息以及堆栈跟踪。以前我曾经使用apktool从我的apk中提取index.android.bundle,它包含js代码,可以通过stacktrace找到问题。
但是现在使用Hermes index.android.bundle似乎包含字节码而不是js,因此我浪费了一天试图对其进行反汇编。我最后尝试过的是https://github.com/facebook/hermes/blob/master/doc/BuildingAndRunning.md中提到的 hbcdump 工具,但我得到的只是“错误:无法反序列化字节码:错误的字节码版本。期望73但得到62”
我该如何分解用爱马仕创建的index.android.bundle?非常感谢您的帮助!
答案 0 :(得分:3)
编辑:从Hermes v0.5.0开始,还有一个hermes-engine-cli
NPM包含字节码反汇编程序。它仅与相应的hermes-engine
版本兼容(即hermes-engine-cli@0.5.0
与hermes-engine@0.5.0
一起使用)。
它仍然主要对编译器开发人员有用,而不对调试应用程序崩溃有用。
Hermes工具不向后兼容,因此您需要先签出正确的版本。对于字节码版本62
,您可以使用v0.2.1
检出git checkout v0.2.1
版本。对于任意字节码版本,git log -p include/hermes/BCGen/HBC/BytecodeFileFormat.h
将显示哪些提交将格式更新为哪个版本。
构建完成后,您可以在出现提示时使用hbcdump myfile.hbc
后跟disassemble
来显示文件的禁用版本。
请注意,hbcdump
与javap -c
和objdump -d
一样,是用于开发/调试编译器的。这是您可以期望得到的输出:
Function<fizzbuzz>1(1 params, 22 registers, 0 symbols):
Offset in debug table: src 0xd, vars 0x0
fizzbuzz.js[1:21]
LoadConstZero r11
LoadConstUInt8 r10, 15
LoadConstUInt8 r9, 3
LoadConstString r8, "Fizzbuzz"
LoadConstString r7, "Fizz"
LoadConstString r6, "Buzz"
GetGlobalObject r5
LoadConstUndefined r0
LoadConstUInt8 r4, 1
LoadConstUInt8 r3, 100
LoadConstUInt8 r2, 5
LoadConstZero r1
L2:
fizzbuzz.js[1:21]
Mod r12, r1, r10
Mov r13, r8
JStrictEqual L1, r12, r11
Mod r12, r1, r9
Mov r13, r7
JStrictEqual L1, r12, r11
Mod r12, r1, r2
Mov r13, r6
JStrictEqual L1, r12, r11
AddEmptyString r13, r1
L1:
fizzbuzz.js[8:5]
TryGetById r12, r5, 1, "print"
Call2 r12, r12, r0, r13
AddN r1, r1, r4
JLessN L2, r1, r3
Ret r0