
为了熟悉 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└─mytestMainActivity.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└─valuescolors.xmlstrings.xmlstyles.xml
进入其app目录下,然后在app目录下创建build文件夹

aapt2 compile -o build/res.zip --dir res
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

resources.arsc 文件格式:
ResTable_header
ResChunk_header:type = 0x0002packageCount:包表条目数作用:资源表全局头,标识文件类型及包含的包数量
ResStringPool_header
ResChunk_header:type = 0x0001stringCount/stringsStartstringoffsets[]字符串数据块
作用:字符串池全局头,集中存储所有类型标识符、资源项名称及文本值,供各结构索引引用
ResTable_package
ResChunk_header:type = 0x0200id:0x7F(应用)或 0x01(系统)name[128]typeStrings/keyStrings作用:资源包定义块,声明包标识符、包名,并定位该包的类型字符串池与项名称字符串池
ResTable_typeSpec
ResChunk_header:type = 0x0202id:类型标识符entryCount:条目数configmask[]:配置差异掩码数组作用:类型规范块,描述指定类型下各资源项的配置差异性信息,不存储具体资源值
ResTable_type
ResChunk_header:type = 0x0201id:类型标识符config:资源配置描述entryOffsets[]:条目偏移表entriesStart:条目数据起始偏移作用:类型数据块,针对特定配置,记录该类型下所有资源项的数据偏移位置
ResTable_entry + Res_value
ResTable_entry:flags+key(项名称索引)Res_value:dataType+data(类型编码 + 数据负载)作用:简单资源项定义,通过 key 索引资源名称,data 承载字符串索引、原始数值或资源引用
ResTable_map_entry + ResTable_map[]
ResTable_map_entry:parent+countResTable_map[]:name+value作用:复合资源项定义(如样式表),parent 指定继承关系,map 数组存储属性键值对集合
附:Android系统在resources.arsc中查找流程
5.编译 AndroidManifest.xml(将xml从文本格式转换为axml的二进制格式,这就是为什么直接使用文本工具查看apk包里的AndroidManifest.xml是看不明白的)




javac -d build -cp C:\Users\Mayn\AppData\Local\Android\Sdk\platforms\android-29\android.jar com/heiko/mytest/*.java

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文件放入apk文件中

META-INF,也就是签名信息

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

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



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

夜雨聆风