安卓APK文件的icon图标文件获取 xml格式

  • Post author:
  • Post category:其他


  • 正常情况下或者安卓8之前,

aapt dump  badging weixin/weixin809android1940_arm64.apk  | grep -E ‘application-icon|icon’

直接去获取图标png文件。

  • 安卓8版本之后的APK,自适应图标,图标路径查询出来是一个xml文件,而且这个xml还是个安卓二进制的AXML,需要用工具转才能读出来,一般可以安装androguard工具对打包好的APK内各种axml格式以及resource.arsc进行查询转换,详细可参考

    https://androguard.readthedocs.io/en/latest/intro/axml.html

但实际上对图标的获取,通用的aapt工具一样能够搞定。

首先aapt dump  badging weixin/weixin809android1940_arm64.apk  | grep -E ‘application-icon|icon’

查询到对应的icon值,一般自适应的图标会是一个a.xml这样的值而不是直接对应png图片文件。

因为自适应图标由几个图层叠加而成,所以,这个a.xml里面会包含底层和中间层,叠加起来会再和手机提供的蒙版(上层)一起叠加从而获得原型,圆角等不通风格的图标。从而实现一个APP在不同手机上安装出现不同样子的图标。具体参考

https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive

话说回来,查询到a.xml这样的icon后,用命令

test@PC:~/Documents/uengine-runner/apk$ aapt dump xmltree  weixin/weixin809android1940_arm64.apk  r/aj/a.xml
N: android=http://schemas.android.com/apk/res/android
  E: adaptive-icon (line=2)
    E: background (line=3)
      A: android:drawable(0x01010199)=@0x7f0d0003
    E: foreground (line=4)
      A: android:drawable(0x01010199)=@0x7f0d0004

这样能查询出这个xml文件内容,这个xml是一个axml二进制文件,不能直接解压apk包来读取,只能用aapt工具来查询,通过查询,可获得APP提供的两层图标资源的ID是

  • 0x7f0d0003
  • 0x7f0d0004

获取到资源ID后,再去查询resources.arsc资源索引获取对应的png文件

aapt dump  –values resources weixin/weixin809android1940_arm64.apk | grep -iC4 7f0d0003

这样就能获取到自适应图标的两层了。

actionchen@actionchen-PC:~/Documents/uengine-runner/apk$ aapt dump  --values resources weixin/weixin809android1940_arm64.apk | grep -iC4 7f0d0003
    type 12 configCount=5 entryCount=9
      spec resource 0x7f0d0000 com.tencent.mm:mipmap/l: flags=0x00000100
      INVALID TYPE CONFIG FOR RESOURCE 0x7f0d0001
      spec resource 0x7f0d0002 com.tencent.mm:mipmap/a: flags=0x00000500
      spec resource 0x7f0d0003 com.tencent.mm:mipmap/b: flags=0x00000100
      spec resource 0x7f0d0004 com.tencent.mm:mipmap/c: flags=0x00000100
      spec resource 0x7f0d0005 com.tencent.mm:mipmap/d: flags=0x00000500
      spec resource 0x7f0d0006 com.tencent.mm:mipmap/e: flags=0x00000100
      spec resource 0x7f0d0007 com.tencent.mm:mipmap/f: flags=0x00000500
      spec resource 0x7f0d0008 com.tencent.mm:mipmap/g: flags=0x00000100
      config mdpi:
        resource 0x7f0d0002 com.tencent.mm:mipmap/a: t=0x03 d=0x00002d2f (s=0x0008 r=0x00)
          (string8) "r/ak/a.png"
        resource 0x7f0d0003 com.tencent.mm:mipmap/b: t=0x03 d=0x00002d30 (s=0x0008 r=0x00)
          (string8) "r/ak/b.png"
        resource 0x7f0d0004 com.tencent.mm:mipmap/c: t=0x03 d=0x00002d31 (s=0x0008 r=0x00)
          (string8) "r/ak/c.png"
        resource 0x7f0d0005 com.tencent.mm:mipmap/d: t=0x03 d=0x00002d32 (s=0x0008 r=0x00)
--
          (string8) "r/ak/g.png"
      config xhdpi:
        resource 0x7f0d0002 com.tencent.mm:mipmap/a: t=0x03 d=0x00002d36 (s=0x0008 r=0x00)
          (string8) "r/al/a.png"
        resource 0x7f0d0003 com.tencent.mm:mipmap/b: t=0x03 d=0x00002d37 (s=0x0008 r=0x00)
          (string8) "r/al/b.png"
        resource 0x7f0d0004 com.tencent.mm:mipmap/c: t=0x03 d=0x00002d38 (s=0x0008 r=0x00)
          (string8) "r/al/c.png"
        resource 0x7f0d0005 com.tencent.mm:mipmap/d: t=0x03 d=0x00002d39 (s=0x0008 r=0x00)
--
        resource 0x7f0d0000 com.tencent.mm:mipmap/l: t=0x03 d=0x00002d3d (s=0x0008 r=0x00)
          (string8) "r/am/l.png"
        resource 0x7f0d0002 com.tencent.mm:mipmap/a: t=0x03 d=0x00002d3e (s=0x0008 r=0x00)
          (string8) "r/am/a.png"
        resource 0x7f0d0003 com.tencent.mm:mipmap/b: t=0x03 d=0x00002d3f (s=0x0008 r=0x00)
          (string8) "r/am/b.png"
        resource 0x7f0d0004 com.tencent.mm:mipmap/c: t=0x03 d=0x00002d40 (s=0x0008 r=0x00)
          (string8) "r/am/c.png"
        resource 0x7f0d0005 com.tencent.mm:mipmap/d: t=0x03 d=0x00002d41 (s=0x0008 r=0x00)

这个问题是我自己想在UOS安装APK的设置图标发现默认图标对应的已经不是png文件了查找到的。

既然在Uengine上运行,那干脆计划安装程序提供也提供一个UOS蒙版吧,这样生成的图标就带UOS风了。



版权声明:本文为chenqioulin原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。