从apk文件中提取应用程序图标

10
我需要从apk文件中提取应用程序图标。我只需要一个图标,不想提取apk中的其他内容。这些文件很容易找到,但是如何确定正确的应用图标文件呢?我猜存储在资源表中?所以我想我需要读取资源表,希望从资源表中确定图标文件名,然后从应用程序中提取它。
我需要一个简单的工具来完成这个任务,我知道apktool可以提取整个apk文件,但这不是我想要的,因为:
- 它会做很多我不需要的事情(反编译、解压缩等)。 - 运行起来需要很长时间。
有没有其他工具可以只获取图标文件路径?
欢迎提出所有建议。
注:为了澄清,我不是在设备上进行此操作,而是在PC上。

实际上,你可以在程序中以drawable的形式获取应用程序图标,然后将其转换为位图并保存到设备内存中。 - Dharmendra
@dharmendra,我实际上是在尝试在Web服务上完成这个操作,而不是在实际设备上。我会在问题中澄清这一点。 - www.jensolsson.se
8个回答

13

aapt 工具随附于 Android SDK 中,可以在 platform-tools 目录下找到,它可以提供您所需的详细信息。apktool 也随 aapt 一起提供

aapt d --values badging payload.apk

使用此输出,您可以从 apk 文件(即 zip 文件)中提取图标文件。


它会为某些apk返回ic_launcher.xml。我不明白为什么。 - zakjma
@zakjma 这很可能是一个自适应图标,而不是PNG格式的。 - Eugen Pechanec

12
  • 将.apk文件重命名为.zip
  • 使用类似7zip的工具解压它
  • 在以下位置找到以png格式的图标文件: /res/drawable-hdpi/icon.png

编辑: 注意,并非所有apk文件中都有该文件,但大多数都有。除了提取所有的.png文件并从列表中选择一个之外,我找不到更好的解决方案。


这不是正确的解决方案,因为您无法确定图标名称,并且应用程序中可能有许多图标。icon.png并不一定意味着它是应用程序图标。 - www.jensolsson.se
1
是的,我编辑了我的答案。我认为没有一种方法可以找到正确的文件;对于我的个人使用,我会在服务器上提取所有文件并列出所有.png文件,然后选择其中一个。 - adrianTNT
1
我在/res/mipmap-xxxhdpi-v4/icon.png中找到了图标,而在/res/drawable-hdpi/ 中仅包含启动图片(可能是因为 Android 的更高版本发生了变化(2019 :)))。 - Guilherme Nascimento

8
//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图标


6
据我所知(并且根据维基百科的说法),APK 文件是 ZIP 文件格式的软件包。因此,您可以使用任何解压缩工具来解压缩 apk 文件并获取所需的图标。对于启动器图标,只需打开 AndroidManifest.xml 文件,查看 <application>android:icon 属性即可。它可能看起来像这样:

android:icon="@drawable/ic_launcher"

然后,图标文件将位于 res/drawable-<dim>/ic_launcher.png,其中 <dim> 可以是任何一个表示不同分辨率的选项: ldpi,mdpi,hdpi,xhdpi 中的一个。最大的图像将在 xhdpihdpi 中。


谢谢回复,但不幸的是,AndroidManisfest.xml文件已经编译成二进制格式。如果有人能找到一个小工具来反编译AndroidManifest.xml,那将是一个好的解决方案。 - www.jensolsson.se

3
这个 bash 函数将提取图标并使用 preview 显示。如果您不在 Mac 上,那么您可以使用来自 ImageMagickdisplay 命令。
preview-android-icon () { unzip -p $1 $(aapt d --values badging $1 | sed -n "/^application: /s/.*icon='\([^']*\).*/\1/p") > /tmp/$$.png && preview /tmp/$$.png; }

使用方法如下:

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

这是一个不错的建议,但许多新的 APK 都有所不同,这个命令可能不起作用。 - Zdenek

3

软件

您也可以尝试使用这些GUI工具轻松提取Android应用程序图标:

描述

虽然Apktool是在后台使用的,但GUI前端使提取或更改APK图标变得非常简单。

适当的应用程序图标会自动从清单和内部结构中解析出来,因此无需手动搜索所需的资源文件。

APK Icon Editor

  • 这两个工具都可通过用户友好的GUI帮助您轻松编辑、替换或提取图标
  • 这两个工具均适用于WindowsmacOSLinux
  • 这两个工具均为开源(使用C++/Qt编写)。

免责声明

我是这些工具的作者。


1
如果您像我一样是新手,可以使用名为My APK的Android应用程序(Google Play链接)在您的Android手机上提取应用程序图标,无论是安装了此应用程序还是您只是从外部源如apkMirrorAPKpureAppsAraby下载了apk文件。

0

apktool的源代码是可用的。由于资源提取和代码反编译有很大的区别,我怀疑很容易修改它以删除代码反编译,将其最小化到您所需的内容。

至于确定图标文件名,您可以基于AndroidManifest.xml的内容进行基础,但您可能需要考虑基于屏幕密度、方向、语言配置等多个版本的图标。


谢谢回复。我也一直在考虑这些方面,并已开始从apktool中提取清单反编译部分的工作。但如果能找到一些开箱即用的工具来完成这项工作,那就太好了。我希望有这样的工具存在。 - www.jensolsson.se

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接