位置: 编程技术 - 正文

ApkTool原码修改记录(apktool修改包名)

编辑:rootadmin

推荐整理分享ApkTool原码修改记录(apktool修改包名),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:apk 修改,apktool修改版本号,apktool修改软件安卓版本,apktool修改包名,apktool修改包名,apktool修改软件安卓版本,apktool修改软件安卓版本,apktool修改版本号,内容如对您有帮助,希望把文章链接给更多的朋友!

转载请注明:本文源自 in thread "main" java.lang.ClassCastException: brut.androlib.res.data.value.ResStringValue cannot be cast to brut.androlib.res.dat at brut.androlib.res.decoder.ResAttrDecoder.decode(ResAttrDecoder.java:) at brut.androlib.res.decoder.AXmlResourceParser.getAttributeValue(AXmlResourceParser.java:) at org.xmlpull.v1.wrapper.classic.XmlPullParserDelegate.getAttributeValue(XmlPullParserDelegate.java:) at org.xmlpull.v1.wrapper.classic.StaticXmlSerializerWrapper.writeStartTag(StaticXmlSerializerWrapper.java:) at org.xmlpull.v1.wrapper.classic.StaticXmlSerializerWrapper.event(StaticXmlSerializerWrapper.java:) at brut.androlib.res.decoder.XmlPullStreamDecoder$1.event(XmlPullStreamDecoder.java:) at brut.androlib.res.decoder.XmlPullStreamDecoder.decode(XmlPullStreamDecoder.java:) at brut.androlib.res.decoder.ResStreamDecoderContainer.decode(ResStreamDecoderContainer.java:) at brut.androlib.res.decoder.ResFileDecoder.decode(ResFileDecoder.java:) at brut.androlib.res.decoder.ResFileDecoder.decode(ResFileDecoder.java:) at brut.androlib.res.AndrolibResources.decode(AndrolibResources.java:) at brut.androlib.Androlib.decodeResourcesFull(Androlib.java:) at brut.androlib.ApkDecoder.decode(ApkDecoder.java:) at brut.apktool.Main.cmdDecode(Main.java:) at brut.apktool.Main.main(Main.java:)

网上搜时,要用最新的apktool.jar,于是,下载了apktool_2.0.0rc3.jar,apktool_2.0.0rc2.jar,apktool_2.0.0rc4.jar,估计4是网上大神自己发布的,但没有一个能正确反编译xml,都报错,有人给出答案:加-r参数:pktool d -r xx.apk xx,其实这样做,xml是解压出来的,根本没解析。折腾了好久,没搞定,一怒之下,找了apktool源码,但这个源码是在Google服务器上的一个开源项目,国内的环境,你懂的!没办法,只能下载一个,忘了这个下载地址在哪,真的对不起,但我把修改过的源码放到了开源中国git服务器上,git地址: brut.androlib.res.decoder.ResAttrDecoder.decode(ResAttrDecoder.java:)这个地方,发现原来是类型强转不对,接下问题就好解了

问题出在这:

ResAttr attr = (ResAttr) getCurrentPackage().getResTable() .getResSpec(attrResId).getDefaultResource().getValue(); decoded=attr.convertToResXmlFormat(resValue);

看了下,getCurrentPackage().getResTable().getResSpec(attrResId).getDefaultResource().getValue();报错时返回&#;是:ResStringValue类型的,ResStringValue与ResAttr其实不是父子关系,而是兄弟关系,所以强转肯定会报错的,解决方法:

ResValue attr = (ResValue) getCurrentPackage().getResTable() .getResSpec(attrResId).getDefaultResource().getValue(); if (attr instanceof ResStringValue) { decoded=((ResStringValue)attr).encodeAsResXmlAttr();// System.out.println("decoded="&#;decoded); } else if (attr instanceof ResAttr) { decoded = ((ResAttr) attr).convertToResXmlFormat(resValue); }

判断下返回&#;的类型,如果是ResStringValue,就按ResStringValue类型处理,如果是ResAttr,就按ResAttr类型处理 ,再反编译下,竟然正常了!有点小激动!

反编译完后,再回编译,又陷入了坑中……但这反编译是没问题的,用其他版本apktool.jar可正常回编译,但这个源码处,怎么也不能正常回编!

苦思中……

很久……

没办法,再来,把回编译流程跟踪了一遍,再看下其他版本的apktool.jar代码,(通过gd-gui.exe)再把相关的函数对比了下,竟然没发现不同!!!

绝望了……

只好从报错处开始研究,发现是这个变量引起的:mAaptPath

mAaptPath是aapt.exe文件路径,调试时,发现如果加入-a ./aapt.exe,就可以正常回编,知道问题所在了,如果没指定-a参数,程序就会自动去找aapt.exe,如果没找到就会报错,然后跟踪了找aapt.exe文件的函数:

ApkTool原码修改记录(apktool修改包名)

在Androlib.java中

mAndRes.aaptPackage(apkFile, new File(appDir, "AndroidManifest.xml"), new File(appDir, "res"), ninePatch, null, parseUsesFramework(usesFramework), flags, mAaptPath);

往下走:AndrolibResources.java中的aaptPackage中:

这是我修改过的的代码,加入了打印

if (!aaptPath.isEmpty()) { File aaptFile = new File(aaptPath); if (aaptFile.canRead() && aaptFile.exists()) { aaptFile.setExecutable(true); cmd.add(aaptFile.getPath()); LogDebug.i("aaptPackage 1"); customAapt = true; if (flags.get("verbose")) { LOGGER.info(aaptFile.getPath() &#; " being used as aapt location."); } } else { LOGGER.warning("aapt location could not be found. Defaulting back to default"); try { LogDebug.i("aaptPackage 2"); cmd.add(getAaptBinaryFile().getAbsolutePath()); } catch (BrutException ignored) { LogDebug.i("aaptPackage 3"); cmd.add("aapt"); } } } else { try { File aaptFile = new File(getAaptBinaryFile().getAbsolutePath()); if (aaptFile.canRead() && aaptFile.exists()) { aaptFile.setExecutable(true); cmd.add(aaptFile.getPath()); LogDebug.i("aaptPackage "); customAapt = true; if (flags.get("verbose")) { LOGGER.info(aaptFile.getPath() &#; " being used as aapt location."); } } else { cmd.add(getAaptBinaryFile().getAbsolutePath()); LogDebug.i("aaptPackage 4" &#; getAaptBinaryFile().getAbsolutePath()); } } catch (BrutException ignored) { LogDebug.i("aaptPackage 5"); cmd.add("aapt"); } }

关键是:getAaptBinaryFile().getAbsolutePath()这个方法,出问题了,有问题就得改:

在getAaptBinaryFile函数中,有三个分支:

try { if (OSDetection.isMacOSX()) { mAaptBinary = Jar .getResourceAsFile("/prebuilt/aapt/macosx/aapt"); } else if (OSDetection.isUnix()) { mAaptBinary = Jar .getResourceAsFile("/prebuilt/aapt/linux/aapt"); } else if (OSDetection.isWindows()) { // mAaptBinary = // Jar.getResourceAsFile("/prebuilt/aapt/windows/aapt.exe"); mAaptBinary = new File(getAaptPath()); } else { LOGGER.warning("Unknown Operating System: " &#; OSDetection.returnOS()); return null; } } catch (BrutException ex) { throw new AndrolibException(ex); }

(以上代码注释部分为源码)

看方法名也知道,其他两个系统:Mac和Unix我就没去研究了,只是在Windows系统下调试,修改:mAaptBinary = new File(getAaptPath());

其中:getAaptPath()方法就是获取aapt.exe文件路径,实现原理:用java执行cmd命令:echo %PATH%

把得到的字符串(系统变量中的path变量,用“;”分隔)分割成字符串数组,对数组中的每个元素进行扫描(每个元素其实是目录地址),直到找到aapt.exe,就返回该文件地址,具体实现请参照代码中的写法!

纯手打,望尊重程序员的劳动成果!

android图片透明度跟缩放大小动画事件 概序:动画事件写在xml中,然后用AnimationUtils去加载动画事件,再监听动画结束事件,隐藏imageview。1.player_double_click_animation.xml动画文件?xmlversion=1.0encoding=ut

[android] android开发中常用的Eclipse快捷键 Eclipse快捷键-方便查找,呵呵,记性不好行注释/销注释Ctrl/块注释/销注释/XML注释CtrlShift/CtrlShift查找查找替换CtrlHCtrlF查找下一个/往回找CtrlKCtrlShiftK跳到

【面试题】JAVA 一个线程依赖另外一个线程的结果 publicclassMain{publicstaticclassMyCallableimplementsCallableInteger{publicIntegercall()throwsException{return1;}}publicstaticvoidmain(String[]args){MyCallablecallable=newMyCallable();FutureTaskIntege

标签: apktool修改包名

本文链接地址:https://www.jiuchutong.com/biancheng/376646.html 转载请保留说明!

上一篇:Android网络请求开源框架Volley快速使用指南(2)——异步获取图片(android网络请求时怎么取消)

下一篇:android图片透明度跟缩放大小动画事件(android图片透明度怎么设置)

  • 增值税发票综合服务平台怎么下载
  • 金税盘开票系统怎么增加税目
  • 防伪税控风险纳税人财务负责人和法人同一人
  • 关税的征收对象是贸易性商品,不包括
  • 可转债中签后怎么操作卖出
  • 游戏公司收入确认方法
  • 现金流量表季度申报可以不填吗
  • 商业企业收取各项费用的税务与会计处理
  • 独资企业要交税吗
  • 给退休工人发工资怎么入账
  • 房地产成本核算会计分录
  • 个人出租房屋应该注意什么
  • 买东西几块钱忘付了怎么办
  • 注册资本金印花税税率是多少
  • 财产税放在哪个科目
  • 写字楼空置房物业费70%的规定
  • 专票入账暂不抵扣如何申报
  • 购买健身器材需要注意什么
  • 金融服务手续费可以抵扣进项税吗
  • 买入返售金融资产是资产还是负债
  • 个人独资企业查账征收个人所得税汇算清缴
  • 资源税的征税对象和纳税环节
  • 委托加工物资成本计入
  • window10过期
  • 三种测试网速的方法
  • 什么是汇兑损益,汇兑损益产生的原因有哪些?(10分)
  • 从租计征房产税怎么申报
  • 主营业务收入和营业收入的区别
  • Windows11电脑更新后冲不上电
  • 在建工程减值准备核销
  • 对外长期投资会计分录
  • 圣克鲁斯河特点
  • php+jQuery+Ajax实现点赞效果的方法(附源码下载)
  • linux命令大全详解
  • 我国中小企业成本管理现状
  • 工装费用会计分录
  • 企业所得税的计提和缴纳分录
  • 为什么很多银行卡会被异地警方冻结
  • 收到社保稳岗补贴转入营业外收入要交企业所得税吧
  • 增值税加计扣除比例
  • vue定时调用方法
  • npm install 的 --save 选项是什么?
  • 增值税专用发票有几联?
  • 工业企业采购部工作职责
  • sql server如何操作
  • 企业进行成本核算时,应根据生产经营特点
  • 纳税人办理普通发票流程
  • 一般纳税人增值税优惠政策2023
  • 税费损失
  • 公司收到拆迁补偿金,于评估公司的区别
  • 农业开发公司的名称有哪些
  • 以销定产会计怎么做账科目
  • 计提盈余公积比例
  • 营业外支出有哪些费用
  • 启动sqlserver服务的命令
  • win2003取消自动锁定
  • 远程登陆服务器命令
  • 笔记本上安装软件怎么弄
  • win10 rs5
  • Windows虚拟内存不足
  • win10回收站文件在哪里
  • win8.1怎么用
  • centos常用命令安装
  • win7怎么运行itunes
  • win8自启动在哪儿设置
  • linux小技巧
  • win8怎么更新到win8.1
  • node.js基础入门
  • perl脚本输出变量
  • JS实现的ajax和同源策略(实例讲解)
  • vue router详解
  • 安卓系统休眠设置在哪
  • 安卓手机管家
  • 源码搜索
  • 重庆市医疗保障局
  • 股权转让是实缴资本吗
  • 增值税一般纳税人资格登记表
  • 税务绩效管理存在不足
  • 江苏省国家税务总局电子税务局
  • 个人所得税怎么申报
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设