Извлечь значок приложения из файла 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-файлы-это 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, но вам может потребоваться учитывать несколько версий значка на основе плотности экрана,ориентации, конфигурации языка и т. д.