что такое байт код на андроиде
Отключение проверки байт-кода для ускорения работы ОС 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.
Если вы полностью доверяете всему коду, который вы запускаете, это менее полезно, так как в этом случае он просто поймает случайные ошибки. Также возможно, что информация о проверке поступает в оптимизатор – не уверен в этом, но оптимизатор в любом случае должен проверить код, чтобы выполнить какой-либо полезный статический анализ.
В общем-то, это пункт дает дополнительную защиту при запуске программ из неизвестных источников. Программу проверяется побайтно, что может занять большое количество времени, но после этого сюрпризов быть недолжно. Не произойдет внезапная смена типа данных, не будут вылезать ошибки, с перенаправлением на другие страницы, телефон по тихому не будет передавать данные.
Опять же, здесь все зависит от разработчиков. У вас установлен не искусственный интеллект, а обычная программа, которая найдет только очевидные проблемы. Но даже так, это гораздо лучше, чем ничего. Так что стоит отключать режим побайтной проверки кода или нет решать вам.
Все о функциях разработчика в вашем телефоне
Константин Иванов
Настройки, которые используются для отладки и для разработки приложений, спрятаны в вашем телефоне – спрятаны в прямом смысле слова. Многие из нас идут в соответствующий раздел меню, чтобы запустить отладку USB или переключиться к рабочему модулю ART, но кроме этого, здесь имеется целый список настроек. Большая часть никогда вам не понадобится, но разве не интересно узнать, что скрывается в недрах вашего устройства?
«Разблокируем» функции разработчика в телефоне
Как говорилось выше, эти функции изначально скрыты. Это имеет смысл, поскольку найти их просто, а большинству людей они попросту не нужны. Для того, чтобы добраться до них, идем в раздел «Об устройстве» и ищем там пункт «Номер сборки». После пяти быстрых тапов появляется диалоговое окно – теперь устройство считает вас разработчиком. Только попробуйте ничего не испортить, ладно? Ну, или делайте что хотите – тоже вариант. Так или иначе, возможность заставить ваш телефон перестать работать всегда имеется.
А теперь посмотрим на предложенные функции повнимательнее.
Настройки
Понятно, что большинству пользователей все эти настройки ни на что не сдались. Кроме того, лезть туда и нажимать на пункты меню ради самого процесса — не лучшая идея. Но всегда стоит знать, что вообще можно сделать, хотя бы и просто для того, чтобы не делать этого никогда.
Надеемся, что наш рассказ просветил вас немного по вопросу этих настроек и опций, записанных непонятными словами. Кстати, в зависимости от выбранного языка системы, производителя и версии ОС Android, набор пунктов может несколько отличаться разделами и их названиями.
Введение в байт-код Java
May 15 · 6 min read
Каждому Java-разработчику известно, какую роль в экосистеме языка играет JVM. Однако большинство не разбирается в том, как работает JVM под капотом. Хотя для разработки на Java это не обязательно, код станет лучше, если вы глубже поймете JVM, потому что так вы будете знать, как каждая строка кода влияет на процессы внутри JVM.
Однако для начала нужно понять, что такое байт-код. Итак, поговорим о вводе и выводе байт-кода Java и о том, как он влияет на JVM во время запуска программы.
Что такое байт-код Java?
Если в какой-то момент профессиональной жизни вы слышали, как проповедуют независимость Java-программ от платформ, скажите спасибо байт-коду.
Как генерируется байт-код?
Как посмотреть байт-код Java?
Если вам хочется увидеть сам байт-код, простейший способ — воспользоваться командной строкой.
Как работает JVM
Прежде чем углубляться в байт-код, стоит понять, как JVM его обрабатывает.
Методы — одна из важнейших составляющих кода для JVM. Среда выполнения Java-программы — это, по сути, набор методов, вызываемых JVM. JVM создает фрейм для каждого такого метода и помещает созданный фрейм наверх стека текущего потока для выполнения.
Фрейм состоит из локальной среды, которая необходима для поддержания его выполнения. Как правило он содержит массив локальных переменных и стек операндов. Посмотрим, что эти элементы из себя представляют.
Массив локальных переменных
Массив локальных переменных, как следует из названия, нужен для хранения локальных переменных в методе. Также он хранит аргументы, которые принимает метод.
Определим два метода: один статический и один метод экземпляра, но схожие во всем остальном.
Локальные массивы переменных для этих методов будут выглядеть следующим образом:
Стек операндов
Стек операндов — это рабочее пространство внутри фрейма метода. Поскольку это стек, вы можете помещать и забирать значения только из верхней его части. Большинство инструкций байт-кода, принадлежащих определенному методу, либо участвуют в помещении значений в стек, либо забирают значения из стека для обработки.
Инструкция байт-кода load и ее расширения нужны для перемещения значения, хранящегося в массиве переменных, в стек. Инструкция store применяется для извлечения значений из стека и сохранения в массиве переменных. Существуют и другие инструкции, которые извлекают значения из стека для обработки.
Посмотрим в байт-код
Ради возможности вглядеться в байт-код, я написал простой Java-класс:
Деконструкция байт-кода
Здесь важно отметить еще одно: индексы, заданные инструкциям байт-кода — как видим, они не увеличиваются на единицу для каждой новой инструкции.
Число перед инструкцией указывает на индекс ее начального байта. А любой байт-код состоит из однобайтовых опкодов, за которыми следует ноль или более операндов.
Вывод
Надеюсь, вам удалось узнать кое-что новое о том, как работает байт-код Java. С этим более четким знанием вы сможете лучше писать код. Можете даже поэкспериментировать с самим байт-кодом во время выполнения программы, воспользовавшись такими библиотеками, как ASM.
Русские Блоги
Инструментарий Android-байт-кода
Что такое байт-код
Вставка байт-кода заключается в добавлении функций путем изменения скомпилированного файла байт-кода, то есть файла классов в процессе построения.
Проще говоря, мы хотим добиться полной статистики клиентов без скрытых точек. Диапазон статистических сводок здесь относительно широк, и распространенными сценариями являются:
Какие технические моменты необходимы для достижения этих функций?
Аспектно-ориентированное программирование (АОП)
Позвольте мне сначала поговорить о знакомом объектно-ориентированном программировании: характеристиками объектно-ориентированного являются наследование, полиморфизм и инкапсуляция. А инкапсуляция требует, чтобы функция была распределена по разным объектам, что часто называют распределением ответственности при разработке программного обеспечения. Фактически это означает, что разные классы могут разрабатывать разные методы. Таким образом, код разбивается на классы. Преимущество этого состоит в том, что это уменьшает сложность кода и делает класс повторно используемым.
Но объектно-ориентированное программирование по своей сути имеет недостаток децентрализации кода, одновременно увеличивая повторяемость кода. Например, я надеюсь добавить модуль статистики журнала для всех модулей в проекте. Согласно идее ООП, нам нужно добавить статистический код для каждого модуля. Однако, если вы следуете идее АОП, вы можете абстрагировать статистику в кусочки. Добавьте статистический код в раздел, и все в порядке.
Фактически, в области серверной части AOP играли все виды гангстеров, такие как среда кросс-генерации, такая как Spring. Мой первый контакт с AOP был, когда я изучал среду Spring. Наиболее распространенным способом реализации AOP является прокси.
Процесс упаковки Android
Пользовательский плагин Gradle
Как использовать Transform API
Давайте поговорим о том, как вводить зависимости Transform До версии 1.5 подключаемого модуля Gradle для Android существовал отдельный API преобразования, а начиная с версии 2.0 он был непосредственно включен в API Gradle.
Gradle 1.5:
Начиная с Gradle 2.0:
Но на самом деле, приведенная выше картина является лишь одним из случаев Transform. На самом деле преобразование может иметь два входа, один из которых является потребителем, текущее преобразование должно выводить потребителя в следующее преобразование, а другое является ссылкой, текущее преобразование может считывать эти входы без вывода в Следующее преобразование, такое как Instant Run, проверяет разницу между двумя компиляциями таким образом.
Преобразование интерпретации
Давайте сначала посмотрим на комментарии к коду. Комментарии очень четкие. Это должны быть CLASSES (0x01) и RESOURCES (0x02), что эквивалентно типу, с которым Transform должен иметь дело.
Давайте сначала посмотрим на комментарии исходного кода. Эта функция эквивалентна Transform для обозначения области видимости.
Вообще говоря, если вы хотите обработать все байт-коды класса, мы обычно используем TransformManager.SCOPE_FULL_PROJECT для Scope. который
Переключатель инкрементной компиляции. Когда мы включаем инкрементную компиляцию, довольно много входных данных включает в себя изменение / удаление / добавление, и фактически без изменений. Необходимо выполнить следующие операции:
Сначала посмотрите на примечания к исходному коду, которые являются основным кодом файлов обработки Transform:
Общее значение таково: вы должны внимательно прочитать примечания:
Главное, что нужно сделать в методе transform, это сохранить входные данные в расположение, предоставленное outProvider. Смотрите рисунок ниже для сгенерированного местоположения:
Код будет описан позже. Существует два основных метода преобразования. Один transformJar является простой копией, а другой transformDirectory. Здесь мы используем ASM для изменения байт-кода.
Преобразование регистрации и использования
Зарегистрируйтесь в плагине Gradle
Байт-код Java
Фреймворк для создания байт-кода Java-ASM
Что такое ASM?
Почему стоит выбрать ASM для создания байт-кода?
Некоторые предшественники провели эксперименты. Обратитесь к экспериментальным результатам команды Netease
Как видно из таблицы выше, ASM более эффективен. Однако предпосылка высокой эффективности заключается в том, что синтаксис библиотеки ближе к уровню байт-кода. Следовательно, приведенные выше знания о виртуальных машинах важнее.
Введение в базовый API
(1) ClassVisitor абстрактный класс
Как показано ниже, ClassVisitor предоставляет некоторые методы с тем же именем, что и у структуры класса. Эти методы будут работать с соответствующими частями класса и расположены по порядку: | visitField | visitMethod) * visitEnd
public abstract class ClassVisitor <
(2) ClassReader class
(3) Класс ClassWriter
(4)MethodVisitor & AdviceAdapter
MethodVisitor является абстрактным классом, и когда ClassReader ASM читает метод, он передается в интерфейс MethodVisitor для обработки.
AdviceAdapter является подклассом MethodVisitor. Использование AdviceAdapter позволяет легче изменять байт-код метода. Более важные из них следующие:
(5) Абстрактный класс FieldVisitor
FieldVisitor является абстрактным классом, и когда ClassReader ASM читает Field, он передается в интерфейс FieldVisitor для обработки. Как и в случае с методом анализа MethodVisitor, вы также можете просмотреть комментарии к исходному коду для изучения, которые не будут подробно описаны здесь.
Операционные процедуры
В этой библиотеке нечего описывать, стоит упомянуть:
Руководство пользователя 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 для печати журналов при вставке байт-кодов.
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”;
После компиляции мы можем найти файл-подобный метод после вплетения в код: