Что такое байт код андроид

Отключение проверки байт-кода для ускорения работы ОС Android

Многие пользователи задаются вопросом увеличения производительности своего Android-гаджета, ведь это не просто «звонилка» в случае со смартфоном, и не просто медиаплеер, в случае, если это планшет.

В данной статье мы разберем очередной твик, который может несколько ускорить работу операционной системы Android.

Большинство пользователей Android-устройств слышали о таких понятиях, как одексированная и деодексированная прошивка. На данную тему мы уже составили отдельную статью. Так вот, отключение проверки байт-кода или disabling verify-bytecode, способно заметно улучшить производительность, особенно на аппаратах со сравнительно небольшим (256-512 Мбайт) объемом оперативной памяти. Изначально считалось, что данный твик актуален только для деодексированных прошивок, но практика показывает, что он полезен и для одексированных версий. Сразу отметим, что всегда перед проведением каких-либо манипуляций с программным обеспечением вашего устройства, настоятельно рекомендуется создавать резервные копии.

Для проведения данной операции нам потребуются, во-первых, Root-права и инсталлированный Root Explorer, а во-вторых, установленный терминал, например Android Terminal Emulator.

Итак, после создания полного бекапа всех данных, открываем терминал и прописываем в него последовательно следующие команды:

setprop dalvik.vm.verify-bytecode false

setprop dalvik.vm.dexopt-flags v=n, o=v

Далее, используя Root Explorer, находим файл build.prop, который находится в памяти устройства в директории system. Открываем его и добавляем туда следующие строки:

Внимание! Если какая-то из строчек уже присутствует в файле, достаточно изменить их значения на указанные выше, дубликатов быть не должно!

После этого снова открываем терминал, куда вводим следующие команды поочередно:

После чего производим перезагрузку устройства и радуемся полученному результату.

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

setprop dalvik.vm.verify-bytecode true

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

Источник

Что значит проверять байт код приложений доступных для отладки?

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

Вирусы

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

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

Проверка байт кода приложений доступных для отладки

Проверка байт-кода гарантирует, что код не может делать такие вещи, как переинтерпретация int в качестве указателя и произвольный доступ к памяти. Это наиболее полезно, если вы пытаетесь запустить ненадежный код в песочнице Java.

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

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

Опять же, здесь все зависит от разработчиков. У вас установлен не искусственный интеллект, а обычная программа, которая найдет только очевидные проблемы. Но даже так, это гораздо лучше, чем ничего. Так что стоит отключать режим побайтной проверки кода или нет решать вам.

Источник

Отключаем проверку байт-кода или ускоряем работу android

Все про Android

Слово автора:
Это статья написана мной, т.е. Papa Roach , с использованием этих материалов , которая не претендует на универсальность и открытие «Америки».Скорее она предназначена для ознакомления и в качестве деления личным опытом и размышлениями, ну и чутку для науки))))

Введение:
Многие знают что есть деодексированные и одексированные прошивки для гуглофона. Если кто не знает в чем разница, то читаем эту статью .

В данной статье я опишу как отключить проверку байт-кода(disabling verify-bytecode).
Q: Зачем это делать?
A: Данный твик дает прирост производительности в деодексированной прошивке как при одексированной. Актуально на аппаратах с размером оперативной памяти 256-512мб!
Q: Опасно ли это?
A: Все зависит от прямоты ваших рук и желания делать бэкап.

Читайте также:  Google smart lock для android

Требования:
1) Деодексированная прошивка. Однако, наш товарищ и модератор Usernokiamen проверил данный твик на одексированной прошивке и заметил увеличение быстродействия аппарата! Поэтому можете попробовать и на одексированной прошивке.
2) Наличие установленного файлового менеджера. К примеру Root Explorer
3) Наличие установленного терминала. К примеру Android Terminal Emulator
4) Умение делать полный бэкап данных аппарата!

Непосредственно инструкция:
Шаг 1
Делаем полный бэкап данных! Описывать как делать бэкап не буду. Если не умеете- учитесь. Инструкций море!

Шаг 2
Открываем эмулятор терминала на телефоне и вводим следующие команды:

В качестве иллюстрации:

Шаг 3
Используя файловый менеджер, находим файл build.prop , который лежит в памяти телефона в папке /system .
Открываем его и добавляем строки:

Если какая-либо из строк уже есть в файле, то измените их на данные значения! Главное чтобы не было дубликатов!
В качестве иллюстрации:

Шаг 4
Открываем снова эмулятор терминал и вводим:

Отключение твика:
Если вы решили отключить данный твик, т.е. включить проверку байт-кода, тогда открываем терминал и вводим:

Итоги:
В итоге мы получим небольшой прирост оперативной памяти, прирост производительности, более плавное переключение приложений, быстрый повторный запуск приложений.
Но, стоит отметить, что возможна некорректная некоторых приложений(не заметил) и у некоторых наблюдаются зависания при вынимании/вставки sd-карты!

Источник

Русские Блоги

Инструментарий Android-байт-кода

Что такое байт-код

Вставка байт-кода заключается в добавлении функций путем изменения скомпилированного файла байт-кода, то есть файла классов в процессе построения.

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

  • Открытое событие страницы (Активность, Фрагмент)
  • Статистика различных событий нажатия, в том числе Click LongClick TouchEvent
  • В течение периода отладки необходимо учитывать время, затрачиваемое каждым методом. Обратите внимание, что методы здесь включают доступ к сторонним методам SDK.
  • Быть добавленным

Какие технические моменты необходимы для достижения этих функций?

  • Аспектно-ориентированное программирование (АОП)
  • Процесс упаковки Android
  • Пользовательский плагин Gradle
  • Байт-код Java
  • Плетение байт-кода (ASM)
  • Внедрить статистические коды в сочетании с вашим собственным бизнесом

Аспектно-ориентированное программирование (АОП)

AOP (Aspect Oriented Program) — это аспект аспектно-ориентированного программирования. Эта идея программирования относится к ООП (объектно-ориентированному программированию). Говоря о разрушении неба, функция, которую мы хотим достичь, — это все еще статистика. Поэтому становится очень важно понять, что такое АОП и зачем его использовать.

Позвольте мне сначала поговорить о знакомом объектно-ориентированном программировании: характеристиками объектно-ориентированного являются наследование, полиморфизм и инкапсуляция. А инкапсуляция требует, чтобы функция была распределена по разным объектам, что часто называют распределением ответственности при разработке программного обеспечения. Фактически это означает, что разные классы могут разрабатывать разные методы. Таким образом, код разбивается на классы. Преимущество этого состоит в том, что это уменьшает сложность кода и делает класс повторно используемым.

Но объектно-ориентированное программирование по своей сути имеет недостаток децентрализации кода, одновременно увеличивая повторяемость кода. Например, я надеюсь добавить модуль статистики журнала для всех модулей в проекте. Согласно идее ООП, нам нужно добавить статистический код для каждого модуля. Однако, если вы следуете идее АОП, вы можете абстрагировать статистику в кусочки. Добавьте статистический код в раздел, и все в порядке.

Фактически, в области серверной части AOP играли все виды гангстеров, такие как среда кросс-генерации, такая как Spring. Мой первый контакт с AOP был, когда я изучал среду Spring. Наиболее распространенным способом реализации AOP является прокси.

AOP — это идея программирования, но есть много способов ее реализации, например: Spring, AspectJ, JavaAssist, ASM и т. Д. Поскольку я занимаюсь разработкой для Android, я буду использовать некоторые примеры из Android.

  • JakeWhartonhugo Это типичное приложение, которое использует собственный плагин Gradle + AspectJ для печати параметров, возвращаемых результатов и времени выполнения определенных аннотированных методов в Logcat, что удобно для разработки и отладки.
  • Недавно я изучал байт-код Java и ASM, поэтому я также написал TraceLog, реализовал ту же функцию, что и hugo, и распечатал параметры, возвращал результаты и время выполнения определенных аннотированных методов в Logcat для простоты разработки. Отладка, но я использую пользовательский плагин Gradle + ASM. Я буду говорить об этом позже.

Процесс упаковки Android

Пользовательский плагин Gradle

Как использовать Transform API

Поскольку это делается во время компиляции, необходимо найти момент времени во время компиляции.Это содержание Transform в этом разделе. После нахождения местоположения «преступления», следующим является «объект преступления». Класс байт-кода для запуска, инструмент, который будет использоваться, ASM, который будет представлен позже.

Выше приведен официальный процесс подписи компиляции и упаковки. Мы собираемся сделать компилятор Java, скомпилированный в файлы .class, для упаковки в файлы .dex. Google официально предоставляет Transfrom API после версии 1.5.0 Android Gradle, позволяя сторонним пользовательским плагинам манипулировать файлами .class во время процесса компиляции перед упаковкой файла dex, поэтому первое, что нужно сделать, это реализовать пользовательское преобразование Файл .class проходит все методы, и изменение завершается, чтобы заменить исходный файл.

Давайте поговорим о том, как вводить зависимости Transform До версии 1.5 подключаемого модуля Gradle для Android существовал отдельный API преобразования, а начиная с версии 2.0 он был непосредственно включен в API Gradle.

Gradle 1.5:

Начиная с Gradle 2.0:

Transform — это часть, которую можно использовать для повторной обработки .class и ресурса после его компиляции и компиляции в .dex. Для проверки мы строим проект Build один раз.

Хорошо видно, что ряд преобразований изначально предоставляется для использования. Итак, как эти преобразования организованы вместе, мы используем картинку для представления:

Каждое преобразование на самом деле является задачей gradle. TaskManager в компиляторе Android соединяет каждое преобразование последовательно. Первое преобразование получает результат компиляции javac и извлекается. Локальные сторонние зависимости (jar. Aar) и ресурсы ресурсов,Обратите внимание, что ресурс здесь — это не ресурс res в проекте Android, а ресурс в каталоге ресурсов., Промежуточные продукты этих компиляций передаются по цепочке, состоящей из Transform. Каждый узел Transform может обработать класс и передать его следующему Transform. Наша общая путаница, Desugar и другая логика, их реализация теперь инкапсулированы в каждом преобразовании, и наше пользовательское преобразование будет вставлено в начало этой цепочки преобразований.

Читайте также:  Savefrom net android 4pda

Но на самом деле, приведенная выше картина является лишь одним из случаев Transform. На самом деле преобразование может иметь два входа, один из которых является потребителем, текущее преобразование должно выводить потребителя в следующее преобразование, а другое является ссылкой, текущее преобразование может считывать эти входы без вывода в Следующее преобразование, такое как Instant Run, проверяет разницу между двумя компиляциями таким образом.

Преобразование интерпретации

(1)

Имя, как следует из названия, является нашим именем Transform, а затем вернемся к процессу, который мы только что создали:

Как формируется это окончательное имя? Кажется, это отличается от определенного названия на нашей стороне. Начните с преобразования, а затем скомбинируйте ContentType. Этот ContentType представляет тип входного файла этого преобразования. Существует два основных типа: один — классы, другой — ресурсы, и между ContentTypes используется соединение. , За ним следует имя Transform, а имя можно переписать и вернуть в метод getName ().

(2)

Давайте сначала посмотрим на комментарии к коду. Комментарии очень четкие. Это должны быть CLASSES (0x01) и RESOURCES (0x02), что эквивалентно типу, с которым Transform должен иметь дело.

(3)

Давайте сначала посмотрим на комментарии исходного кода. Эта функция эквивалентна Transform для обозначения области видимости.

Вообще говоря, если вы хотите обработать все байт-коды класса, мы обычно используем TransformManager.SCOPE_FULL_PROJECT для Scope. который

(4)

Переключатель инкрементной компиляции. Когда мы включаем инкрементную компиляцию, довольно много входных данных включает в себя изменение / удаление / добавление, и фактически без изменений. Необходимо выполнить следующие операции:

  • NOTCHANGED: текущий файл не нуждается в обработке, и даже операция копирования не используется;
  • ДОБАВЛЕНО, ИЗМЕНЕНО: обычная обработка, вывод на следующую задачу;
  • УДАЛЕНО: Удалите файл, соответствующий пути, полученному с помощью outputProvider.

(5)

Сначала посмотрите на примечания к исходному коду, которые являются основным кодом файлов обработки Transform:

Общее значение таково: вы должны внимательно прочитать примечания:

  • Если вход getInputs () взят для потребления, он должен быть выведен на следующий уровень после преобразования
  • Если ввод getReferencedInputs () взят, он не должен быть преобразован.
  • Зависит ли инкрементная компиляция от transformInvocation.isIncremental ().

Главное, что нужно сделать в методе transform, это сохранить входные данные в расположение, предоставленное outProvider. Смотрите рисунок ниже для сгенерированного местоположения:

Код будет описан позже. Существует два основных метода преобразования. Один transformJar является простой копией, а другой transformDirectory. Здесь мы используем ASM для изменения байт-кода.

Преобразование регистрации и использования

Зарегистрируйтесь в плагине Gradle

Байт-код Java

Фреймворк для создания байт-кода Java-ASM

Что такое ASM?

ASM — это структура манипулирования байт-кодом Java. Он может использоваться для динамического создания классов или расширения функциональности существующих классов. ASM может напрямую генерировать двоичные файлы классов или динамически изменять поведение класса, прежде чем класс будет загружен в виртуальную машину Java. Классы Java хранятся в строго отформатированных файлах .class, в которых достаточно метаданных для анализа всех элементов класса: имен классов, методов, атрибутов и байт-кода Java (инструкции). После того, как ASM прочитает информацию из файла класса, он может изменить поведение класса, проанализировать информацию о классе и даже сгенерировать новые классы в соответствии с требованиями пользователя.

Почему стоит выбрать ASM для создания байт-кода?

Некоторые предшественники провели эксперименты. Обратитесь к экспериментальным результатам команды Netease

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

Библиотека ASM — это инструмент анализа и модификации кода, основанный на уровне байт-кода Java. ASM может напрямую создавать двоичные файлы классов или динамически изменять поведение класса перед загрузкой класса в JVM.
Структура библиотеки ASM следующая:

  • Ядро: обеспечивает базовое чтение, запись и преобразование байт-кода Java и определенных API для других пакетов, а также может генерировать байт-код Java и реализовывать большинство преобразований байт-кода.
    Несколько важных классов, представленных в ASM, входят в базовый API: классы ClassReader, ClassVisitor и ClassWriter.
  • Дерево: обеспечивает представление байт-кода Java в памяти
  • Commons: предоставляет некоторые часто используемые классы и адаптеры, которые упрощают генерацию и преобразование байт-кода
  • Util: содержит некоторые справочные классы и простые классы модификации байт-кода, что полезно для разработки или тестирования
  • XML: Предоставить адаптер для преобразования XML и SAX-совместимых в структуру байт-кода, что может позволить использовать XSLT для определения преобразования байт-кода

Введение в базовый API

(1) ClassVisitor абстрактный класс

Как показано ниже, ClassVisitor предоставляет некоторые методы с тем же именем, что и у структуры класса. Эти методы будут работать с соответствующими частями класса и расположены по порядку: | visitField | visitMethod) * visitEnd
public abstract class ClassVisitor <

  • void visit(int version, int access, String name, String signature,
    String superName, String [] interfaces) Этот метод является первым методом, вызываемым при сканировании класса, и в основном используется для объявления класса. Ниже приведена принципиальная схема каждого параметра в методе: посещение (версия класса, модификатор, имя класса,
    общая информация, унаследованный родительский класс, реализованный интерфейс)
  • AnnotationVisitor visitAnnotation (String desc, boolean visible) Этот метод вызывается, когда сканер сканирует объявление аннотации класса. Ниже приведена схема каждого параметра в методе: visitAnnotation (тип аннотации, может ли аннотация быть в
    , видимый в JVM).
  • FieldVisitor visitField(int access, String name, String desc, String
    подпись, значение объекта) Этот метод вызывается, когда сканер сканирует поле в классе. Ниже приведена схема каждого параметра в методе: visitField (модификатор, имя поля, тип поля,
    общее описание, по умолчанию)
  • MethodVisitor visitMethod(int access, String name, String desc,
    Подпись строки, исключения String []) Этот метод вызывается, когда сканер сканирует метод класса. Ниже приведена принципиальная схема различных параметров метода: visitMethod (модификатор, имя метода, сигнатура метода,
    общая информация, исключение выдается)
  • void visitEnd () Этот метод вызывается, когда сканер завершает сканирование класса, если вы хотите добавить некоторые методы в класс
Читайте также:  Manga reader для андроида

(2) ClassReader class

Этот класс считывает файл .class в байтовый массив в ClassReader. Его метод accept принимает класс реализации ClassVisitor и вызывает методы в ClassVisitor по порядку.

(3) Класс ClassWriter

ClassWriter является подклассом ClassVisitor и является классом, соответствующим ClassReader. ClassReader предназначен для чтения файла .class в байтовый массив. ClassWriter предназначен для вывода содержимого байт-кода измененного класса в виде байтового массива.

(4)MethodVisitor & AdviceAdapter

MethodVisitor является абстрактным классом, и когда ClassReader ASM читает метод, он передается в интерфейс MethodVisitor для обработки.
AdviceAdapter является подклассом MethodVisitor. Использование AdviceAdapter позволяет легче изменять байт-код метода. Более важные из них следующие:

  • void visitCode (): указывает, что ASM начинает сканирование этого метода
  • void onMethodEnter (): введите этот метод
  • void onMethodExit (): выход из этого метода
  • void onVisitEnd (): указывает, что метод был проверен

(5) Абстрактный класс FieldVisitor

FieldVisitor является абстрактным классом, и когда ClassReader ASM читает Field, он передается в интерфейс FieldVisitor для обработки. Как и в случае с методом анализа MethodVisitor, вы также можете просмотреть комментарии к исходному коду для изучения, которые не будут подробно описаны здесь.

Операционные процедуры

  1. Вам необходимо создать объект ClassReader для чтения содержимого файла .class в байтовый массив
  2. Затем вам нужен объект ClassWriter для записи байтового массива байтового кода после операции
  3. Требуется фильтр событий ClassVisitor. Новый XXXVisitor будет сгенерирован при вызове определенных методов ClassVisitor
    Объект , когда нам нужно изменить соответствующий контент, нам нужно только реализовать наш собственный XXXVisitor и вернуть его.

В этой библиотеке нечего описывать, стоит упомянуть:

Руководство пользователя ASM4.pdf
https://www.ibm.com/developerworks/cn/java/j-lo-asm30/
https://www.jianshu.com/p/905be2a9a700

Несмотря на то, что с платформой ASM, вы можете легко изменить файл класса, но если вы не знакомы с использованием инфраструктуры, это все еще немного сложно написать
Люди всегда ленивы, пытаются найти несколько ярлыков, поэтому есть плагин Idea.ASM Bytecode Outline

ASM Bytecode Outline

См. Https://blog.csdn.net/ouyang_peng/article/details/100566678 для получения подробной информации.

Плагин ASM Bytecode Outline, может конвертировать Java-код в код платформы ASM, затем мы можем сначала изменить код класса, преобразовать код в код платформы ASM, а затем скопировать требуемый код в плагин, чтобы он мог Целевой класс автоматически изменяется партиями в пользовательском плагине Gradle.

TraceLog

Пользовательский плагин Gradle + ASM используется для реализации библиотеки с той же функцией, что и библиотека hugo JakeWharton.Входящие параметры, возвращаемые результаты и время выполнения определенных аннотированных методов печатаются в Logcat, что удобно для разработки и отладки.

Весь проект разделен на 3 модуля, основным из которых является вызывающая сторона, в которой используется @TraceLog. Модуль плагина представляет собой пользовательский плагин Gradle. Поскольку печать журнала не имеет ничего общего с бизнесом, функция печати журнала разделена на модуль библиотеки. Модуль плагина опирается на traceLibrary и вызывает метод в traceLibrary для печати журналов при вставке байт-кодов.

  1. Пользовательский плагин Gradle

apply plugin: ‘groovy’
// Используйте этот плагин только для использования uploadArchives
apply plugin: ‘maven’

dependencies <
// Использовать Gradle SDK
compile gradleApi()
// Используем Groovy SDK
compile localGroovy()
implementation ‘com.android.tools.build:gradle:3.5.2’
implementation ‘org.ow2.asm:asm-all:5.2’
>

sourceCompatibility = “1.8”
targetCompatibility = “1.8”

uploadArchives <
repositories.mavenDeployer <
pom.version = ‘1.0.0’
pom.artifactId = ‘tracePlugin’
pom.groupId = ‘com.example.watson.plugin’
repository(url: “file:///D:/repository/”)
>
>
TracePlugin.groovy

class TracePlugin implements Plugin<

class TraceTransform extends Transform <

class TraceVisitor extends ClassVisitor <

class TraceMethodVisitor extends AdviceAdapter <

2. Сторонние библиотечные файлы

Видно, что TraceMethodVisitor пользовательского подключаемого модуля Gradle будет вставлять необходимые функции до и после выполнения метода, и эти функции являются содержимым сторонней библиотеки.

apply plugin: ‘com.android.library’

android <
compileSdkVersion 29
buildToolsVersion “29.0.2”

dependencies <
compile ‘org.ow2.asm:asm-all:5.2’
>
MethodCache.java

public class MethodCache <

public class MethodInfo <

public class Printer <
private static final String TAG = “TraceLog”;

>
Наконец, определение аннотации:

@Target(ElementType.METHOD)
public @interface TraceLog <
>
2. Основной модуль

Основным модулем является пользователь, способ использования:

(1) Добавьте зависимости в gradle.build проекта:

buildscript <
repositories <
maven <
url uri(‘D:/repository’)
>
>
dependencies <
classpath ‘com.example.watson.plugin:tracePlugin:1.0.0’
>
>
Хранилище, которое я здесь использую, является локальной папкой, в будущем вы можете загрузить сервер, чтобы вы могли полагаться на него удаленно

(2) Примените плагин к build.gradle в используемом модуле:

apply plugin: com.example.watson.plugin.TracePlugin
Также добавьте сторонние библиотечные зависимости

implementation project(’:tracelibrary’)
Здесь я напрямую зависим от локального модуля, который может быть упакован в виде пакета aar или загружен на сервер в будущем для достижения удаленной зависимости

(3) Добавить заметки

Добавьте аннотацию @TraceLog к методу, который нужно подключить

public class MainActivity extends AppCompatActivity <
private static final String TAG = “MainActivity”;

После компиляции мы можем найти файл-подобный метод после вплетения в код:

Источник

Оцените статью