В какой тип упаковываются файлы packaging в ос android
Прежде всего, следует отметить, что независимо от того, какой пакет или инструмент используется для упаковки, он стоит за выполнением системы сборки, предоставляемой Android. Поэтому сначала мы представляем из каждого процесса, как система Android Build упаковывает java-файлы, файлы ресурсов, сторонние библиотеки и т. Д. В APK, шаг за шагом.
Предварительная компиляция файлов ресурсов
Первым шагом в процессе упаковки является предварительная компиляция файла ресурсов. Файл ресурсов включает все файлы, расположенные в каталоге res /, и все файлы AndroidManifest. На этом этапе Android использует инструмент aapt для компиляции файлов ресурсов для создания файлов R. . Каждый идентификатор в файле R имеет особое правило. Каждый идентификатор представляет собой четырехбайтовое число 0x PPTTNNNN. Первый байт PP представляет имя пакета, представленного файлом ресурсов. В приложении Android PP Всегда 7f. Второй байт TT представляет тип файла ресурсов. Aapt начинается с 0 и увеличивается на 1 каждый раз, когда обнаруживается новый тип ресурса. Последние два байта NNNN представляют собой последовательный индекс файла ресурсов в этом типе, за которым следует TT. Аналогичным образом, начиная с 0, добавьте 1 к каждому найденному имени нового файла ресурсов. Например, давайте посмотрим на R-файл, созданный в нашем проекте.
Мы можем использовать команду appt для вывода списка всех файлов ресурсов в упакованном apk.
appt dump resources
Компиляция файла AIDL
AIDL означает язык определения интерфейса Android. Если Android включает несколько процессов, таких как удаленные службы, вам необходимо определить вспомогательные файлы для единообразного описания интерфейсов для взаимодействия.
interface IMyAidlInterface < /** * Demonstrates some basic types that you can use as parameters * and return values in AIDL. */ void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString);>
1
Когда Android упакован, файл aidl будет преобразован в интерфейс Java с тем же именем, как показано на рисунке ниже, вы можете увидеть его в / build / generated / source / aidl.
Компиляция файлов Java
Создать файл .dex
На четвертом шаге файл класса, созданный на предыдущем шаге, и файл класса в указанной сторонней библиотеке вместе преобразуются в байт-код Dalvik.
Хотя Android использует программирование на языке Java. Но Android не использует стандартную виртуальную машину Java для кода Java. Android имеет собственную виртуальную машину Dalvik и ART выше 5.0. Вы можете примерно понять разницу между виртуальной машиной Dalvik и традиционной виртуальной машиной:
Виртуальная машина Dalvik занимает меньше памяти
JVM - это стек (стек), DVM - регистр (регистр). Кроме того, JVM хранит локальные переменные в стеке, а DVM хранит переменные в регистре. . Следовательно, стандартной виртуальной машине Java требуется больше наборов инструкций, тогда как DVM имеет меньше наборов инструкций. С другой стороны, DVM должен использовать регистры для кодирования источника и назначения инструкции, поэтому одна инструкция Dalvik длиннее.
Когда JVM запущена, она загружает каждый файл класса по мере необходимости. Все классы в Dalvik находятся в файле dex.
Исходя из третьего различия, все файлы классов, которые мы создали на третьем шаге, и файлы классов, на которые имеются ссылки в третьей библиотеке, должны быть интегрированы в один файл dex.
Однако существует потенциальная опасность. Из-за конструкции dex максимальное количество методов, которые могут быть указаны в одном dex, составляет 65536. Этого числа сегодня недостаточно для многих приложений. В нашем проекте это невозможно. наткнулся на. Однако Google также рано выпустил решение. Я не буду здесь подробно обсуждать это, если вам интересно, вы можете нажать здесь.
Упаковка файлов ресурсов
Первым шагом является то, что файлы ресурсов были предварительно скомпилированы с использованием aapt, чтобы все файлы java, которые ссылаются на ресурсы, могли компилироваться обычным образом.Перед упаковкой система сборки Android должна упаковать все файлы ресурсов. Вот еще инструмент aapt, использованный на первом этапе. После упаковки будет сгенерирован файл resources-debug.ap_. Этот файл содержит изображения, макет, меню, анимацию, AndroidManifest. Изображения оптимизированы, а файл xml компилируется в двоичный формат. Строка составляется в отдельный файл resources.arsc.
Пятый шаг - упаковать APK.Работа на этом шаге состоит в том, чтобы упаковать файл dex и файл ресурсов (скомпилированный и некомпилированный) вместе для создания apk.
Файл apk, созданный на шаге 5, необходимо подписать, прежде чем его можно будет установить на устройство. Перед подписанием мы должны создать собственное хранилище ключей.
$ keytool -genkey -v -keystore my-release-key.keystore-alias alias_name -keyalg RSA -keysize 2048 -validity 10000
1
Используйте keytool для создания хранилища ключей, которое содержит ключ, действительный в течение 10 000 дней.
Чтобы подписать apk, вам необходимо использовать инструмент подписи, предоставляемый java.
$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1-keystore my-release-key.keystore my_application.apk alias_name
1
Если вам нужно проверить, подписан ли apk, вы можете использовать
jarsigner -verify -verbose -certs my_application.apk
1
выровнять
Последним этапом упаковки apk является работа по выравниванию. Короче говоря, инструмент для этого шага состоит в том, чтобы выровнять все несжатые файлы в apk с фактической позицией apk на 4 байта. Таким образом, к этим файлам можно получить прямой доступ с помощью сопоставления mmap. Цель этого - уменьшить объем памяти, занимаемой приложением во время выполнения.
Андроид после того как вышел в 2007 году претерпел множество изменений связанный с билд процессом, средой исполнения и улучшениями производительности.
У андроида много удивительных характеристик и одна из них разные архитектуры процессоров такие как ARM64 и x86
Невозможно скомпилировать код, который поддерживает каждую архитектуру. Вот именно поэтому используется Java виртуальная машина.
WARNING
Чтобы подписать приложение с помощью apk-signer, ты должен установить Android SDK и указать полный путь до него в настройках приложения.
Вся информация предоставлена исключительно в ознакомительных целях. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный материалами данной статьи.
Теперь этим ключом можно подписать APK. На вкладке APK Signer выбираем только что сгенерированный файл, вводим пароль, алиас ключа и пароль к нему, затем находим файл APK и смело жмем кнопку «Sign». Если все пройдет нормально, пакет будет подписан.
Так как мы подписали пакет нашим собственным ключом, он будет конфликтовать с оригинальным приложением, а это значит, что при попытке обновить софтину через маркет мы получим ошибку.
Цифровая подпись необходима только стороннему софту, поэтому если ты занимаешься модификацией системных приложений, которые устанавливаются копированием в каталог /system/app/, то подписывать их не нужно.
Обычно авторы приложений создают специальные классы для вывода рекламы и вызывают методы этих классов во время запуска приложения или одной из его «активностей» (упрощенно говоря, экранов приложения). Попробуем найти эти классы. Идем в каталог smali, далее com (в org лежит только открытая графическая библиотека cocos2d), далее kauf (именно туда, потому что это имя разработчика и там лежит весь его код) — и вот он, каталог marketing. Внутри находим кучу файлов с расширением smali. Это классы, и наиболее примечателен из них класс Ad.smali, по названию которого нетрудно догадаться, что именно он выводит рекламу.
Мы могли бы изменить логику его работы, но гораздо проще будет тупо убрать вызовы любых его методов из самого приложения. Поэтому выходим из каталога marketing и идем в соседний каталог particle, а затем в virtualtorch. Особого внимания здесь заслуживает файл MainActivity.smali. Это стандартный для Android класс, который создается Android SDK и устанавливается в качестве точки входа в приложение (аналог функции main в Си). Открываем файл на редактирование.
Внутри находится код smali (местный ассемблер). Он довольно запутанный и трудный для чтения в силу своей низкоуровневой природы, поэтому мы не будем его изучать, а просто найдем все упоминания класса Ad в коде и закомментируем их. Вбиваем строку «Ad» в поиске и попадаем на строку 25:
Здесь происходит создание объекта. Комментируем. Продолжаем поиск и находим в строках 433, 435, 466, 468, 738, 740, 800 и 802 обращения к методам класса Ad. Комментируем. Вроде все. Сохраняем. Теперь пакет необходимо собрать обратно и проверить его работоспособность и наличие рекламы. Для чистоты эксперимента возвращаем удаленную из AndroidManifest.xml строку, собираем пакет, подписываем и устанавливаем.
Наш подопытный кролик. Видна реклама Он же, но уже без рекламы
Оп-па! Реклама пропала только во время работы приложения, но осталась в главном меню, которое мы видим, когда запускаем софтину. Так, подождите, но ведь точка входа — это класс MainActivity, а реклама пропала во время работы приложения, но осталась в главном меню, значит, точка входа другая? Чтобы выявить истинную точку входа, вновь открываем файл AndroidManifest.xml. И да, в нем есть следующие строки:
Они говорят нам (и, что важнее, андроиду) о том, что активность с именем Start должна быть запущена в ответ на генерацию интента (события) android.intent.action.MAIN из категории android.intent.category.LAUNCHER. Это событие генерируется при тапе на иконку приложения в ланчере, поэтому оно и определяет точку входа, а именно класс Start. Скорее всего, программист сначала написал приложение без главного меню, точкой входа в которое был стандартный класс MainActivity, а затем добавил новое окно (активность), содержащее меню и описанное в классе Start, и вручную сделал его точкой входа.
Открываем файл Start.smali и вновь ищем строку «Ad», находим в строках 153 и 155 упоминание класса FirstAd. Он тоже есть в исходниках и, судя по названию, как раз и отвечает за показ объявлений на главном экране. Смотрим дальше, идет создание экземпляра класса FirstAd и интента, по контексту имеющего отношение к этому экземпляру, а дальше метка cond_10, условный переход на которую осуществляется аккурат перед созданием экземпляра класса:
Скорее всего, программа каким-то случайном образом вычисляет, нужно ли показывать рекламу на главном экране, и, если нет, перескакивает сразу на cond_10. Ок, упростим ей задачу и заменим условный переход на безусловный:
Больше упоминаний FirstAd в коде нет, поэтому закрываем файл и вновь собираем наш виртуальный факел с помощью apktool. Копируем на смартфон, устанавливаем, запускаем. Вуаля, вся реклама исчезла, с чем нас всех и поздравляем.
- Перевод приложений Android;
- пример снятия триала с приложения.
Комплияция в .dex файл
Во время компиляции происходит конвертация .class класс файл и .jar библиотеки в один classes.dex файл, который содержит Dalvik байткод.
Команда dx превращает все .class и .jar файлы в один classes.dex файл, который написан с форматом Dalvik байткода.
Dex — это аббревиатура с английского — Dalvik Executable.
Немного матчасти
Google Play Services, gapps, Google Play. Включают в себя как базовые сервисы, необходимые для работы push-уведомлений, геолокации, синхронизации различных данных с Google так и остальной пользовательский софт, использующий всё это (например, Gmail).
Тип уведомлений, работающий через сторонний сервер. Позволяет значительно экономить батарейку, т.к. устройство может полностью заснуть и просыпаться через небольшие промежутки времени, проверяя только одно сетевое соединение на наличие новых событий.
По умолчанию, устройства на Android идут с заблокированным загрузчиком. Обычно, требуется произвести эту процедуру, чтобы иметь возможность устанавливать любые другие прошивки. Разблокировка загрузчика обычно не только даёт возможность модифицировать системные разделы, но и отключает проверку подписи ядра при загрузке.
Права суперпользователя. Точно так же, по умолчанию обычно их нет и необходимо их получать тем или иным способом. Либо установкой прошивки (для lineageos есть addon-su), либо magisk. Обычно в инструкциях предлагают ставить проприетарный и купленный китайцами SuperSU (мы их слушать не будем и поставим опенсорсный magisk). В особо тяжелых случаях иногда приходится использовать эксплоиты (вроде KingRoot).
Позволяет устанавливать прошивки и их модификации в виде zip-архивов. Обычно это TWRP, тоже проект с открытым исходным кодом.
Помимо предоставления root, имеет встроенный модуль для скрытия этого самого root от некоторых приложений (полезно для банк-клиентов) и большое множество сторонних модулей. В контексте этого поста для нас будет самым полезным модуль для установки Xposed.
Если Magisk предоставляет модули для модификации базовой системы, то xposed предоставляет модули для модификации и патчинга на лету самого Android. В контексте этого поста будет полезным модуль FakeGapps. Рекомендую ставить его через Magisk, и для конкретной API-версии (соответствующей вашей версии android). К сожалению, обычно поддержка прошивок отстает на одну версию android.
Каталог открытого ПО для Android. Можно использовать как официальный репозиторий, так и сторонние.
Флагман среди opensource-прошивок. Бывший Cyanogenmod.
Каждый этап описанного процесса
Android Asset Packaging Tool
AAPT2 — аббревиатура (Android Asset Packaging Tool) — компилирует манифест и файлы ресурсов в один APK.
Этот процесс разделен на два шага компиляцию и линковку Это улучшает производительность так как если вы поменяете один файл, вам нужно компилировать только его и прилинковать к остальным файлам командой 'link'
AAPT2 может компилировать все типы андроид ресурсов, таких как drawables и XML файлы.
При вызове AAPT2 для компиляции, туда передается по одному ресурсному файлу на каждый вызов
Затем APPT2 парсит файл и генерирует промежуточный бинарный файл с расширением .flat
Фаза линковки склеивает все промежуточные файлы сгенерированные в фазе компиляции и дает нам на выход один .apk файл. Вы также можете сгенерировать R.java файл и правила для proguard в это же время.
Энергопотребление
Исходит из предыдущего тезиса. Если приложения не загружают рекламу, не отправляют статистику и не следят за вами, они потребляют меньше электроэнергии. Это же касается gapps: зачастую, они являются главным потребителем электроэнергии. Да, Google в последнее время серьёзно работает над энергопотреблением. Однако, во-первых, не у всех есть возможность использовать актуальные версии Android. Во-вторых, даже в этих условиях замена gapps на более простое и минималистичное решение позволит вам еще сильнее продлить жизнь от батарейки.
Устройство APK-пакетов и их получение
Пакет приложения Android, по сути, является обычным ZIP-файлом, для просмотра содержимого и распаковки которого никаких специальных инструментов не требуется. Достаточно иметь архиватор — 7zip для Windows или консольный unzip в Linux. Но это что касается обертки. А что внутри? Внутри же у нас в общем случае такая структура:
- META-INF/ — содержит цифровой сертификат приложения, удостоверяющий его создателя, и контрольные суммы файлов пакета;
- res/ — различные ресурсы, которые приложение использует в своей работе, например изображения, декларативное описание интерфейса, а также другие данные;
- AndroidManifest.xml — описание приложения. Сюда входит, например, список требуемых разрешений, требуемая версия Android и необходимое разрешение экрана;
- classes.dex — компилированный байт-код приложения для виртуальной машины Dalvik;
- resources.arsc — тоже ресурсы, но другого рода — в частности, строки (да-да, этот файл можно использовать для русификации!).
Перечисленные файлы и каталоги есть если не во всех, то, пожалуй, в абсолютном большинстве APK. Однако стоит упомянуть еще несколько не столь распространенных файлов/каталогов:
- assets — аналог ресурсов. Основное отличие — для доступа к ресурсу необходимо знать его идентификатор, список asset’ов же можно получать динамически, используя метод AssetManager.list() в коде приложения;
- lib — нативные Linux-библиотеки, написанные с помощью NDK (Native Development Kit).
Этот каталог используют производители игр, помещая туда движок игры, написанный на C/C++, а также создатели высокопроизводительных приложений (например, Google Chrome). С устройством разобрались. Но как же получить сам файл пакета интересующего приложения? Поскольку без рута с устройства забрать файлы APK не представляется возможным (они лежат в каталоге /data/app), а рутить не всегда целесообразно, имеется как минимум три способа получить файл приложения на компьютер:
- расширение APK Downloader для Chrome;
- приложение Real APK Leecher;
- различные файлообменники и варезники.
Какой из них использовать — дело вкуса; мы предпочитаем использовать отдельные приложения, поэтому опишем использование Real APK Leecher, тем более что написан он на Java и, соответственно, работать будет хоть в винде, хоть в никсах.
Настройка Real APK Leecher
Другие статьи в выпуске:
Подписывание APK файла
Все Apk файлы требуют цифровую подпись до того как они могут быть установлены на ваш девайс
Для дебаг билдов, андроид студия автоматически подписывает приложение используя дебажный сертификат сгенерированный с помощью android sdk tools.
Дебажный кейстор и дебажный сертификат создаются автоматически
Для релиз билдов вам нужен кейстор, которым вы подпишете свой apk файл. Вы можете создать APK файл в андроид студии через «Generated Signed Apk» опцию.
Каждый выбирает свой "уровень погружения". Вам не обязательно следовать каждому пункту из этого поста. Моя цель — показать, насколько хорошо развита экосистема на данный момент и чего вы можете и не можете от неё получить. Делайте выводы самостоятельно. Хотите — меняйте прошивку полностью и переходите на microg. Хотите — просто поставьте на свой телефон f-droid прямо рядом с gplay. Хотите — не делайте ничего.
Давайте поговорим об экосистеме приложений свободных приложений с открытым исходным кодом на Android. Попробуем установить MicroG — свободную реализацию сервисов Google на Android. Посмотрим, как и зачем со всем этим жить.
D8 и R8
Начиная с андроид студии 3.1 и далее, D8 был сделан дефолтным компилятором.
D8 производит более маленькие dex файлы с лучшей производительностью, если сравнивать со старым dx.
R8 используется для компиляции кода. R8 это оптимизированная версия D8
D8 играет роль конвертера класс файлов в Dex файлы, а также производит дешугаринг функций из Java 8 в байткод, который может быть запущен на андроиде
R8 оптимизирует dex байткод. Он предоставляет такие фичи как оптимизация, обфускация, удаление ненужных классов.
Обфускация уменьшает размер вашего приложения укорачивая названия классов, методов и полей.
Обфускация имеет и другие преимущества для предотвращения реверс инжиниринга, но основная цель уменьшить размер.
Оптимизация уменьшает размер Dex файла путем переписывания ненужных частей кода и инлайнинга.
С помощью дешугаринга мы можем использовать удобные фичи языка Java 8 на андроиде.
Понимание Java виртуальной машины
JVM это виртуальная машина, позволяющая устройству запускать код, который скомпилирован в Java байткод
Используя JVM, вы избавляетесь от проблемы с разной архитектурой процессоров.
JVM предоставляет переносимость и она позволяет запускать Java код в виртуальной среде, вместо того, чтобы запускать его сразу «на железе»
Но JVM была создана для систем с большими мощностями по ресурсам, а наш андроид имеет сравнительно мало памяти и заряда батареи.
По этой причине Google создал адаптированную под андроид виртуальную машину, которая называется Dalvik.
Компилируем исходный код
Наш исходный Java код для андроида компилируется в класс файл .class с байткодом с помощью javac компилятора и запускается на JVM
Для котлина есть kotlinc компилятор, который делает совместимый с Java байткод.
Байткод — это набор инструкций, который выполняется на целевом устройстве.
Java байткод — это набор инструкций для Java виртуальной машины.
Resource Files
Файлы находящиеся в директории с ресурсами
Google Play далеко "не торт"
Далеко ходить не нужно, в соседних постах можно найти множество примеров того, как разработчиков выгоняют из Google Play по тем или иным причинам, заставляя общаться с ботами без возможности реальной аппеляции. Некоторые типы приложений теперь принципиально невозможно распространять (например, блокировщики рекламы, да и в принципе приложения обхода любых ограничений).
Мне, как параноику, не нравится, что у стороннего лица появляется практически полный доступ к моему устройству. Google способен как минимум удалить с моего телефона любое приложение в любой момент и собрать с него произвольные данные. Более того, google play service — это огромное (стандартная поставка — 600Мб, минимальная — 95Мб) количество постоянно обновляющегося кода, часть которая работает с системными привилегиями. Для сравнения, дистрибутив MicroG может весить всего 4Мб.
На каких устройствах это будет работать?
Условно все устройства можно поделить на следующие классы (в порядке убывания удобности):
-
. Наличие официального порта обычно является не только гарантией более-менее нормальной работы, но и наличия множества других прошивок под это устройство. Естественно, лучше проверять информацию (и о наличии прошивок, и о возможных сюрпризах) на 4pda/xda до покупки. К сожалению, совсем новых устройств вы там обычно не увидите.
- Устройства с неофициальными портами lineageos/других прошивок. Обычно, немного хуже, но жить все равно можно.
- Устройства без сторонних прошивок, но с root. Сложнее избавляться от bloatware и gapps (однако, с NanoDroid это теперь можно делать в автоматическом режиме). Никаких гарантий, что вы удалили все вредоносные приложения от производителя.
При выборе устройства так же нужно смотреть на:
- Собственно покрытие прошивками. Хорошее коммьюнити вокруг телефона обычно дает более крепкие гарантии на обновление прошивки, чем типичный производитель.
- Некоторые производители ограничивают возможность разблокировки загрузчика.
- Например, у xiaomi присутствует задержка от нескольких дней до недель от привязки телефона к аккаунту до первой разблокировки.
- Huawei недавно в принципе перестала выдавать коды разблокировки (особо не разбирался, как минимум для нескольких устройств). Фу на них, но за несколько долларов до сих пор можно купить код разблокировки на стороне.
AIDL Files
AIDL — аббревиатура Android Interface Definition Language, позволяет вам описать интерфейс межпроцессорного взаимодействия.
AIDL — может использоваться между любыми процессами в андроиде.
Source Code (Исходный код)
Это Java и Kotlin файлы в src пакете.
Итоги
Эта статья лишь краткое введение в методы вскрытия и модификации Android-приложений. За кадром остались многие вопросы, такие как снятие защиты, разбор обфусцированного кода, перевод и замена ресурсов приложения, а также модификация приложений, написанных с использованием Android NDK. Однако, имея базовые знания, разобраться во всем этом — лишь вопрос времени.
Пакет приложения мы прописываем в визарде создания приложения.
Потом его можно найти в манифесте.
Он же по дефолту становится пакетом для Java-классов
Как-то не особо значимая цель .
Может быть он используется как-то еще? Оказывается да. Более того, пакет - это крайне важная вещь при создании приложения. Пакет является идентификатором приложения в системе. Т.е. когда вы устанавливаете приложение, система смотрит его пакет и ищет уже установленное приложение с таким пакетом. Если не нашлось, то все ок и приложение устанавливается.
А вот если нашлось, то тут в дело вступает механизм подписи приложения ключом, который мы рассмотрели на прошлом уроке. Система проверяет, если установленное и устанавливаемое приложения подписаны одним и тем же ключом, то, вероятнее всего, это означает, что оба приложения создал один автор. И устанавливаемое приложение является обновлением установленного, т.к. их пакеты и ключи одинаковы. Система устанавливает новое приложение, заменяя старое - т.е. обновляет старое.
Если же система определила, что приложения были подписаны разными ключами, то это значит, что приложения были созданы разными авторами, пакеты совпали случайно, и новое вовсе не является обновлением старого. В этом случае при установке нового, старое было бы заменено, а значит потеряно (а не обновлено), т.к. приложения абсолютно разные. И система не дает поставить новое приложение, пока не будет вручную удалено старое.
Проведем пару тестов. Я создам два приложения Package1 и Package2 с одинаковым пакетом.
Установлю первое. Оно появилось в списке.
Теперь не удаляя первое, установлю второе.
Первое исчезло. Осталось только второе.
Система решила, что второе является обновлением первого (т.к. пакеты и ключи совпадают), поэтому первое благополучно снесла и заменила вторым. Собственно, это и происходит при обычном обновлении.
Теперь подпишу Package2 другим ключом, чем оно было подписано изначально и попробую обновить через adb.
Параметр r здесь означает, что приложение надо переустановить, если оно уже существует.
Видим ошибку Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES]. Система сверила ключи у установленного и устанавливаемого приложений, увидела, что они разные и решила, что это будет не обновление, а просто приложение от другого разработчика ломится с тем же пакетом. И вполне разумно решила не удалять имеющееся приложение, а предупредить пользователя, что не совпадают ключи.
Из вышесказанного можно сделать следующий вывод: ваш ключ, которым вы подписываете приложение ни в коем случае нельзя терять или давать кому-либо.
Если вы ключ потеряете, то ваше приложение навсегда потеряет возможность быть обновленным. Даже если вы создадите новый ключ с тем же алиасом, паролем и данными владельца, это все равно будет другой ключ. И подписанная им следующая версия приложения будет рассматриваться системой не как обновление, а как попытка приложения от другого разработчика заменить ваше приложение и не даст его установить, пока не удалите установленное.
Если же вы ключ кому-то предоставите, то этот человек сможет сделать обновление для вашего приложения без вашего участия. И если этот человек имеет доступ и к вашей учетке разработчика в маркете, то он сможет залить туда свою версию вашего приложения.
Также не забывайте пароли от хранилища и от ключа. Это будет равносильно тому, что вы потеряли ключ. В общем, относитесь к вашим ключам со всей серьезностью.
И в конце урока небольшой ликбез. Пакет имеет еще одно значение. Как вы уже наверно заметили по вкладке Devices в Eclipse, пакет используется в качестве имени процесса, в котором запускается приложение. При этом, под каждое приложение система создает пользователя. Это позволяет разграничить доступ к данным. Каждое приложение запускается и работает со своими данными в отдельном процессе под отдельным пользователем. Соответственно, другие приложения не имеют к этим данным доступа, т.к. запущены под другими пользователями.
На следующем уроке:
- разбираемся с ViewPager
- в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование
- ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
- новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме
JAR Libraries
JAR это Java библиотека и в отличие от AAR она не может содержать андроид ресурсы и манифесты.
Введение
В этой статье мы поговорим о том, как разобрать пакет APK с приложением, рассмотрим его внутреннюю структуру, дизассемблируем и декомпилируем байт-код, а также попробуем внести в приложения несколько изменений, которые могут принести нам ту или иную выгоду.
Чтобы сделать все это самостоятельно, потребуются хотя бы начальные знания языка Java, на котором пишутся приложения для Android, и языка XML, который используется в Android повсеместно — от описания самого приложения и его прав доступа до хранения строк, которые будут выведены на экран. Также понадобится умение обращаться со специализированным консольным софтом.
Итак, что же представляет собой пакет APK, в котором распространяется абсолютно весь софт для Android?
Вторая жизнь старым устройствам без большого количества ОЗУ и/или места на диске?
Тоже логичное продолжение предыдущих моментов. Случалось ли с вами такое, что на бюджетном устройстве после очередного обновления gapps вообще не остается места ни на приложения, ни на пользовательские данные? Даже если на вашем не очень свежем устройстве еще достаточно свободных ресурсов, избавление от gapps позволит освежить его.
ART против Dalvik
C версии 4.4 андроид мигрировал на ART. ART также работает с .dex файлом.
Преимущество ART над Dalvik проявляется в том, что приложения запускаются быстрее, потому что весь DEX байткод транслируется в машинный код во время установки, не нужно дополнительного времени на компиляцию в рантайме.
ART и Dalvik совместимы, так что приложения разработанные для Dalvik должны работать и на ART.
Компиляция Dalvik (JIT- just in time) имела такие минусы как — быстрая трата батареи, лаги в приложениях и плохой перформанс. В Dalvik трансляция происходит только когда это нужно. Мы открываем новый экран и только в этот момент происходит трансляция, за счет этого установка происходит быстрее, но при этом проседает перформанс.
Это причина по которой Google сделал Android Runtime (ART).
ART — основан на AOT (ahead of time) компиляции, она происходит до того как приложение запустится.
В ART компиляция происходит во время установки приложения. Это ведет к более долгому времени установки, но уменьшает трату батареи и избавляет от лагов, которые были на Dalvik.
Несмотря на то, что Dalvik был заменен на ART, .dex формат файлов еще используется
В андроид 7.0 JIT вернулся. Гибридная среда сочетает фичи как от JIT компиляции так и
от ARTСреда запуска байткода это очень важная часть андроида и она вовлечена в процесс запуска и установки приложения
MicroG
MicroG — открытая реализация gapps. Обеспечивает работу push-уведомлений, api геолокации в использующих это приложениях. Список поддерживаемых api.
Для работы требуется функциональность подделки подписи в прошивке. Способы установки, примерно соответствующие градации устройств выше:
Можно установить LineageOS for MicroG и получить практически все перечисленное практически из коробки. Самый простой и удобный способ из всех, рекомендую использовать именно его, если ваше устройство есть в списке поддерживаемых.
Можно установить MicroG вручную на любую прошивку, не идущую в комплекте с gapps (почти любая не стоковая прошивка). Однако, в прошивке требуется поддержка подмены подписей (Signature Spoofing).
-
. В довольно большом списке прошивок эта функциональность есть из коробки, достаточно только поставить сверху MicroG.
- Остальные прошивки придется тем или иным способом патчить.
- Самый удобный способ — модуль для XPosed FakeGapps. Не требует модификации самой системы.
- Способы с модификацией системы. Не рекомендую, т.к. у меня это приводило к проблемам с производительности, но не могу сказать, правило это или исключение. Необходимо повторять после каждого обновления.
- Способы патчинга на самом телефоне (nanodroid-patcher) занимают достаточно много времени (перекомпиляция достаточно жирного системного файла), но являются вторыми по удобству. У меня это приводило к проблемам с производительности, не рекомендую.
- Способы патчинга с участием компьютера. Еще менее удобны, но при этом быстры, т.к. пересборка происходит на ПК. Требуют подключения телефона к ПК.
Не планировал описывать полную инструкцию, но опыт предыдущего поста показывает, что придется.
Процесс установки зависит от способа. Про установку при помощи NanoDroid чуть ниже, здесь описана ручная процедура:
- Удалить gapps, если они есть. Например, при помощи приложения /d/gapps
- Установить собственно необходимые apk. Из репозитория microg или NanoLx.
- GmsCore.apk ("MicroG Services core" из репозитория). На Android 7 и выше это приложение нужно сделать системным (при помощи приложения или модуля magisk systemize), если вы хотите пользоваться бекендами поиска местоположения.
- GmsProxy.apk ("MicroG Services Framework proxy" из репозитория)
- Одну из реализаций PlayStore (это обязательно)
- Приложение-заглушку FakeStore. Заглушке в настройках необходимо дать доступ на подделку подписей. В последний раз у меня с этим возникли какие-то проблемы, поэтому можно сделать adb shell pm grant com.android.vending android.permission.FAKE_PACKAGE_SIGNATURE с ПК или просто pm grant com.android.vending android.permission.FAKE_PACKAGE_SIGNATURE с телефона.
- Переподписанный Google Play Store. Да, это возможно! Но такой apk предоставляет только репозиторий NanoLX.
resources.arsc
Полученный на выходе .apk файл не включает в себя DEX файл, APK не подписан и не может быть запущен на устройстве.
APK содержит AndroidManifest, бинарные XML файлы и resources.arsc
resource.arsc содержит всю мета информацию о ресурсах, такую как индексы всех ресурсов в пакете
Это бинарный файл и APK который может быть запущен. APK который вы обычно создаете и запускаете не сжат и может быть использован просто посредством размещения в памяти.
R.java файл это выходной файл вместе с APK ему назначен уникальный id, который позволяет Java коду использовать ресурсы во время компиляции.
arsc это индекс ресурса который используется во время запуска приложения
Андроид виртуальная машина
Каждое андроид приложение работает на своей виртуальной машине. С версий 1.0 до 4.4, это был Dalvik. В андроид 4.4, вместе с Dalvik, Google представил в качестве эксперимента новый андроид runtime, который назывался ART
Сгенерированный класс файл .class содержит JVM Java байткод.
Но у андроида есть свой собственный оптимизированный формат байткода, который называется Dalvik bytecode — это просто инструкции машинного кода для процессора также как и JVM байткод.
Препарирование. Отключаем рекламу
Теория — это, конечно, хорошо, но зачем она нужна, если мы не знаем, что делать с распакованным пакетом? Попробуем применить теорию с пользой для себя, а именно модифицируем какую-нибудь софтину так, чтобы она не показывала нам рекламу. Для примера пусть это будет Virtual Torch — виртуальный факел. Для нас эта софтина подойдет идеально, потому что она под завязку набита раздражающей рекламой и к тому же достаточно проста, чтобы не потеряться в дебрях кода.
Поиск кода рекламы в jd-gui
Итак, с помощью одного из приведенных способов скачай приложение из маркета. Если ты решил использовать Virtuous Ten Studio, просто открой APK-файл в приложении и распакуй его, для чего создай проект (File -> New project), затем в контекстном меню проекта выбери Import File. Если же твой выбор пал на apktool, то достаточно выполнить одну команду:
После этого в каталоге com.kauf.particle.virtualtorch появится файловое дерево, похожее на описанное в предыдущем разделе, но с дополнительным каталогом smali вместо dex-файлов и файлом apktool.yml. Первый содержит дизассемблированный код исполняемого dex-файла приложения, второй — служебную информацию, необходимую apktool для сборки пакета обратно.
Первое место, куда мы должны заглянуть, — это, конечно же, AndroidManifest.xml. И здесь мы сразу встречаем следующую строку:
Нетрудно догадаться, что она отвечает за предоставление приложению полномочий на использование интернет-соединения. По сути, если мы хотим просто избавиться от рекламы, нам, скорее всего, достаточно будет запретить приложению интернет. Попытаемся это сделать. Удаляем указанную строку и пробуем собрать софтину с помощью apktool:
В каталоге com.kauf.particle.virtualtorch/build/ появится результирующий APK-файл. Однако установить его не получится, так как он не имеет цифровой подписи и контрольных сумм файлов (в нем просто нет каталога META-INF/). Мы должны подписать пакет с помощью утилиты apk-signer. Запустили. Интерфейс состоит из двух вкладок — на первой (Key Generator) создаем ключи, на второй (APK Signer) подписываем. Чтобы создать наш приватный ключ, заполняем следующие поля:
- Target File — выходной файл хранилища ключей; в нем обычно хранится одна пара ключей;
- Password и Confirm — пароль для хранилища;
- Alias — имя ключа в хранилище;
- Alias password и Confirm — пароль секретного ключа;
- Validity — срок действия (в годах). Значение по умолчанию оптимально.
Остальные поля, в общем-то, необязательны — но необходимо заполнить хотя бы одно.
Создание ключа в apk-signer
Очень небольшой начальный набор из качественных opensource-приложений
- K-9 Mail — почтовый клиент.
- Bromite — форк Chromium со встроенной блокировкой рекламы и несколькими фичами для улучшения приватности. К сожалению, их fdroid-репозиторий частично заблокирован в Россиии, что несколько добавляет головной боли. — синхронизация контактов и календаря с вашим owncloud/nextcloud сервером. — поддержка умных браслетов и часов. И даже умного вибратора Vibratissimo.
- NewPipe — минималистичный клиент для YouTube. Умеет воспроизводить видео в фоновом режиме как музыку, загружать файлы. — различные возможности по интеграции устройства на Android с десктопом под KDE (и не только!). Позволяет синхронизировать уведомления, просматривать и передавать файлы, а так же эмулировать тачпад и клавиатуру.
Update: только что появился пост с более широким обзором приложений.
Dex and Multidex
R8 дает на выходе один DEX файл, который называется classes.dex
Если количество методов приложения переваливает за 65,536, включая подключенные библиотеки, то произойдет ошибка при билде
The method ID range is 0 to 0xFFFF.
Другими словами, вы можете ссылаться на 65,536, или от 0 до. 65,535, если говорить цифрами
Чтобы избежать этого, нужно внимательно следить за зависимостями своего проекта и использовать R8, чтобы удалять неиспользуемый код, или включать мультидекс (multidex)
Установка приложений из google play
Как было отмечено выше, есть несколько способов решения проблемы.
- Можно установить патченную версию оригинального Google Play и жить, как обычно. Должно работать всё, включая микроплатежи в приложениях. . Прекрасное, красивое, быстрое приложение. Может многое (из основного нужного — установка, обновление бесплатных приложений). Пока в бете и имеет некоторые проблемы со скачиванием через анонимный аккаунт (используйте свой неанонимный или пока обойтесь Yalp Store, это практически то же самое, но без красивого интерфейса и с еще более скромными системными требованиями (до сих пор поддерживается Android 2+) позволяет на вашем сервере развернуть f-droid репозиторий с нужными вам приложениями из google play. Управление скачиваемыми приложениями производится через веб-интерфейс. Имеет очевидные ограничения, но очень удобен, если вы нечасто устанавливаете новые приложения и нуждаетесь лишь в способе их удобного обновления. : Безумное приложение, однако, предоставляющее быстрый доступ к обновлению ваших приложений. Может быть полезным тем, что на 4pda обычно выкладывают не только оригинальные версии, но и модифицированные (например, с удаленной рекламой). Лично я не одобряю, но знаю, что этим пользуются. Сторонний сервис-зеркало Google Play. Не был замечен за перепаковкой приложений (подписи совпадают с оригинальными), но нет никаких гарантий, что так будет продолжаться и дальше.
Library Modules
Модули библиотек содержат Java или Kotlin классы, компоненты андроида и ресурсы.
Код и ресурсы бибилотеки компилируются и пакуются вместе с приложением.
Поэтому модуль библиотеки может считаться компайл тайм артефактом.
Несколько причин, почему стоит об этом задуматься
Вместо выводов
Лично мне переход на MicroG, F-Droid и AuroraStore дал тот Android, о котором я всегда мечтал. С удобными приложениями, не напичканными рекламой и телеметрией, позволяющие мне не делиться своими данными с Google, но при этом работающими push-уведомлениями, позволили перестать мечтать о недостижимом (смене мобильной ОС на Sailfish/ubuntu phone/etc, где все бы равно для полноценной работы приходится использовать слой для поддержки Android-приложений) и начать жить.
Надеюсь, эта инструкция поможет вам понять, нужно ли вам это в принципе и успешно повторить этот результат.
Иногда некоторые приложения на Android чем-то не устраивают пользователя. В качестве примера можно привести назойливую рекламу. А то бывает и так — всем хороша программа, да только перевод в ней или кривой, или вовсе отсутствует. Или, например, программа триальная, а получить полную версию возможности нет. Как же изменить ситуацию?
AAR Libraries
Андроид библиотеки компилируются в AAR — android archive файл, который вы можете использовать как зависимость для вашего android app модуля.
AAR файлы могут содержать андроид ресурсы и файл манифеста, что позволяет вам упаковать туда общие ресурсы такие как layouts и drawables в дополнение к Java или Kotlin классам и методам.
NanoLX NanoDroid
Пожалуй, самый простой и удобный способ установить MicroG. Помимо основных возможностей (удаление gapps и установка microg) имеет несколько приятных фич:
- Удаление стандартных приложений и замена их на opensource-аналоги. Удобно, когда у вас телефон на условном MTK с сильно замусоренной стоковой прошивкой.
- Установка Fdroid, YalpStore/AuroraStore с системными правами
- Возможная установка патченного Google Play, совместимого с microG.
Достаточно установить несколько из следующих файлов:
- NanoDroid: основной установщик. Устанавливает всё.
- NanoDroid-setupwizard: графическая настройка основного установщика. Позволяет выбрать, какие компоненты будут установлены и какие действия будут совершены. Работает только на устройствах с arm/arm64.
- NanoDroid-BromiteWebView: заменяет системный WebView на BromiteWebView со встроенной блокировкой рекламы.
- NanoDroid-OsmAnd: устанавливает OsmAnd+.
- NanoDroid-microg: устанавливает только microG.
- NanoDroid-fdroid: устанавливает только FDroid и расширение, позволяющее устанавливать и обновлять приложения в фоновом режиме.
- NanoDroid-patcher: включает поддержку Signature Spoofing (см выше).
- NanoDroid-uninstaller: удаление ранее установленного.
Просмотр и модификация
Допустим, ты нашел интересующий тебя пакет, скачал, распаковал… и при попытке просмотра какого-нибудь XML-файла с удивлением обнаружил, что файл не текстовый. Чем же его декомпилировать и как вообще работать с пакетами? Неужели необходимо ставить SDK? Нет, SDK ставить вовсе не обязательно. На самом деле для всех шагов по распаковке, модификации и упаковке пакетов APK нужны следующие инструменты:
Использовать все эти инструменты можно и по отдельности, но это неудобно, поэтому лучше воспользоваться более высокоуровневым софтом, построенным на их основе. Если ты работаешь в Linux или Mac OS X, то тут есть инструмент под названием apktool. Он позволяет распаковывать ресурсы в оригинальный вид (в том числе бинарные XML- и arsc-файлы), пересобирать пакет с измененными ресурсами, но не умеет подписывать пакеты, так что запускать утилиту signer придется вручную. Несмотря на то что утилита написана на Java, ее установка достаточно нестандартна. Сначала следует получить сам jar-файл:
Далее нам понадобится скрипт-обвязка для запуска apktool (он, кстати, доступен и для Windows), включающий в себя еще и утилиту aapt, которая понадобится для запаковки пакета:
Далее просто сваливаем содержимое обоих архивов в каталог ~/bin и добавляем его в $PATH:
Если же ты работаешь в Windows, то для нее есть превосходный инструмент под названиемVirtuous Ten Studio, который также аккумулирует в себе все эти инструменты (включая сам apktool), но вместо CLI-интерфейса предоставляет пользователю интуитивно понятный графический интерфейс, с помощью которого можно выполнять операции по распаковке, дизассемблированию и декомпиляции в несколько кликов. Инструмент этот Donation-ware, то есть иногда появляются окошки с предложением получить лицензию, но это, в конце концов, можно и потерпеть. Описывать его не имеет никакого смысла, потому что разобраться в интерфейсе можно за несколько минут. А вот apktool, вследствие его консольной природы, следует обсудить подробнее.
Импорт APK в Virtuous Ten Studio
Рассмотрим опции apktool. Если вкратце, то имеются три основные команды: d (decode), b (build) и if (install framework). Если с первыми двумя командами все понятно, то что делает третья, условный оператор? Она распаковывает указанный UI-фреймворк, который необходим в тех случаях, когда ты препарируешь какой-либо системный пакет.
Рассмотрим наиболее интересные опции первой команды:
- -s — не дизассемблировать файлы dex;
- -r — не распаковывать ресурсы;
- -b — не вставлять отладочную информацию в результаты дизассемблирования файла dex;
- --frame-path — использовать указанный UI-фреймворк вместо встроенного в apktool. Теперь рассмотрим пару опций для команды b:
- -f — форсированная сборка без проверки изменений;
- -a — указываем путь к aapt (средство для сборки APK-архива), если ты по какой-то причине хочешь использовать его из другого источника.
Пользоваться apktool очень просто, для этого достаточно указать одну из команд и путь до APK, например:
После этого в каталоге mail появятся все извлеченные и дизассемблированные файлы пакета.
Понимание Java виртуальной машины
JVM это виртуальная машина, позволяющая устройству запускать код, который скомпилирован в Java байткод
Используя JVM, вы избавляетесь от проблемы с разной архитектурой процессоров.
JVM предоставляет переносимость и она позволяет запускать Java код в виртуальной среде, вместо того, чтобы запускать его сразу «на железе»
Но JVM была создана для систем с большими мощностями по ресурсам, а наш андроид имеет сравнительно мало памяти и заряда батареи.
По этой причине Google создал адаптированную под андроид виртуальную машину, которая называется Dalvik.
Компилируем исходный код
Наш исходный Java код для андроида компилируется в класс файл .class с байткодом с помощью javac компилятора и запускается на JVM
Для котлина есть kotlinc компилятор, который делает совместимый с Java байткод.
Байткод — это набор инструкций, который выполняется на целевом устройстве.
Java байткод — это набор инструкций для Java виртуальной машины.
Декомпиляция приложений
В статье мы работали только с дизассемблированным кодом приложения, однако если в большие приложения вносить более серьезные изменения, разобраться в коде smali будет гораздо сложнее. К счастью, мы можем декомпилировать код dex в Java-код, который будет хоть и не оригинальным и не компилируемым обратно, но гораздо более легким для чтения и понимания логики работы приложения. Чтобы сделать это, нам понадобятся два инструмента:
Использовать их следует так. Сначала запускаем dex2jar, указывая в качестве аргумента путь до apk-пакета:
В результате в текущем каталоге появится Java-пакет mail.jar, который уже можно открыть в jd-gui для просмотра Java-кода.
Несколько подводных камней, с которыми ничего не сделать
- Далеко не для всего софта есть opensource-аналоги. Иногда они принципиально невозможны (те же банковские приложения). Иногда привычки слишком сложно поменять. Мой личный подход — пробовать использовать открытый аналог и потом, если он не устроит, переходить на закрытый.
- Ничего не сделать с тем, что, возможно, придется "красноглазить". Однако, с момента первого моего поста на эту тему, все сильно изменилось в лучшую сторону.
- Все может сломаться, и вы не получите своё push-уведомление с одноразовым паролем на проведение банковской операции, которую нужно сделать удавись, но прямо сейчас (увы, у меня такое было). Хотя, в последнее время, пуши ломаются только из-за РКН.
- Некоторый проприетарный софт может не заработать. Или сломаться от обновления в самый неподходящий момент. К примеру, я очень долго без всяких проблем использовал Яндекс.Такси на старом телефоне, но при установке на новый оказалось, что приложение падает на логине.
- Радикальным FSF-фанатиком быть не получится. Любая даже опенсорсная прошивка содержит огромное количество проприетарных блобов и компонентов. С этим ничего не сделать. Так что мы сосредоточимся на переходе на opensource-компоненты там, где это возможно.
Низкое качество приложений в google play, засилие рекламы, телеметрий, шпионских модулей, уязвимостей
Я, конечно, и раньше был не очень высокого мнения о среднестатистическом приложении для андроида, но был серьёзно удивлен своим новым телефоном одного китайского производителя. После покупки, мне пришлось три дня ходить со стоковой прошивкой из-за ограничений разблокировки (вот она — еще одна причина не доверять свои устройства компаниям). Я честно не понимаю, почему этим пользуются и почему это любят. Мне постоянно (несколько раз в час) приходили непонятные уведомления (дайте разрешение, обновите меня, реклама). Что-то постоянно обновлялось. Стоковый браузер в один момент просто перестал работать.
Читайте также: