Как получить иконку из *.apk
Начнем с того, что *.apk – обычный архив, который можно распаковать любым архиватором, работающим с zip. Т.е., если иконку искать вручную, то нужно распаковать файл и где-нибудь в /res найти icon.png. Но, поскольку, файл иконки может лежать где угодно, в зависимости от предпочтений разработчика, то желательно знать, где именно хранится иконка. Эту информацию можно получить из AndroidManifest.xml, но это не обычный, а двоичный xml, поэтому прочитать его в текстовом редакторе не получится. Мои попытки найти способ получить информацию из AndroidManifest.xml без средств Android SDK не увенчались успехом. Удалось это сделать с помощью утилиты aapt.
aapt dump badging Filename.apk
Эта команда выведет имя пакета, версию, путь к файлу иконки и прочую информацию.
Далее, не составит труда написать код, получающий путь к файлу иконки.
/**
* Возвращает путь к файлу иконки из *.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 для дальнейшего использования согласно решаемой задачи.
$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}";
}
}