Какое определение для Android Native Code? - PullRequest
0 голосов
/ 29 сентября 2019

Я всегда вижу термин android native code здесь и там, но не уверен, что именно это. Так какая часть андроида является android native code? Application, Activity, Fragment, View, Looper android native code?

Больше контекста: я пытаюсь понять тень в робототехнических тестах и ​​в документациисказано, что «нативный код Android не может выполняться на вашей машине разработки», поэтому мне интересно, упоминаются ли здесь классы типа Application, Activity и т.д. android native code? http://robolectric.org/extending/

Ответы [ 2 ]

2 голосов
/ 30 сентября 2019

Слово native в разработке для Android перегружено.

Переход по ссылке , которую вы указали для Robolectric:

Однако существуют ограничения:

  1. Собственный код - нативный код Android не может выполняться на вашем компьютере разработки.
  2. Вне вызовов процесса - на вашем компьютере разработки не запущены системные службы Android.
  3. НедостаточноAPI тестирования - в Android практически отсутствуют API, подходящие для тестирования

Roboletric заполняет эти пробелы набором классов, известных как Shadows ...

Так что в этом случаеAndroid native code Цитата также относится к:

  • Классы Android Framework, такие как Activity, Fragment, View, где только для приложений Android SDK для запуска требуется эмулятор или устройство. Но Roboletric предлагает собственный код Android Framework, который может быть «улучшен» Shadows для тестирования приложений.

ИЛИ

Позже на той же странице:

ИспользованиеИнструментарий для байт-кода Robolectric может создавать межплатформенные фальшивые реализации, заменяя собственный код и добавляя дополнительные API, чтобы сделать возможным тестирование.

substitute for native code относится к API Java / Kotlin, принадлежащим AndroidФреймворк, который Roboletric заменяет для обеспечения тестовой среды. Опять же, это были бы Activity, Fragment, View и т. Д., На которые вы ссылались.

Использование термина «родной» в данном случае аналогично использованию разработчиком, использующим третьеФреймворк для создания сторонних приложений, такой как «React Native», «Ionic», «Flutter», «Xamarian» или «Cordova / Phonegap», они могут использовать пользовательский компонент, написанный на Java / Kotlin как native component, для достижения некоторой функции, котораяможет быть сделано только путем прямого взаимодействия с платформой Android Framework, но не на языке / API такого стороннего фреймворка, как Javascript, Dart или C #.

Java и его родственники (Kotlin, Scala и т. д.)относится к вызову кода C / C ++ как native через Java Native Interface (JNI), а на Android облегчается Native Development Kit (NDK). Фреймворки для разработки сторонних приложений, которые находятся поверх мобильной фреймворка, будут называть вызовы в оригинальной мобильной фреймворке «родными».

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

Лично я предпочел бы, чтобы в документации использовалось слово native включал такой язык, как native Java/Kotlin APIs или native C/C++ APIs, так как первый экземпляр на связанной странице заставлял меня возвращаться и размышлять о значении автора.

Следить за вопросами в комментариях

  1. Вы упомянули, что «они могут использовать пользовательский компонент, написанный на Java / Kotlin в качестве нативного компонента», вы имеете в виду Activity, Fragment и т. Д., Когда говорите о пользовательском компоненте, верно?

В этом конкретном разделе я имел в виду сторонние фреймворки приложений, вызывающие классы, которые являются Android Framework, или напрямую вызывающие его части. Обычно эти сторонние фреймворки приложений уже обертывают / раскрывают Activity, View и т. Д., Но вам, как разработчику, может потребоваться библиотека или другой пользовательский код Java / Kotlin, который может быть вызван сторонним языком фреймворка приложений (Javascript, Dart,C #). С точки зрения стороннего фреймворка приложений «обернутая библиотека Java / Kotlin» - это native component, поскольку она «родная» для мобильной среды. Этот упакованный код библиотеки не написан на Javascript, Dart или C #. Снова значение «родной» перегружено.

В первом абзаце ссылки автор подчеркивает, что мы будем запускать «настоящий код Android» в робоэлектрике. Но, как мы проанализировали, robolectric скрывает базовый строительный блок, такой как Activity, Fragment, который мне кажется противоречивым, поэтому единственное объяснение, которое я могу придумать, заключается в том, что ShadowActivity оборачивает исходную реализацию реальной Activity, как вы думаете, этокейс?

Да, ShadowActivity «оборачивает» оригинальную реализацию реальной Activity. Я хотел бы отметить, что автор заявляет: Shadow objects are not quite Proxies, not quite Fakes, not quite Mocks or Stubs.

ЭтоВажно, чтобы теневые методы были реализованы в соответствующей тени класса, в котором они были изначально определены. В противном случае механизм поиска Robolectric не найдет их (даже если они были объявлены в подклассе теней.)

и

Иерархия наследования классов теней не всегда отражает зеркальную структурусвязанные с ними классы Android, иногда необходимо совершать вызовы через эти реальные объекты, чтобы среда выполнения Robolectric имела возможность направить их в правильный класс Shadow на основе фактического класса объекта

Поэтому обычное наследование Java не совсем правильная ментальная модель для Shadows.

0 голосов
/ 30 сентября 2019

Код Android не является Java или Kotlin. Это не некоторые классы, такие как Activity или Fragment. Нативный код Android - это C / C ++. Здесь немного информации о SDK (NDK). И здесь вы можете найти общий обзор NDK (встроенный комплект разработки).

Надеюсь, это поможет.

...