Главная > Linux, php > Как получить иконку из *.apk

Как получить иконку из *.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}";
        }
   }



  1. Комментариев пока нет.
  1. Трекбеков пока нет.