English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Принцип打包а много каналов старой подписи
Введение
Из-за того, что Android 7.0推出了 новый механизм подписи, который усиливает укрепление подписи, это привело к тому, что в новом механизме подписи больше нельзя продолжать создавать пакеты много каналов в стиле Meituan. Однако, говоря о новом механизме подписи и его влиянии на план打包а:
Прежде чем обсуждать, как это влияет и почему это влияет на нашу прежнюю схему打包а, необходимо сначала понять принципы打包а и роль подписи в整个过程打包а.
Процесс打包 Android
Процесс打包 Android в общих чертах изображен на рисунке, весь процесс - это объединение Java-кода, файлов ресурсов и сторонних библиотек в файл Apk, а также подпись и оптимизация выравнивания объединенного файла. Весь процесс можно кратко
Разделение на следующие шаги:
Шаги создания APK примерно такие, мы не должны волноваться о деталях реализации, достаточно просто понять эти процессы, чтобы понять принцип нашей компиляции. Конечно, так看来 APK
Это очень神奇 файл, который может быть установлен и запущен. На самом деле, APK - это всего лишь особый файл .zip, который может быть распознан и установлен на Android-устройстве в качестве приложения. Мы можем разархивировать APK и посмотреть, что внутри.
Как можно видеть, содержимое файла похоже на то, о чем мы говорили ранее. Далее рассмотрим самый важный файл, который изображен на рисунке в главе 3. Эти файлы находятся в папке META-INF, это файлы, которые мы добавляем в процессе подписи в качестве уникального идентификатора APK. Что это означает для оптимизации нашей компиляции? Мы оставим эту загадку на потом. Прежде чем понять это, необходимо сначала объяснить процесс подписи.
Роль и принцип работы подписи
Роль подписи
При разработке Android App у каждого из них есть уникальный идентификатор, который мы называем именем пакета, например, пакет большого клиента - com.Quanr. Имя пакета, как и номер身份证а, уникально для каждого человека. При установке приложения устройство также распознает приложение по имени пакета. В одном устройстве не может быть двух приложений с одинаковым именем пакета, это и есть уникальность приложения на устройстве. При обновлении приложения, например, при установке поверх, мы идентифицируем и заменяем приложение по имени пакета, чтобы обеспечить успешное обновление приложения и избежать замены других приложений. Также, приложения с иным именем пакета не смогут заменить наше приложение. Хотя Android предоставляет систему распознавания имен пакетов, достаточно ли только имен пакетов? Представьте себе, если кто-то создаст приложение с нашим именем пакета, чтобы заменить наше приложение или если злоумышленники взломают наше
App добавляет в себя некоторые свои собственные данные, например, встроенные рекламные объявления для получения прибыли, отправляет измененный App для установки пользователями, и мы можем понести значительные убытки. Конечно, такие события не могут произойти, Google добавил для каждого App механизм подписи, как мы обращаемся в банк для办理 дел, нам нужно предоставить身份证 и подписать,身份证 виден всем, но подпись можно сделать только самим себе, и другие не могут имитировать это. App именно через этот механизм гарантирует свою уникальность и безопасность.
Так как же подпись делает это?
Принцип подписывания
Для подписывания APK существует несколько инструментов, но принципы их работы очень похожи. Давайте возьмем инструмент signapk в качестве примера. Подписывание APK можно выполнить с помощью этого инструмента и некоторых параметров, а также нашего уникального файла подписи, подписывание с помощью инструмента очень просто, но мы должны больше внимания уделять его принципам и конкретной реализации, чтобы помочь нам найти секреты создания канальных пакетов. Перед использованием инструмента подписывания我们必须 подготовить частный ключ и открытый ключ, которые будут использоваться для подписи (a–(частный ключ)–>b–(открытый ключ)–>a), лучше всего использовать изображение для демонстрации), а затем использовать инструмент для подписывания APK. После этого в APK будет создан новый каталог META-INF, и в нем будут созданы три файла, которые являются ключом подписи и основой для проверки.
Из изображения можно увидеть, что три файла分别是:
Далее расскажем, как эти три файла генерируются.
MANIFEST.MF
Прежде всего, посмотрим на его содержимое, и можно увидеть, что это значения SHA1 для Name, легко понять, что этот файл сохраняет уникальное значение для каждого файла. Функция файла MANIFEST.MF такая, как было сказано ранее, при подписывании APK, сначала каждый файл кодируется цифровым образом, чтобы сгенерировать уникальное значение SHA1, так как содержание файлов различается, значения SHA1 также различаются. Поэтому, если кто-то изменит содержание файла, соответствующее значение SHA1 также изменится. При подписывании APK проверяется каждый файл, и генерируется соответствующее значение SHA1, все эти данные сохраняются в新建ленный файл MANIFEST.MF и этот файл放到 директорию META-INF, что завершает создание первого файла подписи.
CERT.SF
После создания файла MANIFEST.MF мы можем записать уникальное значение каждого файла, чтобы гарантировать, что файлы не будут изменены, таким образом, хотя и гарантируется безопасность записанных в MANIFEST файлах, но безопасность самого файла не гарантируется, так как другие могут изменить исходный файл, создать соответствующий SHA1 и затем изменить файл MANIFEST. Поэтому мы должны укрепить MANIFEST, чтобы обеспечить безопасность. После завершения создания первого файла инструмент для подписи начинает создавать второй файл, который является CERT.RSA. В этом шаге файл, созданный на предыдущем шаге, снова кодируется数字но, результат сохраняется в заголовке нового созданного файла CERT.RSA, а также цифровой кодировка различных блоков свойств файла MANIFEST.MF сохраняется в одном из блоков файла CERT.SF.
CERT.RSA
Эти файлы все двоичные. После создания файла CERT.SF мы используем частный ключ для шифрования CERT.SF и вычисления подписи, получаем подпись и информацию цифрового сертификата открытого ключа и сохраняем их вместе в CERT.RSA, процесс подписи завершен.
Ниже мы кратко опишем шаги проверки процесса установки APK, которые очень похожи на шаги по созданию подписанных файлов:
Из上面的 процесса можно очень明显地发现一个问题: в этом процессе никогда не было цифровой кодировки и шифрования любых файлов в папке META-INF,因为这个 папка создается при подписи, при создании первого файла MANIFEST.MF в этой папке не было цифровой кодировки任何一个 файла, потому что эта папка определенно пуста. Второй файл создается на основе первого, третий файл создается на основе второго, поэтому на протяжении всего процесса эта папка META-INF почти находится вне контроля. Мы можем добавить в нее файлы, чтобы избежать процесса подписи. Это и есть突破口 для многоканального пакета Meituan.
美团通过利用签名原理来完成多渠道打包
通过前面打包过程的了解,可以知道想快速打多渠道包,就得跳过打包的阶段直接想办法对Apk文件进行修改,但这得挑战Android的签名校验规则了,不过正好,通过刚才我们对签名过程的分析,我们发现可以在META-INF文件夹里随意添加文件从而躲过签名规则的检查,这时候新方案就孕育而生了,在打包生成了一个没有渠道的Apk文件后,我们copy这个Apk并在在META-INF里添加一个文件,然后通过文件名来确定渠道号,不同的Apk里就在META-INF里添加不同的渠道名文件,即可确定不同的渠道了,之后要做的就是在我们需要渠道参数的时候直接去这个文件里拿就行了,完美的跳过了打包这个过程。那么这种方案的耗时呢?仅仅就是基于一个Apk文件的基础上复制并插入一个文件而已,这样的动作在高配的电脑里一分钟可以做900次。所以,这时候打一个渠道包要4分钟,打100个渠道包也只要四分钟加一个小零头,当然,这还不是极限,如果有900个渠道的话,一个个渠道包打包需要900x4分钟,美团方案只要5分钟,提高了好几百倍的效率,可以说美团方案在老签名下是非常完美的。
新签名方式对现有方案的影响
在Android 7.0之后,Google为了增强签名的安全性,采用了新的签名验证规则,不是针对每个文件进行数字编码了,如图所示:
新的签名方式是根据zip文件结构来进行签名的,Apk文件本质上就是一个.zip文件,如图所示,在被签名前可以分为三块内容。
下图中蓝色的部分代表ZIP条目的内容,粉色的部分代表中心目录。
File Entry表示一个文件实体,一个压缩文件中有多个文件实体。
Файл состоит из заголовка и содержимого файла (сжатого, метод сжатия указан в заголовке)
Central Directory состоит из множества File header, каждый File header сохраняет смещение файла
Файл заканчивается структурой, называемой End of central directory.
Смотрим на роль End of Central Directory, он записывает смещение Central Directory по отношению к началу, посмотрим на наше новое подписное данные Apk Signing Block, они расположены между содержимым ZIP записей и Central Directory, это уникальные данные, которые получены после кодирования и подписи всех содержимостей трех модулей не подписанного ZIP файла, можно понять по предыдущему числовому кодированию, любая смена содержимого этих трех блоков приводит к изменению данных этого блока, поэтому после подписи нельзя изменять любые содержимosti Apk, но мы и раньше не изменяли содержимое Apk за подписью, поэтому на этом этапе можно ли изменить содержимое Apk Signing Block, мы добавим небольшой хвост в будущем. Очевидно, что этот метод также не сработает, как уже говорили, в конце есть часть, называемая End of Central Direcotry, которая записывает смещение Central Directory по отношению к началу файла APK,正好 APK Signing Block расположен перед Central Directory, если изменить длину APK Signing Block, то смещение Central Directory по отношению к началу изменится, и содержимое не будет соответствовать записанному в End of Central Directory, весь APK пакет будет поврежден. Так можно ли изменить это смещение? Очевидно, что нельзя, после изменения этого смещения APK Signing Block также изменится, и только разработчики, имеющие подписные файлы, смогут получить правильные данные APK Signing Block, те, кто хочет подделать, будут только разочарованы. Это и есть принцип действия новой схемы подписи. В这套 новой схеме нам, возможно, нужно будет сделать некоторые изменения в нашей старой подписи.
Метод улучшения схемы
Раньше уже говорили, что наша новая схема упаковки снова становится тесной в новых условиях подписи (конечно, если вы все еще используете старую подпись, то не нужно беспокоиться о этой проблеме), но Google имеет план, а у нас есть способ переправиться через стену~
Раньше уже говорили, что добавление канального пакета может быть выполнено несколькими способами:
Ранее анализировалось, что если изменены какие-либо модули содержимого файла zip, APK Signing Block изменяется, и его больше нельзя обойти.
Однако это не важно, механизм подписания предназначен только для обеспечения безопасности нашего APK. Мы явно не хотим злонамеренно изменять приложение. Мы разработчики, у нас есть частные и общественные ключи для файлов подписания.既然 мы не можем обойти механизм подписания, мы можем напрямую изменить APK-пакет и повторно подписать его. Хотя это не так эффективно, как обойти механизм подписания, но по сравнению с несколькими минутами процесса упаковки, это также можно接受的. Время повторной подписи составляет大约 три-четыре секунды, по сравнению с нашим четырехминутным процессом упаковки, это все еще можно接受的 и можно продолжать использовать.
Конечно, это только один из вариантов, основанный на нашем механизме подписания. Ранее мы анализировали весь процесс и механизм упаковки и подписания, возможно, есть и другие ways, которые можно извлечь из них. Это требует коллективного разума. Тщательный анализ и思考 этих процессов и принципов могут помочь вам найти лучшее решение для дальнейшего оптимизации нашей схемы упаковки.
Обобщение
Вот и все о влиянии нового подписания Android 7.0 на много渠道овую упаковку. Надеюсь, что содержимое этой статьи поможет Android-разработчикам. Если у вас есть вопросы, пожалуйста, оставляйте комментарии для обсуждения.
Декларация: содержимое этой статьи взято из интернета, авторские права принадлежат соответствующему автору. Содержимое предоставлено пользователями интернета, загружено самостоятельно, сайт не имеет права собственности, не underwent редактирование, и не несет ответственности за соответствующие юридические последствия. Если вы обнаружите контент,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма, пожалуйста, замените # на @) для сообщения о нарушении, и предоставьте соответствующие доказательства. Если подтвердится, сайт немедленно удаляет涉嫌侵权的内容.