由于一次奇怪的需求,开始研究AndroidManifest的二进制格式,继而产生了直接修改AndroidManifest二进制格式的想法。虽然代码写的乱七八糟,不过好歹也是劳动成果。
在此鸣谢:MindMac对其格式的详细分析:http://bbs.pediy.com/showthread.php?t=194206
完整代码我已经上传到github上了:https://github.com/ele7enxxh/AmBinaryEditor
vs2012,gcc均能成功编译,有相同需求的可以去下一份,下面介绍一下工具的功能和用法示例:
目前功能:
新增、修改、删除指定名字的tag或者该tag的attr
用法示例:
增加一个tag(-d选项指定新增tag的起始位置,如1表示添加在manifest节点之后;-c选项指定新增tag经过的节点数,以此确定新增tag的结尾位置):
editor tag --add activity -d 1 -c 0 -i input.xml -o output.xml
改一个tag的名字(-d选项指定要修改的tag是从manifest节点开始出现的第几个同名tag,-n选项指定tag的新名字):
ameditor tag --modify application -d 1 -n test -i input.xml -o output.xml
删除指定tag(-d选项指定要修改的tag是从manifest节点开始出现的第几个同名tag):
ameditor tag --remove application -d 1 -i input.xml -o output.xml
增加一个attr(-d选项指定要修改的tag是从manifest节点开始出现的第几个同名tag,-n选项指定attr的名字,-t选项指定attr的类型(后面会有更多介绍)-v选项指定attr的值,-r选项指定attr的属性ID(可选)):
ameditor attr --add application -d 1 -n name -t 3 -v test -i input.xml -o output.xml
修改一个attr(-n选项指定需要修改的attr,其他同上):
ameditor attr --modify application -d 1 -n name -t 3 -v new -i input.xml -o output.xml
删除一个attr(-n选项指定需要删除的attr,其他同上):
ameditor attr --remove application -d 1 -n name -i input.xml -o output.xml
attr -t选项说明:
enum { ATTR_NULL = 0, ATTR_REFERENCE = 1, ATTR_ATTRIBUTE = 2, ATTR_STRING = 3, ATTR_FLOAT = 4, ATTR_DIMENSION = 5, ATTR_FRACTION = 6, ATTR_FIRSTINT = 16, ATTR_DEC = 16, ATTR_HEX = 17, ATTR_BOOLEAN = 18, ATTR_FIRSTCOLOR = 28, ATTR_ARGB8 = 28, ATTR_RGB8 = 29, ATTR_ARGB4 = 30, ATTR_RGB4 = 31, ATTR_LASTCOLOR = 31, ATTR_LASTINT = 31, }; |
目前暂不支持ATTR_DIMENSION和ATTR_FRACTION类型。
2015.6.25更新
attr -r选项说明:
当你所添加的attr的name在原axml中并不存在时,必须添加-r选项指定该name的resourceid,具体的resourceid在对应 Android 源码中/frameworks/base/core/res/res/values/public.xml中可以查到,另外此处需要输入十进制数。