Как разобрать и собрать обратно apk под windows

hmbtsnyc81w2nuefcvcfomcjhxg.png
Короткий практический пример как разобрать apk приложение, что-то в нем изменить и собрать обратно в среде windows без использования android studio. Статья подойдет для новичков, сложного ничего не будет. Будем изменять (русифицировать) не полностью русифицированное приложение для видеокамеры ordro pro ep8.
На написание статьи подтолкнула другая статья на Хабр — habr.com/ru/articles/780694
Однако там описано, на мой взгляд, недостаточно подробно, новичкам будет тяжело. Кроме того, в приведенной статье использовались средства сборки-разборки под Linux, здесь будет windows-вариант.

В качестве цели для исследования будет выступать мобильное приложение в формате apk для камеры ordro pro ep8.

При эксплуатации это приложение демонстрирует вполне разумную локализацию, но в некоторых моментах все-таки «проглядывает оригинал» на иностранном языке:
3aayh9fuvm0wn7bydsogd_cosym.jpeg

Разбираем apk.


Самое простое, что можно сделать на старте — просто переименовать apk в zip и посмотреть на получившийся архив приложения:
l0zfvvtobnhawh3k52jomnoztp4.png
Такой трюк позволяет сформировать общее представление о приложении, но не более. В своем содержимом файлы все равно будут иметь нечитаемый код:
puxqptmrt9aotk3z2zwzixr5f-o.png

Поэтому понадобится утилита apktool.
Устанавливать (инсталлировать) ее не нужно, только положить рядом с apk. Может также потребоваться java.
Проверить, установлена ли java можно так:
cjh2m7ofbtqndbv-qywk1z_i3n0.png

Далее команда apktool d com-ordro.apk полностью разберет приложение:
8gvazudlg6iwom7tsm8u8muplfo.png

После этого можно наблюдать в том числе smali, о которых говорилось в уже упомянутой статье:
cyay2ymqctkqzle1bv8izrc_h1o.png

Файлов много, найти текст, который хотелось русифицировать, непросто. Поэтому пойдем по пути наименьшего сопротивления. Возьмем скриншот иероглифа из картинки приложения, переведем в текст и поищем этот текст по всем файлам в папках:
qepkuadxfrdl88alzoyjgi1vz1w.png

Как не сложно догадаться для каждого языка имеются соответствующие папки, в одной из которых и нашелся иероглиф. Нас интересует «папка для русского языка» (values-ru):
pet3wwamuz8bfpgmogplm5ltzqu.png

В файле находим частично непереведенные названия вкладок, кнопок и т.д. Изменяем текст на правильный:
old2xqrbzyiuw_b4myo2gjaiuec.png
Не лишним будет заглянуть в иные, рядом расположенные файлы:
dukzmy_qvbigwgyxse6zwbr3jh0.png

Собираем обратно в apk.


После того, как все необходимые изменения внесены, можно приступить к сборке нового apk.
Сборка apk осуществляется также apktool командой apktool b com-ordro, где в качестве аргумента — папка с файлами, в которых происходили изменения.
Готовый файл apk будет в папке dist:
lkbtp4stipwqolcnjfdawkvetdg.png

Однако, если данный файл перенести на мобильный и попытаться установить — попытка завершится неудачей. Необходимы дополнительные манипуляции с файлом apk перед переносом.
Необходимо выполнить выравнивание содержимого apk (aligning) и его подпись (sign).

Здесь частично будут использованы сведения из статьи medium.com/@sandeepcirusanagunla/decompile-and-recompile-an-android-apk-using-apktool-3d84c2055a82
Но так как, сведения из статьи немного устарели, как например, в части алгоритма шифрования, будут использоваться немного иные команды.

Алгоритм следующий.
1.Создаем ключ-пару, который «подпишем» наш apk:

keytool -genkeypair -keyalg DSA -keysize 2048 -keystore my-release-key.keystore -alias alias_name -validity 10000


Пароль можно задать любой как и данные, ввод которых можно пропускать, нажимая enter.
p9rhslyf29g0ndpjcannphxdmr8.png
На выходе рядом с apk появится файл — ключ-пара:
fprdf78pnyuo7etfqbkgf4d8lha.png

2. Подпишем файл (signing), используя нашу ключ-пару.

jarsigner -verbose -sigalg SHA256withDSA -digestalg SHA256 -keystore my-release-key.keystore com-ordro.apk alias_name

В терминале увидим при успешном выполнении примерно следующий вывод:
rzufsvhm7mryce7v6tau9xtue9m.png

Однако, если проверить подписанное приложение jarsigner -verify -verbose -certs com-ordro.apk может выскочить ошибка, которая в дальнейшем не позволит установиться приложению на мобильном:
zf7hym316fmyatadrxs_vozhmzw.png

Можно пойти по длинному пути и исправить ошибку с ключ-парой и сертификатами, но мы поступим проще. Подпишем и выровняем apk с помощью uber-apk-signer.

Скачав uber-apk-signer.jar в папку с готовым apk, выполним команду:

java -jar uber-apk-signer.jar -a com-ordro.apk


*Данная команда заменяет собой 2 предыдущих шага с выравниванием и подписанием.
Она использует все тот же zipalign.exe и создает ключ-пару. Если zipalign нет, то его нужно скачать и добавить его в PATH.

9_tgf9bmcm6h5stqkwziuqra3da.png

На выходе получим готовый apk, который уже можно устанавливать на мобильном:
tcxg2f0jwhtzffmc-_usukfe5om.png

Результат:
jlnsxznbcvh8sacd73ev6srphjw.jpeg

Спасибо за внимание.
Приложение до и после, а также файлы для работы можно скачать — здесь.

ps. для тех кого интересует вопрос (как и меня) собственно по камере — можно ли с нее получать поток, в обход мобильного приложения — да, возможно rtsp:\\192.168.1.1:554

© Habrahabr.ru