Как получить иконку из *.apk
Начнем с того, что *.apk – обычный архив, который можно распаковать любым архиватором, работающим с zip. Т.е., если иконку искать вручную, то нужно распаковать файл и где-нибудь в /res найти icon.png. Но, поскольку, файл иконки может лежать где угодно, в зависимости от предпочтений разработчика, то желательно знать, где именно хранится иконка. Эту информацию можно получить из AndroidManifest.xml, но это не обычный, а двоичный xml, поэтому прочитать его в текстовом редакторе не получится. Мои попытки найти способ получить информацию из AndroidManifest.xml без средств Android SDK не увенчались успехом. Удалось это сделать с помощью утилиты aapt.
1 2 3 |
aapt dump badging Filename.apk |
Эта команда выведет имя пакета, версию, путь к файлу иконки и прочую информацию.
Далее, не составит труда написать код, получающий путь к файлу иконки.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
/** * Возвращает путь к файлу иконки из *.apk (при установленной утилите aapt) * @param string $filename - путь к файлу *.apk * @return string/null - путь к файлу иконки, * либо null, если не удалось получить путь */ function get_iconpath($filename = '') { if (empty($filename)) return null; if (!file_exists($filename)) return null; $command = "aapt dump badging '{$filename}'"; exec($command, $output); if (empty($output)) return null; // парсим информацию полученную командой aapt dump badging // ищем первое вхождение 'icon=' и далее вырезаем лишние символы foreach ($output as $v) { if ($icon_str = strstr($v, 'icon=')) break; } $icon_path = explode('=', $icon_str); $icon_path = substr($icon_path[1], 1, strlen($icon_path[1])-2); return $icon_path; } |
Еще раз, обращаю внимание, что функция будет работать,
если установлена утилита aapt.
После получения пути к иконке, можно распаковать файл *.apk во временную папку и скопировать файл icon.png для дальнейшего использования согласно решаемой задачи.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$filename = "/tmp/my_android.apk"; $command = "unzip -o \"" . $filename . "\" -d /tmp "; system($command, $retval); if (!empty($retval)) { echo "Не удалось выполнить команду: {$command}"; } else { $icon_path = '/tmp/' . get_iconpath($filename); if (!copy($icon_path, '/tmp/icons/icon.png')) { echo "Не удалось скопировать иконку {$icon_path}"; } } |
Свежие комментарии