وقتی صفحهٔ خونهٔ کیندل با ریاکت نیتیو ساخته میشه
خلاصهٔ کاملتر
نویسنده میگه از بهروزرسانی ۵.۱۴.۲ (فوریهٔ ۲۰۲۲) به بعد، کیندل صفحهٔ خونهش رو بهجای Java با React Native میسازه. قبلاً جامعهٔ مودینگ تو فرومهای Mobileread با ابزاری به اسم JBPatch بایتکد جاوا رو پچ میکرد، ولی اون پروژه بیش از یه دههست متوقف شده و کل اون استک جاوا هم با ترکیبی از React Native و C++ جایگزین شده.
نکتهٔ اصلی مقاله خود React Native نیست، بلکه Hermes ـه؛ موتور جاوااسکریپتی که فیسبوک ساخته و از ۲۰۲۲ موتور پیشفرض React Native شده. کاری که Hermes میکنه اینه که جاوااسکریپت رو از قبل (ahead-of-time) به بایتکد کامپایل میکنه و بعد همون بایتکد رو اجرا میکنه. این کار باندل رو کوچیکتر و استارتآپ رو سریعتر میکنه، ولی در عوض ریورساینجینیرینگ و مودکردن اپ رو خیلی سختتر میکنه؛ چون برای پچکردن اپ باید مستقیم بایتکد Hermes رو تغییر بدی، نه کد جاوااسکریپت رو.
بزرگترین چالش اینه که بایتکد Hermes هنوز پایدار نیست و هر بایتکد فقط با همون نسخهای از Hermes که باهاش ساخته شده قابل اجراست. الان Hermes رو نسخهٔ بایتکد ۹۹ ـه، ولی صفحهٔ خونهٔ کیندل هنوز نسخهٔ ۸۴ رو استفاده میکنه. آخرین نسخهٔ Hermes که بایتکد ۸۴ رو میسازه v0.11.0 از سال ۲۰۲۱ ـه، که ساختنش هم سختتره چون به نسخهٔ قدیمیتر CMake (نسخهٔ ۳.۰۷) نیاز داره. نویسنده میگه بهجای درگیرشدن با React Native و تارگت لینوکس، فقط روی بیلدکردن همین موتور Hermes تمرکز کرده، چون چیزی که براش مهمه خود بایتکدـه نه APIهای پلتفرم.
برای دیساسمبلکردن چند ابزار معرفی میشه. خود Hermes موقع بیلد یه باینری hbcdump میسازه که فقط برای نسخهٔ بایتکد خودش کار میکنه. از پروژههای شخصثالث، hermes-dec از P1 Security بهروزترین دیساسمبلر و دیکامپایلرـه و یه جدول مفید از آپکدهای Hermes هم نگه میداره. اما چون hermes-dec اسمبلر نداره، نویسنده مثل Marek سراغ hbctool رفته که هم دیساسمبلر و هم اسمبلرـه و API پایتون داره؛ این ابزار متروکه شده بود و نویسنده فورکش کرده تا فیکسهای نسخهٔ HBC84 رو بهش اضافه کنه.
برای نشوندادن خروجی دیساسمبلی، نویسنده یه برنامهٔ خیلی ساده رو مثال میزنه:
var a = 1 + 2;
var b = 3 + 4;
print("Hello Hermes!");
print("Result was " + (a + b));بعد از دیساسمبل، سه فایل ساخته میشه: metadata.json که برای دوباره اسمبلکردن لازمه، string.json که جدول رشتههاست (همهٔ رشتهها با ID ذخیره میشن و بایتکد بهجای خود رشته به ID ارجاع میده)، و instruction.hasm که شبهاسمبلی Hermes ـه. نویسنده خطبهخط توضیح میده که آپکدهایی مثل DeclareGlobalVar، LoadConstUInt8، PutById، TryGetById و Call2 چیکار میکنن و چطور کامپایلر مثلاً 1 + 2 رو از قبل به 3 جمع میزنه و مستقیم ذخیره میکنه. در نهایت نشون میده سادهترین جور پچ، تغییردادن یه رشته تو همون جدول string.json ـه.
نکات کلیدی:
- از کیندل ۵.۱۴.۲ (۲۰۲۲)، صفحهٔ خونه با React Native ساخته میشه
- موتور Hermes جاوااسکریپت رو از قبل به بایتکد کامپایل میکنه؛ پس مودکردن یعنی پچکردن بایتکد
- کیندل بایتکد نسخهٔ ۸۴ رو استفاده میکنه و فقط Hermes v0.11.0 اون رو میسازه
- ابزارها: hbcdump داخلی، hermes-dec برای دیساسمبل، و hbctool برای دیساسمبل و اسمبل
- دیساسمبلی سه فایل میده؛ سادهترین پچ، تغییر رشته تو جدول string.json ـه




