环境搭建与使用

Java 环境

Java 开发环境分为 JRE (Java Runtime Environment) 和 JDK (Java Development Kit),我们一般安装 JDK。

JDK 常用 LTS 版本,有 8、11、17 和 21;常见的实现版本是 Oracle 的。

在安装好 JDK 后,需要在环境变量里新增一个 JAVA_HOME 条目,指向需要使用的 JDK 的安装路径,然后在 Path 里增加 %JAVA_HOME%\bin,便于多版本管理。

JADX

JADX 是 Android Dex 和 Apk 文件的反编译器,可以将文件反编译为 Java 源代码。

注意不要开反混淆,反混淆会修改一些类名,导致后面 hook 函数的时候 hook 失败。反混淆仅在类名显示为乱码时使用。

GDA

GDA 是国产的反编译器,功能也很强大,不过界面相对来说不那么好看

JEB

建议在 JADX 和 JEB 均无法顺利反编译的情况下用 JEB。

JEB 都无法顺利搞定呢?

需要定制虚拟机,输出 Smali 代码和寄存器数据。

Android Studio 与 ADB

Android Studio 基于 JetBrains IDEA,是 Android 开发的重要工具。

默认的 SDK 路径在 C:\Users\<UserName>\AppData\Local\Android\Sdk,标准安装会安装最新版的 SDK,在 Language & Frameworks > Android SDK 中可以勾选较旧版本的 SDK

在 SDK Tools 中还需要勾选 NDK (Side by side)、CMake 和 Google USB Driver

我们主要的开发和逆向工作都是在 PC 上进行的,如果需要控制手机应用的运行情况,则要将 PC 和手机关联起来,让 PC 控制手机。这就是 ADB (Android Debug Bridge) 的作用。

C:\Users\<UserName>\AppData\Local\Android\Sdk\platform-tools 下,我们就可以找到一个 adb 程序。

ADB 的构成和工作方式:

  • 客户端 (Client):用于发送命令。客户端在开发机器上运行。可以通过发出 adb 命令从命令行终端调用客户端。
  • 服务器 (server):用于管理客户端与守护程序之间的通信。服务器在开发机器上作为后台进程运行。
  • 守护程序 (ADB Daemon, adbd):用于在连接的设备上运行命令。守护程序在每个设备上作为后台进程运行。
graph LR
  A[ADB 客户端] -->|发送命令| B[ADB 服务端]
  B -->|返回结果| A
  B -->|发送命令| C[ADB Daemon]
  C -->|返回结果| B
  C -->|执行命令| D[设备]
  D -->|返回结果| C

使用 ADB 前需要配置:

  • 在开发机的环境变量中添加 platform-tools 目录
  • 在设备上启用 USB 调试(在默认隐藏的 “开发人员选项” 中),Android Studio 提供的模拟器默认开启。

然后就可以通过 adb devices 查看设备的连接情况了。

主要的 ADB 命令有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
adb help  显示 ADB 命令帮助
adb version 显示 ADB 的版本和运行路径
adb start-server 启动 ADB 服务端
adb kill-server 停止 ADB 服务端
adb devices 显示连接的设备列表
adb install <name>.apk 通过 ADB 安装 APP
adb install -r <name>.apk 覆盖安装 APP
adb uninstall <package.name> 通过 ADB 卸载 APP(注意不再是 apk 名,而是 AndroidManifest.xml 中的 package 属性值)

adb push <local_src> <remote_dest> 将开发机上的文件传送到设备上
adb pull <remote_src> <local_dest> 将设备上的文件传送到开发机上
adb shell 进入设备的 Linux 交互式终端
adb -s <device_name> shell 多设备下进入指定设备的 Linux 终端
adb shell <shell_command> 通过设备的 Linux 终端执行单条命令

adb root 以 Root 权限重启 ADB,即获取(部分)设备 Root。仅限模拟器或“超级 adbd”
adb remount 重新挂载 /system 目录并获得读写权限。需要在获得 Root 权限的 ADB 中使用

Logcat

Android 日志记录系统是系统进程 logd 维护的一组结构化环形缓冲区。这组可用的缓冲区是固定的,并由系统定义。该日志系统会存储应用日志、系统日志和崩溃日志。

Logcat 是一个命令行工具,用于转储日志,包括应用使用 Log 类写入的消息。它需要在设备的 Linux Shell 中运行,也可以和 ADB 搭配使用(本质上仍然在 Shell 中运行)。Android Studio 提供了带 GUI 的 Logcat

Logcat 的基本命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
adb logcat  常规显示
adb logcat -help 显示帮助信息
adb logcat -c 清除日志
adb logcat -g 显示日志缓冲区大小
adb logcat -G <size> 设置日志缓冲区大小
adb logcat -v time 切换日志显示格式
adb logcat -v color 带颜色的日志显示
adb logcat -v brief output 简短显示
Ctrl + C 中断 Logcat

adb logcat -s <tag> 根据 tag 过滤输出,注意 tag 大小写敏感,没有模糊搜索

ps -A | grep <package.name> # 获取进程 pid
adb logcat | findstr <pid> 根据 pid 过滤输出,注意 findstr 是 Windows 的工具

Android 扫盲

Android 开发历史简述

Android 4.4 之前,使用 Dalvik / DVM 虚拟机执行 DEX(Dalvik 可执行文件),系统中有 libdvm.so 文件
Android 4.4 时,Google 开始使用 ART (Android Runtime),但仍保留 DVM,系统中并存 libdvm.solibart.so 文件
Android 5.0+ 完全转向 ART,系统架构开始分为 32 位和 64 位

APK 基本结构

apk 本质上是一个具有特殊文件夹结构的 zip 压缩包,其中包括:

  • 静态资源文件 (assets):图片、音频、数据库、网页、配置文件、dll 和 so 文件等
  • 库文件 (lib):各种平台下使用对应的 so 文件
  • 编译资源文件 (res):编译后的布局文件、程序图标
  • 签名文件 (META - INF):
  • 配置清单文件 (AndroidManifest.xml):图标、界面、权限、代码执行入口
  • 核心代码文件 (classes.dex)
  • 资源映射文件 (resources.arsc):语言包等

还有其他文件夹,但现阶段我们只关注 lib、AndroidManifest.xml 和 classes.dex 即可

Android 文件目录结构

Android 基于 Linux,因此借鉴了 Linux 的文件树系统。

我们主要关注这些目录:

  • data/data 目录:存放 APP 数据,每个 APP 的数据又存放在该目录下以包名命名的目录内。这是一个私有目录,除非有 Root 权限,否则各个 APP 仅可访问自己的目录。由于这个私有目录对 APP 自己没有权限限制,因此可以将处理后的 APP 文件放在这类目录里。

  • data/app 目录:存放用户 APP 本体。在 Android 10 上,该目录和 data/data 近似,目录名称是包名 + 随机数,但 Android 12 开始,变成双层目录,第一层没有包名只有随机数,第二层才是包名 + 随机数。该目录下一般有 base.apk(APP 的原始 APK,大多数情况下可以直接安装)、lib/so 文件)和 oatodexvdex 等由 DEX 文件转换得到的文件)

  • data/local/tmp 目录:临时目录。该目录的权限比较大,因此也可以将处理好的文件放在这里,不用担心 data/data 的权限问题

  • system/app 目录:存放系统 APP 本体。

  • system/libsystem/lib64 目录:存放 APP 用到的 so 文件

Android 正向开发入门

无论是哪种语言 / 平台,要搞逆向,最好是先了解如何正向开发,在正向开发中知道程序的运行流程和代码特点。这一块有很多教程

Android Studio 是主要的开发工具。

在 “New Project” 中选一个工程模板

选哪种模板?

我们一般比较常用的是 Empty Views Activity 和 Empty Activity 两种,前者是传统的 View 体系界面开发,后者使用 Compose 进行界面开发(固定使用 Kotlin)
—— 隔壁西二在线的 Android 开发入门

新建工程后,AS 就会提示 “Sync Gradle”。由于需要从境外下载资源,因此需要开🪜(但也还是慢啊啊啊)。同步完 Gradle 后就可以开始开发了。

Warning

Java 版本不要太高!AS 默认的是 Java 21,就用它自带的或者你自己安装的 Java 21,版本高了构建会报错。
如果 AS 警告说多个 Java,不需要理它。

整个 AS 主要分为三个视图:Project、Code 和 Design 视图(分别位于左、中、右)。

  • Project 视图用于显示项目文件和文件夹
  • Code 视图用于编辑代码
  • Design 视图用于预览应用外观

右上角可以切换 Code 和 Design 视图的可见性。

在 AS 中,我们有两种主要的文件组织方式:Android 和 Project Source Files。前者是 AS 中的标准文件组织方式,后者则是我们在操作系统中使用的组织方式。文件组织方式可以在 Project 视图的左上角进行切换。

好了,基本的工具使用已经介绍完了,接下来介绍一些开发知识。

对于使用 Java 语言开发的项目,我们在 MainActivity.java 中写程序逻辑,在 activity_main.xml 中写程序界面布局。

在 Android 应用中,MainActivity 类的 onCreate() 函数扮演着程序入口点的角色。


©2025-Present Watermelonabc | 萌 ICP 备 20251229 号

Powered by Hexo & Stellar 1.33.1 & Vercel & HUAWEI Cloud
您的访问数据将由 Vercel 和自托管的 Umami 进行隐私优先分析,以优化未来的访问体验

本博客总访问量:capoo-2

| 开往-友链接力 | 异次元之旅

中文独立博客列表 | 博客录 随机博客

AI 参与指数(IIIA)2 级

猫猫🐱 发表了 55 篇文章 · 总计 229.3k 字