Apktool 反编译、修改、重打包学习使用及问题处理

反编译

$ apktool d app.apk -r --only-main-classes -o destDir
  • d 表示反编译
  •  app.apk 是目标apk文件路径
  • -r 表示不反编译资源文件
  •  --only-main-classes 表示不反编译某些资源文件目录下的dex文件,这些dex文件通常是被加固的dex.
  • -o 反编译后代码存放目录

修改

需要学习smali语法。

smali语法虽然看得懂,但是毕竟不如java、kotlin这样方便,如果我们需要写很多代码怎么做?比如 增加一个日志模块,将日志记录到sdcard的应用专用目录下。

  1. 先写一个demo apk, 在该apk中测试我们的模块。
  2. 测试功能正常后,反编译demo apk,将模块对应的smali文件拷贝到目标app反编译后的smali目录下
  3. 在合适的位置调用我们的模块入口函数。这时需要用到smali语法了,但是需要写的不多。一般就是 检查寄存器数量是否正确、创建对象、调用目标接口。

小提示

  • 尽量不要写内部类,这样可以少拷贝文件的数量。
  • 模块函数入口参数尽量少

打包

$ apktool b
  • b 表示打包,apk默认生成路径在 dist/目录下

打包时可能遇到错误

  1. java.lang.OutOfMemoryError 该错误表示内存不够用,需要找到apktool的脚本所在位置,找到设置内存的地方(-Xmx),比如我的电脑,xmx默认是256M, 我将其改为2G(-Xmx2G)即可正常。
  2. 打包运行后,class找不到或dex内class数量为0。原因可能是打包途中遇到了错误,导致dex内容不完整。解决办法:删除出问题的dex文件,重新打包,该dex会被重新生成。
  3. 如果二次打包apk的途中产生了其他错误,都需要删掉出错时正在处理的dex文件dex路径在反编译后源码路径 build/apk/ 下), 重新执行打包命令。原因:出错的dex存在目标文件夹下,会被apktool误认为已编译成功。

签名

首先找到apksigner这个工具,一般都在sdk/build-tools目录下,参考(我已将其配置到了环境变量中,所以才能搜索到)

$ which apksigner 
~/Android/Sdk/build-tools/34.0.0/apksigner

找到文件所在位置后,将其添加到环境变量中即可。

$ apksigner sign --ks {keystore} --ks-key-alias {alias} --ks-pass pass:{password} --key-pass pass:{password}  {dist/app.apk}

注意:上面签名代码中,所有{}引用的地方都需要换成自己的参数。

  • keystore keystore文件路径
  • alias key的别名
  • ks-pass keystore对应的密码
  • key-pass key对应的密码
  • dst/app.apk 目标apk的路径

签名成功后,签名好的apk仍然是 dst/app.apk。

接下来就可以安装运行啦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/830901.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPG的使用

这里写自定义目录标题 安装加密程序生成加密密钥怎么备份自己的密钥就可以使用公钥加密邮件信息了 安装加密程序 下载gpg4win: https://www.gpg4win.org/index.html 免费的,如果使用的是苹果电脑,使用https://gpgtools.org/。 如果是linux&a…

中建三局,宁德时代,金证科技,途游游戏,得物,蓝禾,顺丰,康冠科技24春招内推

中建三局,宁德时代,金证科技,途游游戏,得物,蓝禾,顺丰,康冠科技24春招内推 ①得物 【岗位】技术,设计,供应链,风控,产品,运营&#xf…

Python 与 TensorFlow2 生成式 AI(四)

原文:zh.annas-archive.org/md5/d06d282ea0d9c23c57f0ce31225acf76 译者:飞龙 协议:CC BY-NC-SA 4.0 第九章:文本生成方法的崛起 在前几章中,我们讨论了不同的方法和技术来开发和训练生成模型。特别是在第六章“使用 …

vue3 依赖-组件tablepage-vue3 项目公共配置封装

github求⭐ 可通过github 地址和npm 地址查看全部内容 vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例-汇总 vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例(Ⅰ&#…

常用网络知识点(网管网工需掌握)

前言 最近在学习网络方面的内容时,看到很多知识点重复出现,不管在任何地方都能利用,我也就加班整理出一份针对于网络管理员/网络工程师等从业网络方面的知识点汇总 有需要的可以点赞搜藏慢慢看!后续还会更新常见配置命令 BGP BGP…

【C++】匿名对象超详细详解(什么是匿名对象?对象可以是哪些类型呢?)

目录 一、前言 二、匿名对象的概念详解 🥝 语法结构 🍍概念理解 三、匿名对象的对象类型 四、匿名对象的使用 🍇简单场景的使用 🍉复杂场景的使用 五、总结 六、共勉 一、前言 在C中,匿名对象(Ano…

一文解决ArcGIS生成点和管段 含案例讲解

背景 在工作中,我们经常遇到要将坐标数据导入 GIS,生成点位,若是地理坐标系(经纬度),那么直接用 arcgis或者QGIS 导入数据就行了,可实际中总会遇到各种问题: 坐标数据集为大地 200…

《大数据最全面试题-Offer直通车》目录

大数据时代已经到来,数据科学家、大数据工程师、数据分析师等岗位成为了热门职业。如果你正准备面试,想要脱颖而出,那么《大数据最全面试题-Offer直通车》是你的不二选择。 本书汇集了多篇超过1万字的精华内容,包括程序员入职新公…

如何使用Go语言进行基准测试(benchmark)?

文章目录 一、基准测试的基本概念二、编写基准测试函数三、运行基准测试四、优化代码性能五、注意事项总结 在Go语言中,基准测试(benchmark)是一种评估代码性能的有效方式。通过基准测试,我们可以测量代码执行的时间、内存使用情况…

requestbody无法将json字符串转为相应类

报错问题:"requestbody无法将json字符串转为相应类" 通常意味着在使用Spring框架的REST API时,客户端发送的JSON数据无法被正确地解析为服务器端预期的Java对象。 可能的原因和解决方法: JSON格式错误:确保客户端发送的…

【Linux】详解core dump文件的作用以及用法ubuntu20.04下无法形成core dump文件的解决办法

说明 从第三大点开始讲解ubuntu20.04下无法形成core dump文件的解决办法。 一、core与term的区别 在之前讲过的信号中,终止进程的信号的动作分为两种,一种是core,一种是term。term(全称termination)是直接终止进程&am…

HTML_CSS学习:CSS像素与颜色

一、像素 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>像素</title> </head><style>.atguigu1{/*单位可以是cm&#xff0c;但不能是m,dm*/width: 1cm;height: 1cm;background-c…

Java语法day1

Java语法day1 一、选择题二、编程题 一、选择题 1、派生类调用基类的构造器必须用到的关键字&#xff08;C&#xff09; A: this B: final C: super D: static 说明&#xff1a;调用父类的构造器或者父类的方法&#xff0c;要用关键字super 2、以下哪个接口的定义是正确的&am…

C++ string类

目录 0.前言 1.为什么学习string类 1.1 C语言字符串的局限性 1.2 C string类的优势 2.标准库中的string类 2.1 字符串作为字符序列的类 2.2 接口与标准容器类似 2.3 基于模板的设计 2.4 编码和字符处理 3.string类的常用接口说明 3.1构造函数 3.1.1默认构造函数 3…

GPU 架构与 CUDA 关系 并行计算平台和编程模型 CUDA 线程层次结构 GPU 的算力是如何计算的 算力峰值

GPU 架构与 CUDA 关系 本文主要包含 NVIDIA GPU 硬件的基础概念、CUDA(Compute Unified Device Architecture)并行计算平台和编程模型,详细讲解 CUDA 线程层次结构,最后将讲解 GPU 的算力是如何计算的,这将有助于计算大模型的算力峰值和算力利用率。 GPU 硬件基础概念GP…

Unity Timeline学习笔记(5) - 自定义轨道切片上变量Transform对象丢失,使用ExposedReference来解决。

问题 我在笔记(4)中后来又引用了Hierarchy中的Transform对象Transform obj&#xff0c;发现一些问题。 要么无法拖入进去对象&#xff0c;要么拖入进去保存后&#xff0c;再次编辑或者运行的时候发现obj丢失了。 我们还是用修改下笔记&#xff08;4&#xff09;的部分代码来…

linux查看端口占用

以3040端口为例 要查看在Linux系统中哪个程序占用了3040端口&#xff0c;可以使用lsof命令或netstat命令结合适当的参数。这里提供两种常用的方法&#xff1a; 方法1&#xff1a;使用 lsof 命令 lsof&#xff08;List Open Files&#xff09;是一个查看当前系统打开文件的工…

Django后台项目开发实战二

我们的需求是开发职位管理系统 三个功能&#xff1a; 管理员发布职位候选人能浏览职位用户能投递职位 第二阶段 创建应用 jobs&#xff0c;实现职位数据的建模 python manage.py startapp jobs 然后再 setting .py 注册应用&#xff0c;只需添加应用名称到最后一行 INST…

实验报告5-Spring MVC实现页面

实验报告5-SpringMVC实现页面 一、需求分析 使用Spring MVC框架&#xff0c;从视图、控制器和模型三方面实验动态页面。模拟实现用户登录&#xff0c;模拟的用户名密码以模型属性方式存放在Spring容器中&#xff0c;控制器相应用户请求并映射参数&#xff0c;页面收集用户数据或…

Golang实现一个批量自动化执行树莓派指令的软件(7)辅助模块-本地活动网络

简介 为了更方便的使用&#xff0c;我们将实现一个可以扫描本地连接网络中可用连接的扫描功能&#xff0c; 扫描本地连接网络中有哪些连接的设备主机。 环境描述 运行环境: Windows&#xff0c; 基于Golang&#xff0c; 暂时没有使用什么不可跨平台接口&#xff0c; 理论上支持…