Запуск кода JavaScript в кошельке Android

Вместо того, чтобы жаловаться на Твиттер, на этой неделе я решил немного поработать Aparté с определенной частью кодовой базы Android Wallet: запустить JavaScript.

Я пишу эту статью в основном потому, что я просто хотел поделиться своими последними трудностями и, надеюсь, научить вас чему-нибудь о мире разработки, если вы не технический специалист!

TL; DR: перейдите к последнему абзацу.

Что такое движок JavaScript?

Механизм JavaScript - это программа, которая может читать и выполнять JavaScript, язык программирования, который в основном используется в веб-среде (но не только), который соответствует спецификациям ECMAScript.

Проще говоря, ECMAScript - это спецификация, направленная на стандартизацию JavaScript.

Есть несколько известных движков, которые могут запускать JavaScript:

  • JavaScriptCore: JS-движок, выпущенный Apple, расскажем позже
  • Rhino: движок JS написан на Java, опубликованный Mozilla.
  • Spider Monkey: движок JS также был написан Mozilla и использовался для их браузера, т.е.
  • Hermes, движок, созданный Facebook, используется на Android с React Native.
  • V8, JS-движок, написанный на C ++ компанией Google, используемый в Chrome и основном компоненте среды выполнения Node.js.

Все эти движки могут выполнять код JavaScript, но ни один из них не доступен на Android, что является основным отличием iOS, поскольку Swift может легко и безупречно обращаться к JavaScriptCore.

Но зачем вам выполнять JavaScript?

Поскольку мы используем пакет Bitcore, предоставляемый BitPay, мы должны использовать криптографическую библиотеку под названием Stanford JavaScript Crypto Library (SJCL), которая представляет собой безопасную, небольшую и быструю библиотеку для криптографии в JavaScript.

SJCL в основном будет использоваться для шифрования, дешифрования и декодирования данных между приложением и Bitcore.

Пока я исследовал порт этой библиотеки, я не нашел удовлетворительных результатов. Кроме того, как только это закончится, я опубликую результат как отдельную библиотеку для использования другими людьми.

Мне также предлагали разместить веб-сервер с открытым REST API, но, помимо добавления угрозы безопасности, это немного избыточно для необходимого набора функций.

Но вы можете использовать WebView, не так ли?

Да и нет. WebView - это объект, который в идеале позволяет отображать веб-страницу и, да, может выполнять JavaScript через интерфейс JavaScript.

В идеале WebView следует использовать только тогда, когда мы хотим отобразить веб-страницу, и даже если его можно использовать без отображения фактического контента, это (почти) полнофункциональный браузер, который слишком сильно замедлит выполнение приложения.

Достаточно полагаться только на движок JavaScript, чтобы

Итак, как вы решаете свою проблему?

Поскольку в Android нет «plug-and-play» реализации какого-либо известного JS-движка, кроме веб-представления, я начал поиск библиотеки, которая могла бы сделать это за меня.

В обычной Java-программе вы можете использовать объект, называемый Script Engine (обрабатываемый, предположительно, диспетчером Script Engine), который позволяет загружать движок для разных языков, включая JS, и выполнять код JavaScript.

Но Android тоже можно написать на Java, верно?

Ну да, но вот в чем дело. Java - это язык, но язык был бы ничем без комплекта разработчика, который представляет собой «набор инструментов», который облегчает разработку приложения, предоставляя набор инструментов для множества распространенных приложений. Представьте, что Java - это чистый металл, а комплект разработчика - это такие инструменты, как отвертка, молоток и т. Д.

Между классической разработкой на Java и разработкой для Android комплекты средств разработки различаются, и хотя они разделяют большинство пакетов (давайте подумаем о карманах в вашем наборе инструментов), в Android нет пакета, содержащего объект Engine Script.

Итак, сначала я узнал о внешней библиотеке, предоставляющей классы, необходимые для использования Script Engine и Rhino (тот, который предоставляется Mozilla). Все это было весело и весело, и как только я понял, как этим пользоваться, все стало неприятно.

Оказывается, я получал результат нужных мне функций JavaScript в неправильном формате. И я ничего не мог сделать, например, навязать формат, который мне бы понравился - он также мог участвовать в изменении данных, не зная об этом, и я не могу этого допустить, поскольку даже байт может полностью испортить данные. Так что пришлось отказаться от этого варианта.

А теперь решение.

J2V8 -Java2V8

Не знаю, как раньше не узнал. J2V8 (доступен ЗДЕСЬ на GitHub) - это набор привязок Java для движка V8. Это позволяет нам легко читать сценарий и быстро и надежно выполнять функции из него.

Итак, я прямо сейчас реализую J2V8 для чтения SJCL, чтобы иметь возможность реализовать Bitcore в кошельке Android.

Если вы справились с этой битовой стеной текста, спасибо за терпение, проявленное при моей разглагольствовании, и я надеюсь, что кто-то сможет найти применение в этой статье!

подсказки

XVG: DNqhnfa2Uf8cvns5udz3uH7EcoUZvysHNg

BTC: 1F5KZc1kzB5VA1eKpbYpFcbrRhXsYNmmo5

Летучая мышь: 0xefd4c1e7730f7b00e1Ac8438BbBDC2a1cD1cE93E

использованная литература