Извлечь значок приложения из файла apk

Мне нужно извлечь значок приложения из apk-файла. Мне просто нужен один значок, Я не хочу извлекать все остальное в apk. Файлы легко удерживаются, но как определить, какой файл значка является правильным значком приложения. Полагаю, это хранится в таблице ресурсов? Поэтому я думаю, что мне нужно на самом деле прочитать таблицу ресурсов, и я надеюсь, что из таблицы ресурсов я могу определить файл значка namne, который я могу извлечь из приложения.

Мне нужен простой инструмент для этого, я знаю об apktool, который может извлечь весь файл apk, но это не то, что я хочу, так как

  • Он делает много других вещей, которые мне не нужны (декомпилировать, распаковывать другие файлы и т. д.)

  • для запуска требуется много времени

есть ли другой инструмент, который я могу использовать, чтобы просто получить путь к файлу значка?

все предложения приветствуются

EDIT: чтобы уточнить, я не пытаюсь для этого на устройстве. Я пытаюсь сделать это на ПК.

7 ответов


aapt инструмент поставляется с Android SDK, найденный под platform-tools должен дать вам детали, которые вам нужны. apktool корабли с aapt.

aapt d --values badging payload.apk

используя этот вывод, вы можете извлечь файл значка из apk (который является zip-файлом).


  • переименовать .apk файл .zip
  • распакуйте его с помощью инструмента, такого как 7zip
  • найдите значки в виде файлов png под: /res/drawable-hdpi/icon.png

Edit: обратите внимание, что этот файл присутствует не во всех файлах apk, но в большинстве из них. Я не мог найти лучшего решения, кроме как извлечь все .png файлы и выбрать один из списка.


//if your apk is not installed ..only having .apk on sdcard   
  String APKFilePath = "mnt/sdcard/myapkfile.apk"; //For example...
     PackageManager pm = getPackageManager();
     PackageInfo    pi = pm.getPackageArchiveInfo(APKFilePath, 0);

    // the secret are these two lines....
     pi.applicationInfo.sourceDir       = APKFilePath;
     pi.applicationInfo.publicSourceDir = APKFilePath;
    //

   Drawable APKicon = pi.applicationInfo.loadIcon(pm);
   String   AppName = (String)pi.applicationInfo.loadLabel(pm);

вы можете ссылаться на эту ссылку

получить-значок apk


насколько мне известно (и согласно Википедии также), APK-файлы-это ZIP-файлы в формате пакетов. Поэтому я думаю, что вы можете просто использовать любой инструмент, распаковать, распаковать APK-файл и взять значок, который вы хотите. Для запуска-значок, просто откройте AndroidManifest.xml файл и посмотрите на android:icon свойства <application>. Вероятно, это выглядит примерно так:

android:icon="@drawable/ic_launcher"

файл значка будет тогда res/drawable-<dim>/ic_launcher.png, где <dim> может быть ldpi, mdpi, hdpi, xhdpi что стенд для различных разрешений. Самое большое изображение будет xhdpi или hdpi.


этой bash функция извлечет значок и отобразит его с помощью preview. Если вы не на mac, то вы можете использовать С ImageMagick.

preview-android-icon () { unzip -p  $(aapt d --values badging  | sed -n "/^application: /s/.*icon='\([^']*\).*//p") > /tmp/$$.png && preview /tmp/$$.png; }

используйте его так:

preview-android-icon /path/to/your.apk

вы также можете попробовать редактор значков APK для этой цели.

хотя он использует Apktool под капотом, это позволяет легко редактировать, заменять или извлечь иконки только через удобный графический интерфейс. Инструмент с открытым исходным кодом, написан на C++ / Qt. Доступны встроенные двоичные файлы для Windows, macOS и Debian.


источник apktool доступен. Поскольку извлечение ресурсов и декомпиляция кода совершенно разные, я подозреваю, что было бы легко изменить его, чтобы удалить декомпиляцию кода, чтобы минимизировать его до того, что вам нужно.

Что касается определения имени файла значка, вы основываете это на содержимом AndroidManifest.xml, но вам может потребоваться учитывать несколько версий значка на основе плотности экрана,ориентации, конфигурации языка и т. д.