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相关推荐

  1. TDA4VM 8.4 RTOS SDK 中 SBL 的编译流程解析与makefile 分析笔记

    目录 0. TDA4VM 8.4 RTOS SDK 中 SBL 的编译流程解析 TI SDK 的可执行文件后缀名是 .xer5f 的原因 sbl_ospi_img 的 .xer5f 可执行文件的生成过 ...

  2. C语言编译流程:预处理、编译、汇编、链接

    流程: 预处理:展开头文件/宏替换/去掉注释/条件编译                       (test.i main .i) 编译:检查语法,生成汇编                      ...

  3. Android关机流程解析

    https://developer.android.com/intl/zh-CN/reference/android/os/PowerManager.html 在PowerManager的API文档中 ...

  4. Android 开机流程解析

    目录 第一章 概述 第二章 Init启动 第三章 Android关键进程启动 第一章 概述 开机作为使用手机的第一步操作,在长按电源键之后到我们可视化可操作的界面中间包含了很多任务,诸如文件系统挂载. ...

  5. 手动编译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 ...

  6. android glide流程解析,Glide 源码解析(一):简单流程分析

    这篇文章上次修改于 839 天前,可能其部分内容已经发生变化,如有疑问可询问作者. 这篇文章是这个系列的第一篇文章,我第一次写这样连续系列的文章,我先一层一层的剥开 Glide ,如果谁有更好的想法欢 ...

  7. Android Handler 流程解析

    相关类图 Handler.Looper.MessageQeue 处理流程图 public void dispatchMessage(@NonNull Message msg) {if (msg.cal ...

  8. 高通Android智能平台环境搭建_编译流程分析

    高通Android智能平台环境搭建_编译流程分析 高通平台环境搭建,编译,系统引导流程分析 TOC \o \h \z \u 1. 高通平台android开发总结. 7 1.1 搭建高通平台环境开发环境 ...

  9. Android编译流程

    目录 一.编译流程 1.初始化编译环境 2.选择编译平台 3.开始编译 二.Soong工具 1.Soong工作原理 2.转换关系 三.make流程 1.编译开端main.mk 2.编译配置config ...

最新文章

  1. 怎样在表格中选出同一类_超超超超实用的年会策划执行表格模板合集!
  2. POJ3345 Bribing FIPA 【背包类树形dp】
  3. Tensorflow:interactivesession和session的区别。
  4. 在sts中springboot工程的maven解析异常处理
  5. Java—简单的注册页面
  6. 操作系统之文件管理:8、文件系统实例
  7. hyper-v ubuntu 图形界面不流畅_ubuntu简单美化教程
  8. android手机测试用例,Android手机测试用例-从事手机测试必备
  9. .net框架笔记(四)
  10. Dagger 2 系列(一) -- 前奏篇:依赖注入的基本介绍
  11. python爬网页html乱码问题
  12. HTTP、HTTP2.0、SPDY、HTTPS 你应该知道的一些事
  13. 狗年拜年php源码,2018新年拜年贺词【2018狗年拜年贺词】
  14. H5本地调试微信静默授权、授权获取用户信息
  15. 机器学习 知识图谱常用术语
  16. 渠道商用假流量冒充真实用户
  17. eclipse找不到java虚拟机_eclipse无法启动 - 没有找到java虚拟机
  18. 时间序列分析中的移动平均趋势剔除法
  19. JVM系列(十三)——垃圾回收器
  20. CSS去除图片基准线

热门文章

  1. vue新手入门实践教程
  2. javaweb基于servlet天气预报查询系统设计与实现(项目源码)
  3. 基于树莓派的Scratch儿童编程环境定制
  4. javase05(第六章)
  5. 华硕曙光服务器网站,地平线:零之曙光上线 华硕RTX 2070s显卡稳定畅玩
  6. freeswitch SIP内呼与外呼配置
  7. “易语言.飞扬”开发的彩球游戏,作者美女勿近,含源代码
  8. APM飞控学习之路:5 串口概述与收发调试
  9. ADK+MDT实现域控服务器全自动静默下发系统(四):MDT的部署--Deployment Shares及Operating System的设置
  10. Animation Frame动画实现应用的欢迎界面