未加星标

APK提取图标脚本

字体大小 | |
[开发(python) 所属分类 开发(python) | 发布者 店小二03 | 时间 2018 | 作者 红领巾 ] 0人收藏点击收藏

最近同学换手机,看不爽3×0那个ui,打算自己做主题,找我提取Flyme自带的图标。嘛,虽然不是啥复杂的东西,手动也能解决,不过一旦图标多起来就受不了了。于是我就写了个python脚本批量处理。

import os import re import shutil import xml.dom.minidom from xml.dom.minidom import parse apk_path = 'apks/' icons_path = 'icons/' def decomp(apk_name): os.system("apktool d %s%s" % (apk_path, apk_name)) def search_for_icon(base_path, icon_str): if icon_str is None or icon_str == "": return None matches = re.match(r'@(.*)\/(.*)', icon_str) path_name = matches.group(1) icon_name = matches.group(2) ls = os.listdir(base_path) ls.reverse() for p in ls: if p.startswith(path_name): path = os.path.join(base_path, p, icon_name+".png") if os.path.exists(path): return path return None def parse_for_icon(apk_name): base_path = apk_name[:-4] dom = parse(base_path+"/AndroidManifest.xml") collection = dom.documentElement tag = collection.getElementsByTagName("application")[0] # Something like: @mipmap/ic_launcher icon_android_path = tag.getAttribute("android:icon") return search_for_icon("%s/res/" % base_path, icon_android_path) def del_file(path): ls = os.listdir(path) for i in ls: c_path = os.path.join(path, i) if os.path.isdir(c_path): del_file(c_path) else: os.remove(c_path) os.rmdir(path) def move_apk_out(path): ls = os.listdir(path) for i in ls: c_path = os.path.join(path, i) if os.path.isdir(c_path): move_apk_out(c_path) elif i[-3:] == 'apk': shutil.move(c_path, apk_path+i) if __name__ == '__main__': move_apk_out(apk_path) apk_list = [] list = os.listdir(apk_path) for i in range(0, len(list)): path = os.path.join(apk_path, list[i]) if os.path.isfile(path) and list[i][-3:] == 'apk': apk_list.append(list[i]) print(apk_list) for apk in apk_list: print("Geting icon for: %s" % apk) decomp(apk) icon_path = parse_for_icon(apk) if icon_path is not None and os.path.exists(icon_path): shutil.move(icon_path, "%s%s.png" % (icons_path, apk[:-4])) else: print("Failed to get: " + apk) if os.path.exists(apk[:-4]): del_file(apk[:-4])

Gist地址

由于比较偷懒,用了直接apktool反编译这种很慢的方式。其实只用提取AndroidManifest.xml,解码之后获取图标就好,而apktool则会把资源全都解码并反编译smali码。还有,一个应用的图标一般都会配备多个尺寸,我的方法也很偷懒,就是选个最大的(倒序lsdir的结果23333)。不过竟然能跑,虽然慢是慢了一点,不过还是很方便的。

本文开发(python)相关术语:python基础教程 python多线程 web开发工程师 软件开发工程师 软件开发流程

tags: path,apk,os,icon,list,name,ls,base,move,图标,dom,xml
分页:12
转载请注明
本文标题:APK提取图标脚本
本站链接:https://www.codesec.net/view/586418.html


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 开发(python) | 评论(0) | 阅读(75)