Использование apktool

В статье про изготовление копий приложений для Android я упоминал о приложении SmartAPKTool. Оно может распаковывать, запаковывать и подписывать изменённые apk-файлы. Её достоинством является наличие графического интерфейса. Однако есть и серьёзный недостаток. SmartAPKTool давно не обновлялся, и программа некорректно распаковывает и запаковывает приложения для свежих версий Android. Поэтому здесь я попытаюсь объяснить, как пользоваться для этих целей приложением apktool.

Замечание 1.
Программу SmartAPKTool по-прежнему удобно использовать для подписи собранных apk-файлов.
Замечание 2.
Ссылки на упомянутые в статье программы находятся внизу ↓

Программа apktool не имеет графического интерфейса. Это является минусом для тех, кто не привык работать с командной строкой. Но есть и плюс: в отличие от SmartAPKTool, мы будем видеть все ошибки, а значит будем знать, что исправить.

Скачаем два архива: один общий для всех систем, другой для нашей системы (в примере — Windows):

Screenshot_1

Распакуем оба архива в одну и ту же пустую папку (в нашем примере C:\apktool\). Её содержимое должно получиться таким:

Screenshot_2

С этого момента мы можем использовать программу apktool.

Замечание 3.
Пользователям 64-битных версий Linux нужно будет установить пакет ia32-libs:

sudo apt-get install ia32-libs

В эту же папку мы кладём тот файл, который нам нужно распаковать. Например, пусть он назвыается orig.apk
Нажав клавишу Shift и удерживая её, щёлкаем правой кнопкой мыши на любом пустом пространстве папки (щёлкать не по файлам!). После этого выбираем пункт „Открыть окно команд“. В появившейся консоли набираем[важно!]:

apktool decode orig.apk

Файл распакуется:

Screenshot_3

Теперь у нас в директории C:\apktool\ есть папка с распакованным приложением. Называется она так же, как и исходный файл, за вычетом расширения: C:\apktool\orig\. Мы можем менять исходные файлы так, как описано в статье Android: как установить два одинаковых приложения на один телефон. После того, как мы сделали изменения, соберём копию приложения, запаковав исходные файлы в apk:

apktool build orig result.apk

Здесь result.apk — имя файла, которое мы придумали для билда копии. Если ошибок нет, то файл соберётся:

Screenshot_4

Остальное выходит за рамки темы статьи:

  1. Если при сборке будут ошибки, нужно найти их причину и исправить.
  2. Осталось подписать получившийся файл result.apk. Это можно сделать с помощью SmartAPKTool, как говорилось выше; в нём всё интуитивно понятно. Есть также прочие способы подписать apk-файл.
  3. При установке копии, при её запуске или работе также могут возникать ошибки. Их нужно отлавливать с помощью утилиты adb, входящей в состав Android SDK.

Подписывать приложение надо обязательно, иначе оно не установится. Ошибки же встречаются не так часто, и самые распространённые вызывающие их проблемы описаны в статье Android: как установить два одинаковых приложения на один телефон.

Важное замечание по apktool версий 2.x

В версии 2.0.0-Beta7 нужно применять ключ --output, чтобы указать директорию при декомпиляции и результирующий файл при сборке:

apktool decode orig.apk --output orig
apktool build orig --output result.apk

Назад в текст ↑

33 thoughts on “Использование apktool”

  1. Можешь подсказать в чем проблема? Пытаюсь сделать копию игры для установки рядом с основной. Делал по твоему мануалу. Компиляция апкшки проходит без каких либо ошибок, подписывается тоже нормально. На тел устанавливается, но при запуске выдает ошибку приложения и закрывается. Пробовал и через строку (и через готовые батники, и вручную прописывая все строки), и через смарт апк, результат тот же. Так как при компиляции ошибок не выдает, думаю что при изменениях ничего левого не написал, подозрения падают на подпись, но хз.
    Думал уже просить чтоб сделал мне копию, но вот буквально на днях его уже заказали (правда не ту версию).
    По софту всё впорядке вроде, всё стоит.

    1. Кинь ссылку на собранный тобою файл. Я установлю и проверю, что там может быть.

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

      Дописал и всё нормально запустилось, спс за быстрое реагирование на проблему.

    3. Только вот всё равно не могу понять, а почему у тебя работало с не прописанным путём? Он был изменён где-то «глубже»? Сорь за глупые вопросы, чайник я в программировании.

    4. Я просто автоматизировал процесс создания копий, а в автоматическом режиме проще менять не все данные в манифесте, а пути во всех файлах smali (что вручную практически невозможно). Это просто два разных пути сделать одно и то же, они равнозначны по сути.

    5. Тогда понятно, спасибо за разъяснение.

  2. [URL=http://www.radikal.ru][IMG]http://s019.radikal.ru/i629/1402/5d/ec141f4ef813.jpg[/IMG][/URL] в чём может быть проблема?

    1. Это не проблема. Нужно просто:
      1. Установить Java, если она не установлена.
      2. Добавить в глобальную переменную %PATH% путь к Java, если это не сделается автоматически после установки.

    1. Не совсем понимаю, в чём вопрос, если всё прямо написано в появляющейся ошибке. У тебя просто нет сертификата, которым ты собираешься подписывать приложение. Его нужно скачать по той ссылке, которую тебе заботливо написали прямо в тексте ошибки.

      Скорее всего, ты зачем-то достал exe-файл из архива с программой SmartApkTool и почему-то решил его использовать отдельно от всего остального содержимого архива.

  3. http://s019.radikal.ru/i615/1403/7f/56fc5281c0ee.png по ссылке, пишет страница не существует. SmartApkTool даже в самой папке со всеми файлами, тоже самое пишет. Странно, но у тебя получилось без проблем сделать клон. Правда старую версию. А мне нужно вот эту обновлённую http://files.bitmaster.ru/TM/android/TMDriver_2_4_20.apk

    1. Я давал внизу статьи ссылку на архив с программой:
      http://kodopik.ru/SmartAPKTool.zip
      Подписываемый apk-файл нужно класть в папку sign (она на одном уровне с исполняемым файлом SmartApkTool.exe).

  4. Есть приложение, онлайн игра. При запуске язык выбирается исходя из системного в телефоне. Из-за кривого гугло-перевода есть огромное желание вернуть его на английскую версию. Переводить весь телефон на англ как-то желания нету. Можешь подсказать, возможно ли своими силами (без привлечения разработчиков), заставить игру принудительно запускаться на английском языке? Если пробовать «выпиливать» всю локализацию по определению языка запуска, боюсь что может начаться некорректная работа приложения в онлайне/при обновлении. Можешь подсказать путь, в котором двигаться по решению вопроса?

    1. Самый простой способ (имхо):

      1. Распаковать apk.
      2. Заменить файл

      res/values-ru/srtings.xml

      на

      res/values/srtings.xml

      (просто тупо скопировать с заменой)
      3. Запаковать обратно.
      4. Подписать.

      Файлы

      res/values*/strings.xml

      содержат строки с локализацией для разных языков. По умолчанию (директория values без двухбуквенного обозначения языка) обычно бывает английский. Но иногда английский бывает и в

      res/values-en/strings.xml

      .

    2. Закинул английский strings.xml вместо русского, собрал. Запускаю — русский язык =)

    3. Ну скинь собранный тобою пакет. Я посмотрю, что ты там заменил.

    4. Оригинал удалял предварительно очистив данные и кэш (стандартными дроидовскими способами), измененный апк таким же способом сносился. SD Maid’ом только что проверил, мусора не нашёл. Установил ещё раз игру, итог — русский. Видимо собака где-то глубже зарыта. Ладно, буду стучатся разработчикам, может введут ручной выбор. Спасибо за помощь.

    5. Похоже, там всё с сервера берётся. В файле strings.xml слишком мало строк и не встречаются слова, которые я вижу в игре.

    6. Да, по содержимому больше похоже что strings.xml содержит только список системных команд приложения.

    7. Посидел поискал ещё. В итоге получилось.
      В файле

      assets/lua/start.lua

      изменил строки

      elseif devLanguage == kLanguageRussian then
      table.insert(requiresTable, «lua/message/message_ru»)
      lpath=»ru»

      на

      elseif devLanguage == kLanguageRussian then
      table.insert(requiresTable, «lua/message/message_en»)
      lpath=»en»

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

  5. Установилась, при запуске происходит зависание и дальше ни чего не грузит, в чем может быть проблема?

    1. Ну так это смотреть надо конкретный собранный пакет, читать логи, отлавливать ошибки…

  6. А как прислать файл ? Решил еще помучатся , теперь при сборке в apktool появились такие строки:warning:string app__user_id has no defaulttranlation.
    warning:string blank has no default translation.

  7. SmartAPKTool это замечательно, но он не обновлялся с 11 (!!!) года.
    apktool превосходный инструмент, но работает только из командной строки.

    Я добавил к apktool webinterface и выложил здесь:
    http://www.javadecompilers.com/apktool

    Получилось ограниченное по возможностям (увы!) но все же полезное приложение.
    Андрей.

Добавить комментарий для Andrew Rukin Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *