乐于分享
好东西不私藏

手搓APK:从零手动编译Android安装包

手搓APK:从零手动编译Android安装包

SO逆向分析工具

二进制逆向分析-APK智能分析工具V1.1

从零到一:手把手教你反混淆Android代码

逆向工程框架(智能逆向分析)

为了熟悉 Android APK 编译打包流程,UP主决定手动编译一个 APK

首先,上资源
这是原工程文件
MyTest.ziphttps://pan.baidu.com/s/1_AemL2dhYAkDjs6jfHaUFQ?pwd=zsj4 提取码: zsj4 

这是我打包成功的apk

app-debug-zipalign-sign.apkhttps://pan.baidu.com/s/1QgJ8mqZ2VP4I602ZIGCTxg?pwd=359u 提取码: 359u

下载好的项目解压,提取其中的java代码、res资源和AndroidManifest文件

整体结构如下:

AndroidManifest.xmlcom└─heiko    └─mytest            MainActivity.javares├─drawable│      ic_launcher_background.xml├─drawable-v24│      ic_launcher_foreground.xml├─layout│      activity_main.xml├─mipmap-anydpi-v26│      ic_launcher.xml│      ic_launcher_round.xml├─mipmap-hdpi│      ic_launcher.png│      ic_launcher_round.png├─mipmap-mdpi│      ic_launcher.png│      ic_launcher_round.png├─mipmap-xhdpi│      ic_launcher.png│      ic_launcher_round.png├─mipmap-xxhdpi│      ic_launcher.png│      ic_launcher_round.png├─mipmap-xxxhdpi│      ic_launcher.png│      ic_launcher_round.png└─values        colors.xml        strings.xml        styles.xml

进入其app目录下,然后在app目录下创建build文件夹

编译res资源
aapt2 compile -o build/res.zip --dir res
编译出的res.zip,所有的资源都被打包成了flat格式
使用aapt2对资源合并并打包(链接)生成 app-debug.apk
aapt2 link build/res.zip -I C:\Users\Mayn\AppData\Local\Android\Sdk\platforms\android-29\android.jar --java build --manifest AndroidManifest.xml -o build\app-debug.apk
它做了哪些事?
1.解析flat文件
2.合并系统库资源(从 android.jar 中提取需要的资源进行合并)
3.分配资源ID
4.生成 resources.arsc文件(存储资源ID和资源路径的映射关系,
以便系统运行时快速定位资源)

resources.arsc 文件格式


ResTable_header

  • ResChunk_header:type = 0x0002

  • packageCount:包表条目数

  • 作用:资源表全局头,标识文件类型及包含的包数量

ResStringPool_header

  • ResChunk_header:type = 0x0001

  • stringCount / stringsStart

  • stringoffsets[]

  • 字符串数据块

  • 作用:字符串池全局头,集中存储所有类型标识符、资源项名称及文本值,供各结构索引引用

ResTable_package

  • ResChunk_header:type = 0x0200

  • id:0x7F(应用)或 0x01(系统)

  • name[128]

  • typeStrings / keyStrings

  • 作用:资源包定义块,声明包标识符、包名,并定位该包的类型字符串池与项名称字符串池

ResTable_typeSpec

  • ResChunk_header:type = 0x0202

  • id:类型标识符

  • entryCount:条目数

  • configmask[]:配置差异掩码数组

  • 作用:类型规范块,描述指定类型下各资源项的配置差异性信息,不存储具体资源值

ResTable_type

  • ResChunk_header:type = 0x0201

  • id:类型标识符

  • config:资源配置描述

  • entryOffsets[]:条目偏移表

  • entriesStart:条目数据起始偏移

  • 作用:类型数据块,针对特定配置,记录该类型下所有资源项的数据偏移位置

ResTable_entry + Res_value

  • ResTable_entryflags + key(项名称索引)

  • Res_valuedataType + data(类型编码 + 数据负载)

  • 作用:简单资源项定义,通过 key 索引资源名称,data 承载字符串索引、原始数值或资源引用

ResTable_map_entry + ResTable_map[]

  • ResTable_map_entryparent + count

  • ResTable_map[]name + value

  • 作用:复合资源项定义(如样式表),parent 指定继承关系,map 数组存储属性键值对集合


附:Android系统在resources.arsc中查找流程

5.编译 AndroidManifest.xml(将xml从文本格式转换为axml的二进制格式,这就是为什么直接使用文本工具查看apk包里的AndroidManifest.xml是看不明白的

6.生成R.javaR.java是一个类,定义了Java代码中用到的资源变量和资源ID的映射关系
7.检查资源依赖
8.生成apk将二进制格式的manifest、resource.arsc资源路径映射文件、res资源打包成一个apk)
将R.java拷贝到项目中
将Java代码编译为class字节Java 代码是由 javac 编译的,Kotlin 代码是由 kotlinc 编译的
javac -d build -cp C:\Users\Mayn\AppData\Local\Android\Sdk\platforms\android-29\android.jar com/heiko/mytest/*.java
此时的字节码是二进制格式,仍无法查看
需要使用javap反编译查看
javap -v build/com/heiko/mytest/MainActivity.class

生成Dex文件将 Jvm 虚拟机识别的 class字节码文件转换为 Dalvik/ART 虚拟机识别的 dex字节码文件,划重点:当单个文件的方法/字段/类引用总和超过了65536将会拆分为多个独立dex存储

java -cp C:\Users\Mayn\AppData\Local\Android\Sdk\build-tools\29.0.3\lib\d8.jar com.android.tools.r8.D8 --output build --lib C:\Users\Mayn\AppData\Local\Android\Sdk\platforms\android-29\android.jar build\com\heiko\mytest\*.class
补充:主dex必须存放启动类(主dex必须存放Application类、主Activity类、加载其他dex的核心类、四大组件 Activity/Service/Receiver/Provider),系统只默认加载主dex,其他dex通过反射动态注入/合并到dexElements数组

将dex文件放入apk文件中

此时apk就是一个完整的apk了,不过现在还不能安装,因为apk文件中的内容还少META-INF,也就是签名信息
对APK进行签名(就使用debug签名吧)
安装运行,大功告成!
参考引用:
https://blog.csdn.net/EthanCo/article/details/107172750https://github.com/wangwangheng/BestBlogReprinted_AndroidNotes/blob/master/插件式开发/其他/Android关于Dex拆分技术详解.md

进阶学习建议:

Android Gradle编译介绍

https://juejin.cn/post/7382891974942490650

解决Android单个dex文件不能超过65536个方法问题

https://blog.csdn.net/stevenhu_223/article/details/41277827

SO逆向分析工具

移动设备取证系统(专业版)V2.6

二进制逆向分析-APK智能分析工具V1.1

APP逆向分析工具V4.5

智能分析产品(28款神器)

Android病毒分析工具V3.2

Android逆向技能树(2026版)

移动安全调试分析工具(29款)

Android智能调试分析工具V7.5

Android日志智能化分析系统V3.5

Android和iOS安全技能树(2026版)

Android | iOS 移动设备取证系统V2.5

Android设备数据恢复技术方案(2026版)

鸿蒙HarmonyOS应用逆向技能树(2026版)

APP悬浮窗逆向分析

AI辅助逆向分析工具

基于Frida的脱壳工具

移动设备取证系统V2.5

主流AI智能体与工作流框架

Android逆向工程师的“护城河”在哪?

Android安全研究神器 | 移动渗透测试利器

Android脱壳篇

APP脱壳的分析
APP基于Frida脱壳
APP加固和脱壳方案总结
Android加固和脱壳原理探索
基于PE-sieve的动态脱壳神器
Android安全之定制ROM脱壳机浅析
Android系统刷机镜像ROM脱壳和逆向工具
Android10至16系统定制脱壳机(安全测试机)
Android10至16系统ROM定制(脱壳和安全测试)
深入ART Dex加载流程,玩转Android通用脱壳点
FART脱壳:实现AJM壳级别的对抗功能+绕过全解析
so脱壳全流程(识别加壳、Frida Dump、原理深入解析)
干掉抽取壳!FART自动化脱壳框架与Execute脱壳点解析
Android基于ART环境主动调用/FART/通用自动化脱壳系统

Android逆向工具篇

APP逆向分析工具V4.5
APK安全加固平台V5.2
Python逆向分析工具V2.5
Unity手游无Root注入工具
Android病毒分析工具V3.2
Android智能取证系统V1.1.8
Android智能调试分析工具V7.5
Python字节码反编译工具(逆向分析)
Python字节码反编译逆向分析(高级篇)
Android Apk逆向分析工具(jadx-ai-mcp)
逆向交流群|Android智能调试工具(下载地址)
Smali/AAR/JAR/DEX/APK逆向分析转换工具V2.5

鸿蒙安全交流群、移动安全交流群、OpenClaw交流群、APP逆向交流群等技术交流群,需要定制版安全测试机型、定制版脱壳机,定制版移动安全分析工具,商务合作,添加作者微信,微信号:cd_ccms_sec

Android APP自动化测试平台V3.5
云手机Redroid Android13源码一键编译
云手机 Redroid Android 13 一键构建脚本
云手机Android13源码编译(Redroid ARM64一键启动方法)
Android系统定制篇
Android系统ROM定制(课程)
AOSP源码定制-内核驱动编写
Android系统ROM定制汇总篇
Android10至16系统ROM定制篇
AOSP源码定制-对root定制的补充
AOSP Android10定制su隐藏root
Android7至16系统ROM定制篇(2025)
Android12定制版安全测试手机(Pixel3)
AOSP源码定制-so注入并集成hook框架
AOSP源码定制-修改ART实现smali追踪
Android7至Android16系统定制篇(魔改)
AOSP开机动画定制指南(基于Android13)
基于QEMU/KVM定制Android10至16系统
Android10至16系统定制脱壳机(安全测试机)
Android10至16系统ROM定制(脱壳和安全测试)
AOSP Pixel4 Android13系统定制(编译问题解决)
Android系统定制绕过检测(入门到精通-建议收藏)
Android10以上系统定制Root权限(隐藏Root权限)
Android系统定制实现无人直播技术架构和解决方案
云手机Android13系统定制虚拟摄像头(Redroid魔改篇)
Android6.0至13系统定制版手机(适合于开发/安全研究)
Android15系统定制自定义系统服务的完整流程及代码实现
Android应用Root检测通杀篇(ROM定制过Root/Hook等检测)
Android10以上定制版手机+移动端智能调试分析软件(VIP试用版)
从零定制Android15:修改Build.prop与内核态绕过设备指纹检测
Android10至16系统定制中实现同时打印JNI(Native)堆栈和Java堆栈
OpenClaw安装和部署
Ubuntu虚拟机上部署OpenClaw
OpenClaw安全防护工具(小龙虾漏洞检测)
AI智能体 | 工作流 | Ubuntu环境一键部署OpenClaw
OpenClaw常用命令大全:安装、配置、服务控制与技能管理
Android Root研究篇
KernelSU vs Magisk对比

搭建云手机(无需Root权限)

Android Root攻防对抗思路

Android Root研究(深入浅出)

使用Magisk+riru实现全局改机

Root检测绕过(文件系统虚拟化)

Android Root检测和绕过(浅析)

Android/Linux Root分析与研究

Android获取Root权限的通用方法

基于chroot的内核级绕过越狱检测

AOSP源码定制-对root定制的补充

AOSP Android10定制su隐藏root

Root和隐藏(Magisk+Ruru+LSPosed)

KernelSU Android上基于内核的Root方案

[深入篇]开发超级Root权限后台服务进程实战

KernelSU全面解析:安卓内核级Root解决方案

定制Android系统(干掉Root检测和Frida检测)

Android10以上系统定制Root权限(隐藏Root权限)

Riru&Edxposed学习研究(一)手把手安装Edxposed

干货|Android免Root最全Hook插件(Hook任意App)

SKRoot-SuperKernelRoot-Linux内核级完美隐藏RooT

Android应用Root检测通杀篇(ROM定制过Root/Hook等检测)

Cygwin下ndk standalone版本的交叉编译环境搭建(Root研究)

Riru&Edxposed学习研究(二)手把手编译Riru和Edxposed工程源码

Riru&Edxposed学习研究(三)免Magisk使用adb命令安装Edxposed

Riru&Edxposed学习研究(四)Magisk(面具)源码下载编译详细实战教程

FakeXposed最强屏蔽Xposed、Root检测,自定义maps、文件重定向等支持Android5~14