Android 编译流程解析03-手动编译Apk
Android编译流程
通过之前两篇文章,我们已经大致了解了编译相关的Gradle,它们的编译流程如下图所示,这篇文章我们来通过手动编译的方式,来模拟Gradle 编译Android APK文件。
手动编译APK
创建一个Android项目
首先,我们要有一个Android项目,为了更简单,我去除了多余的代码,我们编译的时候,可以直接使用该项目。
下载地址 Android 手动编译APK-代码资源下载
创建build文件夹
我们把下载好的项目解压,然后使用cmd,进入其app目录下,然后创建build文件夹
mkdir build
编译资源
aapt2 compile -o build/res.zip --dir src/main/res
然后,会生成一个zip文件
我们打开这个zip文件,可以看到所有资源已经被打包成了.flat格式
对资源进行链接
aapt2 link build/res.zip -I C:\Developer\Android\SDK\platforms\android-29\android.jar --java build --manifest src\main\AndroidManifest.xml -o build\app-debug.apk
执行后,可以看到生成了app-debug.apk
在com文件夹里,还有R.java文件
来看下R.java
然后,我们把R.java赋值到我们项目代码中,这样就不用再导包了。
编译java文件
接着,我们需要编译Java文件
javac -d build -cp C:/Developer/Android/SDK/platforms/android-29/android.jar src/main/java/com/heiko/mytest/*.java
这样我们就得到了class字节码文件
Java 代码是由 javac 编译的,Kotlin 代码是由 kotlinc 编译的
这里的 C:/Developer/Android/SDK 可以由 %ANDROID_HOME% 代替
生成Dex文件
可以用老的dx编译器,也可以用新的d8编译器。
这里我们用d8编译器。
d8 --output build --lib C:/Developer/Android/SDK/platforms/android-29/android.jar build/com/heiko/mytest/*.class
这样,我们就生成了dex文件
将dex文件放入apk文件中
我们要调用zip命令,这里的zip也就是我们常用的解压缩软件,
由此也可以证明,apk文件实质上就是个压缩文件。
要通过命令行使用zip,我们需要先配置到环境变量中。
详见【终端】“zip不是内部或外部命令,也不是可执行程序”详细解决办法
zip -j build/app-debug.apk build/classes.dex
可以看到,新的app-deblug.apk文件,比原来要大一点
我们看下其内部,可以看到dex文件已经在里面了
生成签名
这个时候,apk文件中的内容还少META-INF
,也就是签名信息。
这里我们可以使用debug签名,密码是固定的android
apksigner sign -ks C:\Users\Heiko\.android\debug.keystore build/app-debug.apk
我们再来看下app-debug.apk
可以看到,已经有META-INF
文件夹了。
安装apk
最后,我们把apk安装到手机上,可以看到,正常运行成功 !
至此,我们手动编译APK就成功了 !
Android 编译流程解析系列
Android 编译流程解析01-AppPlugin初始化
Android 编译流程解析02-相关Task解析
Android 编译流程解析03-手动编译Apk
相关资源下载
Android 手动编译APK-代码资源下载
Android 编译流程解析03-手动编译Apk相关推荐
- TDA4VM 8.4 RTOS SDK 中 SBL 的编译流程解析与makefile 分析笔记
目录 0. TDA4VM 8.4 RTOS SDK 中 SBL 的编译流程解析 TI SDK 的可执行文件后缀名是 .xer5f 的原因 sbl_ospi_img 的 .xer5f 可执行文件的生成过 ...
- C语言编译流程:预处理、编译、汇编、链接
流程: 预处理:展开头文件/宏替换/去掉注释/条件编译 (test.i main .i) 编译:检查语法,生成汇编 ...
- Android关机流程解析
https://developer.android.com/intl/zh-CN/reference/android/os/PowerManager.html 在PowerManager的API文档中 ...
- Android 开机流程解析
目录 第一章 概述 第二章 Init启动 第三章 Android关键进程启动 第一章 概述 开机作为使用手机的第一步操作,在长按电源键之后到我们可视化可操作的界面中间包含了很多任务,诸如文件系统挂载. ...
- 手动编译Mysql5.6.10 手动编译php 支持fastcgi
5.6在性能上有所改进 1.tar xf 5.6..... 2.cd /usr/local 3.ln -sv mysql-5.6.10-linux-glibc2.5-i686 mysql 4.cd m ...
- android glide流程解析,Glide 源码解析(一):简单流程分析
这篇文章上次修改于 839 天前,可能其部分内容已经发生变化,如有疑问可询问作者. 这篇文章是这个系列的第一篇文章,我第一次写这样连续系列的文章,我先一层一层的剥开 Glide ,如果谁有更好的想法欢 ...
- Android Handler 流程解析
相关类图 Handler.Looper.MessageQeue 处理流程图 public void dispatchMessage(@NonNull Message msg) {if (msg.cal ...
- 高通Android智能平台环境搭建_编译流程分析
高通Android智能平台环境搭建_编译流程分析 高通平台环境搭建,编译,系统引导流程分析 TOC \o \h \z \u 1. 高通平台android开发总结. 7 1.1 搭建高通平台环境开发环境 ...
- Android编译流程
目录 一.编译流程 1.初始化编译环境 2.选择编译平台 3.开始编译 二.Soong工具 1.Soong工作原理 2.转换关系 三.make流程 1.编译开端main.mk 2.编译配置config ...
最新文章
- 怎样在表格中选出同一类_超超超超实用的年会策划执行表格模板合集!
- POJ3345 Bribing FIPA 【背包类树形dp】
- Tensorflow:interactivesession和session的区别。
- 在sts中springboot工程的maven解析异常处理
- Java—简单的注册页面
- 操作系统之文件管理:8、文件系统实例
- hyper-v ubuntu 图形界面不流畅_ubuntu简单美化教程
- android手机测试用例,Android手机测试用例-从事手机测试必备
- .net框架笔记(四)
- Dagger 2 系列(一) -- 前奏篇:依赖注入的基本介绍
- python爬网页html乱码问题
- HTTP、HTTP2.0、SPDY、HTTPS 你应该知道的一些事
- 狗年拜年php源码,2018新年拜年贺词【2018狗年拜年贺词】
- H5本地调试微信静默授权、授权获取用户信息
- 机器学习 知识图谱常用术语
- 渠道商用假流量冒充真实用户
- eclipse找不到java虚拟机_eclipse无法启动 - 没有找到java虚拟机
- 时间序列分析中的移动平均趋势剔除法
- JVM系列(十三)——垃圾回收器
- CSS去除图片基准线
热门文章
- vue新手入门实践教程
- javaweb基于servlet天气预报查询系统设计与实现(项目源码)
- 基于树莓派的Scratch儿童编程环境定制
- javase05(第六章)
- 华硕曙光服务器网站,地平线:零之曙光上线 华硕RTX 2070s显卡稳定畅玩
- freeswitch SIP内呼与外呼配置
- “易语言.飞扬”开发的彩球游戏,作者美女勿近,含源代码
- APM飞控学习之路:5 串口概述与收发调试
- ADK+MDT实现域控服务器全自动静默下发系统(四):MDT的部署--Deployment Shares及Operating System的设置
- Animation Frame动画实现应用的欢迎界面