当前位置: 首页 > news >正文

关于 APK 反编译与重构工具集

一、apktool — APK 解包 / 重打包

apktool 是一款开源的 Android APK 工具,用于:

  •  反编译 APK

  •  查看资源和布局文件

  •  生成 smali 文件(DEX 的反汇编)

  •  对 APK 进行修改后重新打包

它不能还原 Java 源码,只能将 DEX 转为 smali。

下载地址:https://github.com/iBotPeaches/Apktool/releases

查看版本和帮助命令:

apktool -version
apktool -h

1. apktool核心功能命令

功能命令说明
解包apktool d <apk>反编译 APK
打包apktool b <dir>将修改后的项目打包为 APK
加载资源框架apktool if <apk>安装系统 APK 作为 framework,用于编译
查看版本apktool -version显示当前 apktool 版本
查看帮助apktool -h显示帮助文档

2. APK 解包命令

apktool d <file.apk> -o <output_dir>

常用参数表:

参数说明
d / decode解包操作
-o <目录>指定输出路径
-f强制覆盖已有目录
-s保留原始资源文件(不解码 resources.arsc
--no-src不反编译 smali(跳过代码)
--no-res不解码资源(只提取代码)
--only-main-classes仅提取主 dex
--use-aapt2使用 AAPT2 解码资源(新版应用更兼容)

示例:

apktool d myapp.apk -o myapp_src -f

解包并输出到 myapp_src 目录,强制覆盖旧目录。

3. APK 重打包命令

apktool b <解包目录> -o <输出apk>

常用参数表:

参数说明
b / build打包操作
-o <apk>输出重打包后的 APK
-f强制覆盖已有的 APK
--use-aapt2使用新版 AAPT2 构建资源(推荐)

示例:

apktool b myapp_src -o myapp_rebuild.apk

4. 安装框架资源命令

某些系统应用或带有复杂样式的 APK 解包/打包时会出错,可通过安装依赖资源解决:

apktool if framework-res.apk

使用场景:解包或打包 系统 App、MIUI ROM、Flyme 等 报错 can't find resources 时使用。

5. 解包目录结构说明

APK 文件↓(apktool d xxx.apk)
反编译(结构还原)↓
res/                 ← 资源目录(布局、图片等)
AndroidManifest.xml  ← 解包为可读可编辑的 XML
smali/               ← DEX 字节码反汇编成 smali 汇编代码
original/            ← 原始签名等信息(如 META-INF)
apktool.yml          ← 构建所需元数据文件
myapp_src/
├── AndroidManifest.xml   # 核心配置文件
├── smali/                # smali 反编译代码
├── res/                  # XML 布局和资源文件
├── assets/               # 原始资源目录
├── original/             # 原始 META-INF、签名等
├── unknown/              # 无法解析的内容(如加固数据)

6. 常用实战流程

完整实战流程命令(带签名 + 对齐)

# 解包
apktool d myapp.apk -o myapp_src -f# 修改代码/res资源/smali逻辑...# 重打包
apktool b myapp_src -o unsigned.apk# 对齐(可选)
zipalign -v 4 unsigned.apk aligned.apk# 签名(推荐用 apksigner)
apksigner sign --ks my.keystore --ks-key-alias mykey --ks-pass pass:123456 aligned.apk

二、jadx — Java 源码反编译

jadx(Java Decompiler for Android) 是一款高质量的 DEX → Java 反编译工具,它支持将 APK 或 DEX 文件中的代码还原为可读性极强的 Java 源码

它支持两种模式:

  •  命令行模式(jadx / jadx-cli

  •  图形化界面(jadx-gui

适用于查看、分析 APK、smali 转 Java 的所有逆向分析工作流程。

下载地址:https://github.com/skylot/jadx/releases

反编译能力概览

能力支持情况
支持 APK / DEX / JAR支持
输出 Java 源码支持
输出 smali 文件支持(选项)
支持多 dex支持
支持资源导出(res/layout)支持
代码跳转、方法索引(GUI)支持
GUI 支持查找类/方法支持

1. 命令行版 :jadx

常用命令

jadx [options] <apk_or_dex_file>

最常用命令示例

jadx -d out myapp.apk

myapp.apk 中的 Java 源码解出并保存到 out/ 目录。

所有常用命令参数整理(CLI 版本)

参数作用
-d <目录>指定输出目录
--show-bad-code显示无法还原的代码块(标红)
--no-res不导出资源文件(如布局 XML)
--no-src不导出 Java 源码
--deobf开启名称混淆恢复(deobfuscation)
--deobf-min <int>混淆还原最小名称长度
--output-format<java|json> 输出为 Java 源码或结构化的json
--threads N多线程反编译速度更快
--log-level <LEVEL>设置日志等级(INFO/DEBUG/ERROR)
--export-gradle生成 gradle 项目结构(实验性)
--skip-res跳过资源(快捷方式)
--version显示 jadx 版本
--help查看帮助

用法参考:

jadx -d out/ --output-format java app.apk

示例命令合集

➤ 反编译 APK 到 Java + 资源

jadx -d out myapp.apk

➤ 仅导出 Java,不要资源文件

jadx -d out myapp.apk --no-res

➤ 启用混淆名称还原(deobf)

jadx -d out myapp.apk --deobf

➤ 提升反编译速度(多线程)

jadx -d out myapp.apk --threads 6

2. 图形界面版:jadx-gui

启动方式(Linux/macOS)

jadx-gui myapp.apk

GUI 功能:

功能说明
类名搜索可通过 Ctrl+K 搜索类、方法
跳转到定义支持点击跳转定义
显示源码 / smali支持双视图切换
导出项目可点击 File → Save All 导出源代码
项目结构查看类似 IDEA 结构树
中文支持好UI 简洁清晰

3. 输出目录结构说明

APK 文件(或 DEX 文件)↓(jadx -d xxx.apk)
反编译(逻辑还原)↓
sources/             ← 还原出的 Java 源码(近似原始)
AndroidManifest.xml  ← 可读 Manifest(但可能不完整)
resources/           ← 提取的资源文件(如图片等)
res/                 ← XML 布局资源
out/
├── sources/         # Java 源码(主目录)
├── resources/       # 资源文件(layout、drawable)
├── AndroidManifest.xml

4. 实战案例命令

目标:反编译 APK 并提取 Java 源码 + 修改 + 查看主 Activity

jadx -d out myapp.apk
cd out/sources
grep -r "extends Activity" .

快速定位入口 Activity 并开始分析逻辑。

5. 与其它工具搭配

工具用途
apktool查看 smali + XML 资源
jadx查看 Java 逻辑
dex2jar + JD-GUI对比查看 Java 反编译差异
smali查看/修改反汇编代码

dex2jar — DEX → JAR 转换

dex2jar 是一个开源工具,用于将 Android 中的 DEX(Dalvik Executable)格式 文件转换为标准的 JAR(Java Archive)格式 文件,以便用 JD-GUI 或 jadx 查看 Java 源码。

下载地址:https://github.com/pxb1988/dex2jar/releases

作用与场景

操作工具
APK → DEX自动完成(APK 中本身包含 classes.dex)
DEX → JARdex2jar
JAR → Java使用 JD-GUI、jadx、CFR 等查看 Java 代码

用途:逆向分析 APK 内部逻辑代码,适合加固前/脱壳后的 APK。

1. 常用命令

常用命令参数大全

参数含义
-f强制覆盖已存在的 JAR 文件
-o <file>指定输出文件名
--debug-info保留调试信息(行号/局部变量)
--force-f,强制输出
--multi-dex支持多 dex 文件转换
--exception-file <file>输出错误日志
--no-reuse-reg不复用寄存器,调试用
--version显示版本信息
--help查看帮助信息

示例命令

windows 用  d2j-dex2jar.bat       Linux 用  d2j-dex2jar.sh

➤ 转换 APK 中默认 classes.dex

d2j-dex2jar.bat myapp.apk

输出为:myapp-dex2jar.jar

➤ 指定输出 jar 文件名

d2j-dex2jar.bat -o output.jar myapp.apk

➤ 支持多 dex 文件(classes2.dex、classes3.dex 等)

d2j-dex2jar.bat --multi-dex myapp.apk

➤ 保留调试信息(可调试的源码行号)

d2j-dex2jar.bat --debug-info myapp.apk

➤ 转换多个 dex 文件(可用于脱壳后提取)

d2j-dex2jar.bat -f classes.dex
d2j-dex2jar.bat -f classes2.dex

2. 输出文件说明

原始文件生成结果
myapp.apkmyapp-dex2jar.jar
classes.dexclasses-dex2jar.jar

生成的 .jar 文件可以直接用下面工具查看源码:

  •  JD-GUI

  •  jadx-gui

  •  CFR 反编译器

dex2jar 反编译流程:

APK 文件↓(解压出 classes.dex)
提取 DEX 字节码↓(dex2jar classes.dex)
转换格式↓
classes-dex2jar.jar  ← DEX 转换为标准 Java 字节码(JAR 文件)↓(jd-gui 打开)
反编译成 Java 源码(近似)↓
Java 源码浏览(仅查看、不可编辑 JAR 内)

3. 实战流程命令串

# 解包 APK
apktool d myapp.apk -o myapp_src# 转换 dex 为 jar
d2j-dex2jar.sh myapp.apk# 查看 Java 代码(GUI 工具打开 JAR)
jd-gui myapp-dex2jar.jar

4. 与其它工具联动

工具用法
apktool解包资源、提取 smali
dex2jar还原 Java JAR 文件
jd-gui查看 Java 代码(图形界面)
jadx替代 dex2jar + jd-gui 的整合方案
frida动态调试结合静态分析更准确

、smali / baksmali — DEX 与 smali 的互转工具

smali:将 .smali 汇编代码编译成 .dex 文件(汇编器)

baksmali:将 .dex 文件反编译成 .smali 文件(反汇编器)

smali 是 Android DEX 字节码的可读文本格式表示,结构清晰,非常适合逆向修改、插桩分析。

下载地址:https://bitbucket.org/JesusFreke/smali/downloads/

运行方式(基于 Java)

java -jar baksmali.jar disassemble classes.dex -o smali/
java -jar smali.jar assemble smali/ -o classes.dex

常见用途

工具用途
baksmaliDEX → smali(反汇编)
smalismali → DEX(汇编)
应用场景插桩调试、添加日志、修改类行为、绕过检测等

1. 常用命令

1)反汇编 DEX 到 smali(baksmali)

baksmali disassemble <input.dex> -o <output_dir>

常用参数

参数说明
-o指定输出目录
--api <LEVEL>指定 Android API 版本
--no-debug-info不生成调试信息
--sequential-labels使用顺序标签名(可读性好)

示例:

baksmali disassemble classes.dex -o smali_out/

2)将 smali 汇编为 dex(smali)

smali assemble <smali_dir> -o <output.dex>

常用参数

参数说明
-o输出 dex 文件路径
--api <LEVEL>指定 API 版本
--debug包含调试信息
--register-info添加寄存器调试信息(用于调试)

示例:

smali assemble smali_out/ -o new_classes.dex

3)实战推荐

➤ DEX → smali(反汇编)

baksmali disassemble classes.dex -o smali/

➤ 修改后 smali → DEX(汇编)

smali assemble smali/ -o new_classes.dex

2. 文件结构说明

基本文件结构示例(反编译结果)

com/example/app/MainActivity.smali

.smali 文件中包含类声明、方法、寄存器、指令等信息,可手工修改后重新打包。

反汇编(baksmali)流程:

classes.dex↓(baksmali disassemble classes.dex)
反汇编↓
smali/               ← DEX 转换成 smali 汇编代码(可读、可编辑)

汇编(smali)流程:

smali/ 目录↓(smali assemble smali/)
重新汇编↓
classes.dex         ← 生成新的 DEX 文件,可用于重新打包 APK

baksmali 的输出结构:

classes.dex↓(baksmali disassemble)
反汇编成 smali 汇编代码↓
smali/
├── com/
│   └── example/
│       └── app/
│           └── MainActivity.smali
...

smali 的汇编回 dex 流程:

smali/↓(smali assemble)
汇编为 DEX 字节码↓
classes.dex

3. 实战使用技巧

插桩调试示例

# 原方法
.method public myFunc()V.registers 2invoke-static {}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)Ireturn-void
.end method

可以手动插入日志打印代码或跳过检测逻辑。

4. 与其他工具联动

推荐流程

# 解包 APK
apktool d myapp.apk -o myapp_src# 进入 smali 目录修改代码
cd myapp_src/smali/com/example/...# 修改完成后重新打包
apktool b myapp_src -o new.apk# 签名 APK
apksigner sign --ks my.keystore new.apk

zipalign — APK 对齐优化工具

zipalign 是 Android SDK 提供的 APK 对齐优化工具,用于在 APK 打包完成后进行 字节对齐处理

对齐的好处:

  •  提升运行时性能(更快的资源加载速度)

  •  是 Google Play 上架前必须执行的优化步骤

  •  避免内存浪费(系统按对齐方式高效读取资源)

一句话:“zipalign 是让 APK 资源按 4 字节对齐,使系统运行更快、更省内存”

下载地址:Android SDK 自带的签名工具。已经安装过 Android Studio 或下载了 SDK Build Tools,可以在如下地址找到:

C:\Users\Admin\AppData\Local\Android\Sdk\build-tools\30.0.3\zipalign.exe

可以将其加入环境变量,方便全局使用。

zipalign 的工作原理

  • APK 是一个 zip 文件,里面的资源文件如果没有对齐,在加载时 Android 系统需要额外内存拷贝。

  • zipalign 将所有资源按 4 字节边界(默认) 对齐,避免这种开销。

使用场景

  •  在签名前对齐(老流程)

  •  在签名后对齐(推荐做法)

  •  发布前最后一步,打包+签名+zipalign 是标准流程

1. 常用命令

常用命令格式

zipalign [options] <alignment> <input.apk> <output.apk>

1)最常见的对齐命令(标准流程)

zipalign -v 4 input-unsigned.apk output-aligned.apk
  • -v:显示详细日志

  • 4:默认 4 字节对齐(Google 推荐)

2)对已签名 APK 进行对齐(推荐做法)

zipalign -v -p 4 signed.apk aligned.apk
  • -p:跳过重复压缩的文件(提高速度)

注意:zipalign 不会破坏 APK 签名(对已签名包使用是安全的)

3)验证 APK 是否已对齐

zipalign -c -v 4 your.apk

输出内容如:

Verification successful

说明该 APK 已完成对齐。

参数汇总

参数说明
-v显示详细信息
-p跳过已压缩的文件
-c验证 APK 是否已对齐
<alignment>对齐边界,推荐为 4(即 4 字节)

2. 常见使用流程

打包 → 签名 → 对齐

# 解包 + 修改 APK 后(例如用 apktool)
apktool b myapp -o unsigned.apk# 签名
apksigner sign --ks my.keystore --out signed.apk unsigned.apk# zipalign(对齐优化)
zipalign -v -p 4 signed.apk final.apk# 验证对齐是否成功
zipalign -c -v 4 final.apk

3. 流程结构图

zipalign 对齐优化流程(用于最终打包优化):

已打包的 APK 文件(未对齐)↓(zipalign -v -p 4 unsigned.apk aligned.apk)
对齐优化(必须对齐才能上架或正确签名)↓
aligned.apk         ← 成功对齐的 APK 文件,结构优化,准备签名

整体结构图参考(zipalign 环节):

APK 文件(重打包后)↓(zipalign)
优化对齐结构↓
aligned.apk(待签名)

通常完整打包流程如下:

apktool b out_dir/ -o unsigned.apk↓
zipalign -v -p 4 unsigned.apk aligned.apk↓
apksigner sign --ks your.keystore aligned.apk↓
final.apk ← 可安装、可上线的正式签名 APK

apksigner — APK 签名工具

apksigner 是 Android SDK 提供的 官方签名工具,用于给 APK 添加/验证 v1/v2/v3 数字签名,保障 APK 在 Android 系统中的合法性。

  •  签名后的 APK 才能安装到 Android 系统

  •  支持 Google Play 要求的 v1(JAR)+ v2(APK Signature Scheme)+ v3 签名

  •  Android 7.0+ 要求 v2/v3 签名,v1 签名仅用于兼容老系统

下载地址:Android SDK 自带的签名工具。已经安装过 Android Studio 或下载了 SDK Build Tools,可以在如下地址找到:

C:\Users\你的用户名\AppData\Local\Android\Sdk\build-tools\版本号\apksigner.bat

使用场景

  •  对 apktool 打包出来的 APK 进行签名

  • 发布前对齐 + 签名

  •  验证已签名 APK 的完整性

  •  渗透测试过程中伪造签名测试、绕检测

1. 准备工作

签名前需要一个 Java Keystore(.jks.keystore 文件,使用以下命令生成:

keytool -genkeypair -v -keystore my.keystore -alias mykey -keyalg RSA -keysize 2048 -validity 10000

然后在输入两次最低六位数的密钥口令,下面的信息直接 Enter ,最后 y 即可!如下图:

keytool 、 jarsigner 工具是JAVA JDK自带的,配置好JAVA环境即可!

2. 常用签名命令

1)签名 APK(最常用命令)

apksigner sign --ks my.keystore --ks-key-alias mykey input.apk

可选参数:

参数说明
--kskeystore 文件路径
--ks-key-alias使用的 alias 名称
--ks-pass pass:<密码>keystore 密码
--key-pass pass:<密码>密钥密码
--out指定签名后输出的 APK

示例(完整自动化):

apksigner sign --ks my.keystore --ks-key-alias mykey --ks-pass pass:123456 --key-pass pass:123456 --out signed.apk unsigned.apk

2)验证 APK 签名

apksigner verify signed.apk

查看签名版本和状态(适用于逆向检测):

apksigner verify --verbose --print-certs signed.apk

输出内容示例:

Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): false

3)只签 v1 / v2 / v3 签名(可选控制)

apksigner sign --ks my.keystore --ks-key-alias mykey --v1-signing-enabled true --v2-signing-enabled true --v3-signing-enabled false input.apk

3. 签名完整流程

# APK 解包 + 修改后
apktool b app -o unsigned.apk# 签名
apksigner sign --ks my.keystore --ks-key-alias mykey unsigned.apk --out signed.apk# 对齐优化
zipalign -v -p 4 signed.apk final.apk# 验证签名
apksigner verify --verbose --print-certs final.apk

4. 参数总览表

参数说明
--kskeystore 文件路径
--ks-key-aliasalias 名
--ks-pass pass:123456keystore 密码
--key-pass pass:123456密钥密码
--out输出的已签名 APK
--v1-signing-enabled是否启用 v1 签名
--v2-signing-enabled是否启用 v2 签名
--v3-signing-enabled是否启用 v3 签名
--min-sdk-version最低兼容 API
--verbose显示详细信息
--print-certs输出签名证书摘要

5. 签名调试与自动化建议

可以写一个一键签名 + 对齐脚本(shell 或 Python),例如:

#!/bin/bash
apk=$1
zipalign -v -p 4 $apk aligned.apk
apksigner sign --ks my.keystore --ks-key-alias mykey aligned.apk

6. 签名流程图

aligned.apk↓(apksigner sign --ks keystore.jks aligned.apk)
APK 签名(添加 META-INF 目录中的签名文件)↓
signed.apk(可安装、可上线)

apksigner 使用流程总结图

apktool b myApp/ -o unsigned.apk↓
zipalign -v -p 4 unsigned.apk aligned.apk↓
apksigner sign --ks keystore.jks aligned.apk↓
signed.apk(可安装、可发布的 APK)

最终输出结构(signed.apk 内部):

signed.apk
├── classes.dex
├── AndroidManifest.xml
├── res/
├── resources.arsc
└── META-INF/        ← 由 apksigner 添加的签名信息├── CERT.RSA├── CERT.SF└── MANIFEST.MF

七、uber-apk-signer — 一键签名 APK 的工具包

uber-apk-signer 是一个 开源的多功能一键签名工具,封装了:

  • zipalign

  • apksigner

  • 签名算法支持(v1/v2)

  • 自动识别未签名 APK 并签名

  • 支持批量签名多个 APK

适用于不想每次都敲复杂参数的用户,适合自动化脚本、CI/CD 或渗透测试打包。

特点:跨平台(Java 编写)、开箱即用、无需自己写 zipalign + sign 脚本

下载地址:https://github.com/patrickfav/uber-apk-signer/releases

下载得到一个 JAR 包,如:uber-apk-signer-x.x.x.jar

1. 基本用法

签名单个 APK(最常见)

java -jar uber-apk-signer.jar --apk your.apk

批量签名目录下所有 APK

java -jar uber-apk-signer.jar --apks /path/to/your/apks/

会自动生成输出文件夹:

  • output/signed: 已签名 APK

  • output/unsigned: 无法签名或跳过的 APK

  • output/aligned: zipalign 后的 APK

2. 常用参数说明

java -jar uber-apk-signer.jar [options]
参数说明
--apk指定单个 APK
--apks指定目录批量签名所有 APK
--ks指定 keystore(可选)
--ksAlias指定 alias 名(默认:key0
--ksPasskeystore 密码
--ksKeyPassalias 密码
--v1启用 v1 签名(默认启用)
--v2启用 v2 签名(默认启用)
--sign启用签名(默认启用)
--zipAlign启用 zipalign 对齐(默认启用)
--overwrite允许覆盖原 APK(默认 false)
--output设置输出目录(默认 output/

示例 1:快速签名 + 对齐 APK

java -jar uber-apk-signer.jar --apk my.apk

自动输出到:output/signed/my-aligned-signed.apk

示例 2:指定 keystore 手动签名

java -jar uber-apk-signer.jar --apk my.apk --ks my.keystore --ksAlias mykey --ksPass 123456 --ksKeyPass 123456

示例 3:批量签名 APK 文件夹

java -jar uber-apk-signer.jar --apks ./build/apks/

3. 输出目录结构

签名后会自动生成以下目录:

output/
├── signed/           # 成功签名且 zipalign 的 APK
├── unsigned/         # 无法签名的 APK
├── aligned/          # zipalign 后的 APK(可选)
├── reports/          # 每个 APK 的签名日志报告(包含 v1/v2 检查)

uber-apk-signer 自动签名+对齐流程:

unsigned.apk↓(java -jar uber-apk-signer.jar -a unsigned.apk)
自动签名 + zipalign + v1/v2签名校验↓
output/
├── aligned-debugSigned.apk      ← 成功签名对齐后的 APK(可安装)
├── aligned-debugSigned-aligned.apk
├── aligned-debugSigned.apk.idsig
├── log.txt                      ← 操作日志

作用说明:

功能说明
自动对齐(zipalign)内部已集成 zipalign,无需单独执行
自动签名(apksigner)使用默认 debug 签名或自定义 keystore
支持签名校验自动验证 V1/V2 签名完整性
操作简单只需要一个命令即可完成全部流程

使用流程结构图总结:

unsigned.apk↓(uber-apk-signer)
自动完成以下步骤:- 对齐(zipalign)- 签名(默认 debug / 自定义 keystore)- 校验签名完整性↓
output/aligned-debugSigned.apk(最终可安装)

4. 常见使用流程

# 解包 + 修改 APK
apktool b app/ -o unsigned.apk# 使用 uber-apk-signer 签名 + 对齐
java -jar uber-apk-signer.jar --apk unsigned.apk

八、JD-GUI — Java 字节码查看工具

JD-GUI(Java Decompiler GUI) 是一款跨平台的 Java 字节码反编译查看器,能把 .class 文件反编译为接近原始的 Java 源码。

  •  主要用于查看 JAR 文件中反编译的 Java 源码

  •  和 dex2jar 配合使用,可反编译 APK 中的 DEX → JAR → Java 源码

  •  属于 图形化工具,没有常规命令行参数

下载地址:https://github.com/java-decompiler/jd-gui/releases

功能特点

功能描述
支持 JAR 反编译查看 Java 代码结构
导出源码 ZIP可将 .java 文件导出压缩包
GUI 图形界面无需命令行操作
多平台支持Windows / macOS / Linux
无需依赖单一 .jar 文件即可运行

启动方式

JD-GUI 本身没有 CLI 命令,通过 Java 启动:

java -jar jd-gui.jar

然后通过界面操作打开 JAR 文件。

导出源码(在 GUI 内)

JD-GUI 顶部菜单栏 → File → Save All Sources→ 导出为 ZIP 包,里面是完整的 .java 源码。

1. 典型工作流程

APK --> DEX --> JAR --> JD-GUI 查看源码↑      ↑apktool   dex2jar

2. 配套使用流程

第 1 步:使用 dex2jarclasses.dex 转为 JAR

d2j-dex2jar.sh classes.dex -o classes.jar

或者:

d2j-dex2jar.bat classes.dex

第 2 步:用 JD-GUI 打开 classes.jar

# 打开 JD-GUI 图形界面
./jd-gui

在图形界面中打开 classes.jar,即可查看 Java 源码。支持:

  • 导出所有源码为 ZIP(带 .java 文件)

  • 查找类、包、函数

  • 直接浏览 Java 类结构

3. 搭配使用工具

步骤工具作用
1apktool解包 APK 提取 classes.dex
2dex2jarclasses.dex 转成 .jar
3JD-GUI查看 .jar 文件源码结构
4jadx-gui(可选)替代 JD-GUI,直接支持 DEX 查看源码

4. 结构流程图

JD-GUI 查看 Java 源码的流程图:

APK 文件↓(dex2jar classes.dex → classes-dex2jar.jar)
转换为 Jar 文件↓(JD-GUI 打开 classes-dex2jar.jar)
反编译成 Java 源码(只读,不可编辑)

JD-GUI 使用结构图总结(完整流程):

APK 文件↓(解包提取 classes.dex)
classes.dex↓(dex2jar classes.dex)
classes-dex2jar.jar↓(JD-GUI 打开)
Java 源码(反编译查看,可另存为 .java)

可视化输出示例:

classes-dex2jar.jar
├── com/
│   └── example/
│       └── app/
│           └── MainActivity.class
(JD-GUI 中自动显示为 Java 源码)

5. 关于 .class文件

  • .classJava 编译器(javac) 生成的字节码文件,运行于 JVM(Java 虚拟机)

  • .dexAndroid 编译器(dx/d8) 将多个 .class 转换后生成的,运行于 Android 虚拟机(Dalvik/ART)

对比表格

对比项.class 文件.dex 文件
来源javac Hello.javadx --dex classes/
平台Java 平台(JVM)Android 平台(ART/Dalvik)
结构每个类一个 .class所有类打包成一个或多个 .dex
是否可反编译是(如用 JD-GUI)是(用 jadx、dex2jar)
用途Java 程序执行Android 应用执行
转换关系.java → .class.class → .dex

转换流程

Java源码↓ javac
.class(JVM字节码)↓ dx/d8 编译器
.dex(Android字节码)↓ 打包进 APK
APK(最终安装包)

如何从 APK 中提取 .class

需要先反编译:

  1. 提取 classes.dex(用 apktool 或直接解压)

  2. 转换为 JAR(用 dex2jarenjarify

  3. JD-GUI 查看 .class 内容或导出 .java

6. 关于 .jar文件

.class 是单个 Java 字节码文件,而 .jar 是一组 .class + 资源文件打包成的归档文件(Java Archive)。

文件类型是什么?举例
.class编译后的单个 Java 字节码文件Hello.class
.jar包含多个 .class 和资源的压缩包myapp.jar

示例说明

假设有这个 Java 代码:

// Hello.java
public class Hello {public static void main(String[] args) {System.out.println("Hello, world!");}
}

编译生成 .class

javac Hello.java
# 生成 Hello.class

打包成 .jar

jar cf hello.jar Hello.class
# 生成 hello.jar(里面含有 Hello.class)

可以直接解压 .jar 查看:

unzip hello.jar
# 会看到 Hello.class

.jar 内部结构

.jar 文件本质上是一个 ZIP 文件,里面内容可能包括:

  • .class 文件(编译后的 Java 类)

  • META-INF/MANIFEST.MF(清单)

  • 图片、配置文件、XML 等资源

常见用途

目的工具 / 命令
解压 .jar 查看 .classunzip xxx.jar
查看 .class 内容JD-GUIjadx
.dex 生成 .jardex2jarenjarify
.java 编译为 .classjavac
.class 打包为 .jarjar 命令

APK 反编译完整流程图

          +-----------------------------+|          APK 文件           |+-----------------------------+|+---------------+----------------+|                                |
apktool                           dex2jar
(资源+smali)                       (dex → jar)|                                |+--v--+                         +---v---+|smali|                         | .jar  ||代码 |                         | 文件  |+--+--+                         +---+---+|                                ||                           JD-GUI 查看源码v
baksmali(反汇编)
smali(汇编)

工具作用解释 

工具名作用说明
apktool解包 APK,提取资源文件 + 把 classes.dex 变成 smali 汇编格式(可修改)
smaliAndroid 的字节码汇编语言(类似汇编)
baksmali.dex 文件反编译成 .smali 代码(可读、可修改)
dex2jar.dex 转换为 .jar,以供 JD-GUI 查看 Java 源码
JD-GUI图形化工具,浏览 .jar 文件中反编译出来的 Java 源码

如果只想查看源码:

APK → DEX(自动提取) → JAR(用 dex2jar) → JD-GUI 查看源码

适合目标:快速阅读 Java 逻辑、分析加密函数、爬虫逆向等。

jadx-gui 可以直接从 APK → Java 源码,无需中间转 .jar,适合快速预览。

如果想修改代码再重新打包 APK:

APK → apktool 解包 → smali 修改代码 → apktool 打包 APK → 签名(apksigner)→ 安装

适合目标:功能修改、广告去除、HOOK 插桩、绕过检测等。

相关文章:

关于 APK 反编译与重构工具集

一、apktool — APK 解包 / 重打包 apktool 是一款开源的 Android APK 工具&#xff0c;用于&#xff1a; 反编译 APK 查看资源和布局文件 生成 smali 文件&#xff08;DEX 的反汇编&#xff09; 对 APK 进行修改后重新打包 它不能还原 Java 源码&#xff0c;只能将 D…...

【课堂笔记】核方法和Mercer定理

文章目录 Kernal引入定义Mercer定理描述有限情形证明一般情形证明 Kernal 引入 在实际数据中常常遇到不可线性分割的情况&#xff0c;此时通常需要将其映射到高维空间中&#xff0c;使其变得线性可分。例如二维数据&#xff1a; 通过映射 ϕ ( x 1 , x 2 ) ( x 1 2 , 2 x 1…...

Cribl 中 Parser 扮演着重要的角色 + 例子

先看文档: Parser | Cribl Docs Parser The Parser Function can be used to extract fields out of events or reserialize (rewrite) events with a subset of fields. Reserialization will preserve the format of the events. For example, if an event contains comma…...

MVDR源码(可直接运行)

该代码可正常运行&#xff0c;信号使用的是模拟信号&#xff0c;可改为指定信号。 本代码使用了一个基于MVDR&#xff08;最小方差无失真响应&#xff09;算法的麦克风阵列声源定位方法。代码首先设置了麦克风阵列的参数&#xff0c;包括阵元数量、采样率、信号频率等&#xff…...

MyBatis实战指南(一)MyBatis入门基础与利用IDEA从零开始搭建你的第一个MyBatis系统

MyBatis实战指南&#xff08;一&#xff09;MyBatis入门基础与利用IDEA从零开始搭建你的第一个MyBatis系统 一、什么是MyBatis1. MyBatis 是什么&#xff1f;2. JDBC 的三大痛点3. MyBatis 的核心优势1. 告别重复代码&#xff0c;专注核心逻辑2. 灵活控制 SQL&#xff0c;适应各…...

React Flow 数据持久化:Django 后端存储与加载的最佳实践(含详细代码解析)

在构建 React Flow 应用时&#xff0c;前端呈现的节点与连线构成的可视化流程只是冰山一角&#xff0c;其背后的数据持久化与灵活调取才是确保应用稳定运行、支持用户数据回溯与协作的关键。因此&#xff0c;后端存储与加载 React Flow 信息的环节&#xff0c;就如同整个应用的…...

第32节:基于ImageNet预训练模型的迁移学习与微调

1. 引言 在深度学习领域,迁移学习(Transfer Learning)已经成为解决计算机视觉任务的重要方法,特别是在数据量有限的情况下。其中,基于ImageNet数据集预训练的模型因其强大的特征提取能力而被广泛应用于各种视觉任务。本文将详细介绍迁移学习的概念、ImageNet预训练模型的特…...

接口自动化可视化展示

目的将接口返回的实际对比返回 前端&#xff1a;使用Geeker-Admin二次开发使用 后端 flaskpythonrequests 实际实现展示 接口测试通过 接口测试不通过 接口数据的增删改查...

Hbuilder X4.65新建vue3项目存在的问题以及解决办法

有关Vue的多篇文章&#xff1a; 1.使用Vue创建前后端分离项目的过程&#xff1a;使用Vue创建前后端分离项目的过程&#xff08;前端部分&#xff09;_vue前端项目打包的dish-CSDN博客 2.vue3实现自定义导航菜单&#xff1a;vue3实现自定义导航菜单_vue3 导航栏-CSDN博客 3…...

SpringBoot 项目实现操作日志的记录(使用 AOP 注解模式)

本文是博主在做关于如何记录用户操作日志时做的记录&#xff0c;常见的项目中难免存在一些需要记录重要日志的部分&#xff0c;例如权限和角色设定&#xff0c;重要数据的操作等部分。 博主使用 Spring 中的 AOP 功能&#xff0c;结合注解的方式&#xff0c;对用户操作过的一些…...

C/C++ 整数类型的长度

参考 cppreference.cn 在某些语言中&#xff0c;整数类型的长度是固定的&#xff0c;如java中 char 8short 16int 32long 64 可是C/C 与机器相关&#xff0c;整数类型长度与平台有关 先可以记一个简单的 按照C标准&#xff1a; char > 8short > 16int > 16long &g…...

解决npm install报错:getaddrinfo ENOTFOUND registry.nlark.com

问题背景 在使用 npm install 安装依赖时&#xff0c;突然遇到以下错误&#xff1a; npm ERR! network request to https://registry.nlark.com/fsevents/download/fsevents-2.3.2.tgz failed, reason: getaddrinfo ENOTFOUND registry.nlark.com这表明 npm 在尝试从 registr…...

PostgreSQL简介安装

目录 一. PostgreSQL 1. 简介 2. 特点 3. 优势 4. 架构 5. 应用场景 二. 安装PostgerSQL 1. 编译安装 (1) 安装编译安装所需环境 (2) 编译安装 (3) 配置环境变量 (4) 登录数据库 2. DNF安装 (1) 安装postgreSQL (2) 初始化数据库 (3) 登录数据库 三. postgreSQ…...

vue3+elementPlus穿梭框拖拽

安装 npm install sortablejs --save <template><div class"transfer" ref"transfer"><div><el-transfer v-model"inputForm" :data"data" :titles"titles"><template #default"{ option }…...

牛客周赛 Round 93题解(个人向A-E)

牛客周赛 Round 93题解&#xff08;个人向A-E&#xff09; 题目链接&#xff1a;https://ac.nowcoder.com/acm/contest/109904 a题 签到题&#xff0c;直接按题意模拟即可 #include <bits/stdc.h> using namespace std; #define ll long long int main() {ios::sync_…...

MySQL高可用之ProxySQL + MGR 实现读写分离实战

部署MGR 1、MGR 前置介绍 阿里云RDS集群方案用的就是MGR模式&#xff01; 1.1、什么是 MGR MGR&#xff08;MySQL Group Replication&#xff09;是MySQL 5.7.17版本诞生的&#xff0c;是MySQL自带的一个插件&#xff0c;可以灵活部署。保证数据一致性又可以自动切换&#x…...

React TS中如何化简DOM事件的定义

概要 我们在做TS开发时候&#xff0c;总要面对各种类型的定义。React使用自己的Sythetic Event机制管理DOM事件&#xff0c;不同于原生的DOM事件定义&#xff0c;所以在TS中&#xff0c;事件的类型定义更加繁琐。 本文提供一中简化定义的方法&#xff0c;在使用中&#xff0c…...

BigemapPro蒙版使用技巧:精准导出地图范围

在地图制图过程中&#xff0c;我们常常会遇到需要按照特定边界裁剪地图&#xff0c;或者对指定范围以外的地图进行模糊处理等情况&#xff0c;这时"添加蒙版"功能就非常实用。 BigemapPro的蒙版功能&#xff0c;可满足用户按自定义形状裁剪地图、控制区域外显示效果&…...

CesiumEarth v1.15 更新

更新&#xff1a;​ CesiumEarth 更新至1.15.0版本&#xff0c;包含浏览器在线版、Desktop Windows版本、Desktop 安卓版本 界面优化&#xff1a;​ 项目列表已适配手机屏幕 功能​ 扩展模块更新 1、在底部工具栏区域&#xff0c;所有已生效&#xff08;已勾选&#xff0…...

SOC-ESP32S3部分:2-2-VSCode进行编译烧录

飞书文档https://x509p6c8to.feishu.cn/wiki/CTzVw8p4LiaetykurbTciA42nBf?fromScenespaceOverview 无论是使用Window搭建IDF开发环境&#xff0c;还是使用Linux Ubuntu搭建IDF开发环境&#xff0c;我们都建议使用VSCode进行代码编写和编译&#xff0c;VSCode界面友好&#x…...

机器学习 day05

文章目录 前言一、模型选择与调优1.交叉验证2.超参数搜索 前言 通过今天的学习&#xff0c;我掌握了机器学习中模型的选择与调优&#xff0c;包括交叉验证&#xff0c;超参数搜索的概念与基本用法。 一、模型选择与调优 模型的选择与调优有许多方法&#xff0c;这里主要介绍较…...

关于element-ui的table type=“expand“ 嵌套表格展开异常问题解决方案

也许是很久没用这个库了 今天找这个问题还花了一会儿时间 也是蛮简单的一个问题 排查过程就不说了 直接说结果吧 记录一下 发现问题 展开第一列的时候表格没问题 收起的时候 莫名其妙多了一个展开的按钮 代码咋一看没什么问题 百思不解不得其解 甚至怀疑row-key的问题 检查了数…...

Pichome 开源网盘程序index.php 文件读取漏洞(CVE-2025-1743)

免责声明 本文档所述漏洞详情及复现方法仅限用于合法授权的安全研究和学术教育用途。任何个人或组织不得利用本文内容从事未经许可的渗透测试、网络攻击或其他违法行为。使用者应确保其行为符合相关法律法规,并取得目标系统的明确授权。 对于因不当使用本文信息而造成的任何直…...

[SpringBoot]Spring MVC(6.0)----图书管理系统(初)

图书管理系统 需求: 1. 登录: 用户输入账号,密码完成登录功能. 2. 列表展示: 展示图书. 准备工作 将前端代码复制到 static 目录下. 约定前后端交互接口 两个功能: 用户登录 和 图书列表展示. 需求分析: 1. 用户登录 url : /user/login param : userName 和 password return …...

C语言:基础篇之常见概念

文章目录 1.C语言是什么&#xff1f;2.C语言的历史和辉煌3.编译器的选择VS20223.1 编译和链接3.2 编译器的对比3.3 VS2022 的优缺点 4.VS项目和源文件、头文件介绍5.第一个C语言程序6.main函数7.printf和库函数8.关键字介绍9.字符和ASCII编码10.字符串和\011.转义字符12.语句和…...

Ansible模块——管理100台Linux的最佳实践

使用 Ansible 管理 100 台 Linux 服务器时&#xff0c;推荐遵循以下 最佳实践&#xff0c;以提升可维护性、可扩展性和安全性。以下内容结合实战经验进行总结&#xff0c;适用于中大型环境&#xff08;如 100 台服务器&#xff09;&#xff1a; 一、基础架构设计 1. 分组与分层…...

算法与数据结构:质数、互质判定和裴蜀定理

文章目录 质数质数判定质数筛选质因数分解互质判定裴蜀定理 质数 首先回顾「质数」的定义&#xff1a;若一个正整数无法被除了 1 ​和它自身之外的任何自然数整除&#xff0c;则称该数为质数&#xff08;或素数&#xff09;&#xff0c;否则称该正整数为合数。 根据上述定义&…...

基于C#的Modbus通信协议全面解析与实现指南

目录 1. Modbus协议概述 1.1 Modbus网络结构 1.2 Modbus功能码 2. Modbus RTU模式实现 2.1 RTU模式特点 2.2 CRC-16校验算法 2.3 使用NModbus4库实现RTU通信 3. Modbus TCP/IP模式实现 3.1 TCP模式特点 3.2 MBAP报文头结构 3.3 使用NModbus实现TCP通信 3.4 原生TCP套…...

IVX:重构 AI 原生开发范式,让模型调用成为指尖艺术​

一、AI 原生开发的技术跃迁&#xff1a;从黑箱集成到白盒重构 在传统 AI 开发范式中&#xff0c;将 GPT-4o、Mediapipe 等模型集成到业务系统往往需要经历 "模型训练 - API 对接 - 前端适配" 的复杂流程。开发团队需同时掌握机器学习框架&#xff08;如 TensorFlow&…...

源码分析之Leaflet中TileLayer

概述 TileLayer 是 Layer 的子类&#xff0c;继承自GridLayer基类&#xff0c;用于加载和显示瓦片地图。它提供了加载和显示瓦片地图的功能&#xff0c;支持自定义瓦片的 URL 格式和参数。 源码分析 源码实现 TileLayer的源码实现如下&#xff1a; export var TileLayer …...

Java虚拟机 - 程序计数器和虚拟机栈

运行时数据结构 Java运行时数据区程序计数器为什么需要程序计数器执行流程虚拟机栈虚拟机栈作用虚拟机栈核心结构运行机制 Java运行时数据区 首先介绍Java运行时数据之前&#xff0c;我们要了解&#xff0c;对于计算机来说&#xff0c;内存是非常重要的资源&#xff0c;因为内…...

大语言模型 15 - Manus 超强智能体 开源版本 OpenManus 案例与原理深入解析

写在前面 Manus 是由中国初创公司 Monica.im 于 2025 年 3 月推出的全球首款通用型 AI 智能体&#xff08;AI Agent&#xff09;&#xff0c;旨在实现“知行合一”&#xff0c;即不仅具备强大的语言理解和推理能力&#xff0c;还能自主执行复杂任务&#xff0c;直接交付完整成…...

开源CMS系统中哪些常见的安全漏洞最需要注意?

在当今数字化时代&#xff0c;开源内容管理系统&#xff08;CMS&#xff09;因其灵活性和低成本广受欢迎。然而&#xff0c;开源CMS的安全漏洞也频频成为黑客攻击的突破口。本文将带大家全面了解下开源CMS中需要警惕的安全漏洞以及防护建议&#xff0c;以帮助开发者和管理员更好…...

文件包含靶场实现

文件包含漏洞&#xff08;File Inclusion Vulnerability&#xff09;是 Web 安全中常见的高危漏洞&#xff0c;主要分为 本地文件包含&#xff08;LFI&#xff09; 和 远程文件包含&#xff08;RFI&#xff09; 1、典型利用方式 利用方式示例 Payload说明路径遍历?page../../…...

在 JavaScript 中正确使用 Elasticsearch,第二部分

作者&#xff1a;来自 Elastic Jeffrey Rengifo 回顾生产环境中的最佳实践&#xff0c;并讲解如何在无服务器环境中运行 Elasticsearch Node.js 客户端。 想获得 Elastic 认证&#xff1f;查看下一期 Elasticsearch Engineer 培训的时间&#xff01; Elasticsearch 拥有大量新…...

DataLight(V1.7.12)版本更新发布

DataLight&#xff08;V1.7.12&#xff09;版本更新发布 亲爱的 DataLight 用户们&#xff0c; DataLight 发布 V1.7.12 版本&#xff0c;此版本带来了新服务 DINKY 的支持&#xff0c;以及多项问题修复&#xff0c;进一步提升了平台的易用性和稳定性。 一. 更新日志 在此次…...

LeetCode-前缀和-和为K的子数组

LeetCode-前缀和-和为K的子数组 ✏️ 关于专栏&#xff1a;专栏用于记录 prepare for the coding test。 文章目录 LeetCode-前缀和-和为K的子数组&#x1f4dd; 和为K的子数组&#x1f3af;题目描述&#x1f50d; 输入输出示例&#x1f9e9;题目提示&#x1f9ea;前缀和❓什么…...

MySQL基础关键_014_MySQL 练习题

目 录 一、有以下表&#xff0c;请用一条 SQL 语句查询出每门课程都大于 80 分的学生 二、综合题1&#xff08;数据自行模拟&#xff09; 1.查询身份证号为“440401430103082”的申请日期 2.查询同一个身份证号有两条及以上记录的身份证号码及记录个数 3.将身份证号码为“4…...

femap许可与云计算集成

随着云计算技术的迅猛发展&#xff0c;越来越多的企业开始将关键应用和服务迁移到云端&#xff0c;以享受其带来的弹性扩展、高效管理和成本优化等优势。Femap作为一款强大的电磁仿真工具&#xff0c;通过与云计算的集成&#xff0c;将为企业带来前所未有的许可管理和仿真分析体…...

uni-app项目从0-1基础架构搭建全流程

前情 最近新接了一个全新项目&#xff0c;我负责从0开始搭建小程序&#xff0c;我选用的技术栈是uni-app技术栈&#xff0c;UI库选择的是uview-plus&#xff0c;CSS引入现在流行的tainlwindcss&#xff0c;实现CSS原子化书写&#xff0c;实现小程序分包&#xff0c;分包中实现…...

轻量级高性能推理引擎MNN 学习笔记 04.线性回归

1. 线性回归 MNN 官方给的iOS Demo中&#xff0c;输入是图片&#xff0c;输出是分类结果&#xff0c;相对来讲&#xff0c;略微有些复杂&#xff0c;我们现在用一个最简单的线性回归模型&#xff0c;来说明MNN的用法。 该线性回归是yaxb &#xff08;其中a2,b0.01&#xff09…...

使用 React PDF 构建 React.js PDF 查看器的指南

在本文中&#xff0c;我们将重点介绍在React.js中制作 PDF 查看器的最受欢迎的开源库。具体来说&#xff0c;我们将利用著名的开源库react-pdf的功能&#xff0c;指导您完成创建 React.js PDF 查看器的过程。 通过本教程&#xff0c;您将在第一部分学习如何使用 React-PDF 在 …...

动力电池点焊机厂家:驱动新能源制造的精密力量|比斯特自动化

在新能源汽车、储能系统等产业蓬勃发展的背景下&#xff0c;动力电池点焊机作为电池模组生产的核心设备&#xff0c;正经历着技术迭代与市场需求的双重升级。这类厂家通过持续研发与创新&#xff0c;不仅满足了电池制造企业对焊接精度、效率与稳定性的严苛要求&#xff0c;更推…...

React的合成事件(SyntheticEventt)

文章目录 前言 前言 React的合成事件&#xff08;SyntheticEvent&#xff09;是React为了统一不同浏览器的事件处理行为而封装的一套跨浏览器事件系统。它与原生事件的主要区别如下&#xff1a; 1. 事件绑定方式 • 合成事件&#xff1a;使用驼峰命名法绑定事件&#xff08;如…...

知识中台Top5:Baklib上榜推荐

Baklib知识中台优势 在数字化转型浪潮中&#xff0c;Baklib凭借其知识中台的核心设计理念&#xff0c;构建了企业级知识管理的差异化竞争力。区别于传统文档管理系统&#xff0c;该平台通过四库体系&#xff08;知识资源库、场景规则库、服务模型库、应用组件库&#xff09;实…...

在Windows系统中使用C++与Orthanc交互:基于DICOMweb的医学影像应用开发

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…...

视频太大?用魔影工厂压缩并转MP4,画质不打折!

在日常生活中&#xff0c;我们常常需要将视频文件转换成不同的格式以适应各种设备或平台的播放需求。魔影工厂作为一款功能强大且操作简单的视频转换工具&#xff0c;深受用户喜爱。本文中简鹿办公将手把手教你如何使用魔影工厂将视频转换为MP4格式&#xff0c;并进行个性化设置…...

Wan2.1 通过首尾帧生成视频

Wan2.1 通过首尾帧生成视频 flyfish 使用 Wan2.1-FLF2V-14B-720P 模型&#xff0c;通过输入两张图像&#xff08;起始帧和结束帧&#xff09;&#xff0c;生成一段连贯的视频。 First Last Frame-to-Video 即 “首末帧到视频” 技术 import numpy as np import torch import…...

宝塔+fastadmin:给项目添加定时任务

一、定时任务脚本编写 1. 使用 shebang 声明执行器 #!/usr/bin/env php 这是 Unix/Linux 系统中脚本文件的标准开头。表示这个脚本使用系统环境变量中的 php 来执行。2. 定义 ThinkPHP 入口路径并加载框架 define(APP_PATH, __DIR__ . /../../application/); require __DIR__…...

[自动化集成] 使用明道云上传附件并在Python后端处理Excel的完整流程

在企业日常自动化场景中,使用低代码平台如明道云搭建前端界面,结合自定义Python后端服务,实现灵活数据处理是一种高效的组合方式。本文将分享一个典型的集成用例:用户通过明道云上传文本和Excel附件,Python后端接收并解析这些信息,最终实现完整的数据处理闭环。 项目背景…...