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

2024-05-01 23:44

本文主要是介绍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。

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

这篇关于Apktool 反编译、修改、重打包学习使用及问题处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/952954

相关文章

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所