首页 > 其他分享 >【Android笔记】Android APK编译打包流程

【Android笔记】Android APK编译打包流程

时间:2024-08-23 10:50:52浏览次数:13  
标签:dex 文件 java 编译 app 生成 APK Android

前言


本文将介绍Android从一个项目打包成APK的过程,其中涉及Android JavaKotlin文件、资源文件、清单文件、依赖jar包so库等在打包过程中处理。


步骤


总体的打包流程如下图,下面就介绍下详细的打包步骤。

1、将aidl文件编译成java文件

在构建过程中,Gradle会调用AIDL编译器将.aidl文件转化为.java文件。


2、aapt2处理resource文件

使用AAPT编译res目录下资源文件,把部分xml文件编译成二进制文件,同时生成R.javaresource.arsc文件。

R.java: 我们开发中就能接触到,为资源分类,R.layoutR.drawableR.string为项目中的资源文件提供了一个索引,包含布局、颜色、尺寸、字符串等

resource.arsc : 保存了应用的所有已编译资源的二进制数据。

①、包含应用中所有资源项的值,如字符串、颜色、尺寸、样式等。每个资源项都与一个资源 ID 相关联,这些 ID 是由 R.java 文件生成的常量。

②、包含了每种资源类型的描述信息,比如 layoutstringcolordrawable等。每种类型都包含多个资源项。

③、文件包含与不同设备配置相关的资源信息,如针对不同语言、屏幕密度、屏幕大小、方向等配置的资源。

aidl生成的xxx.java文件和aapt编译资源文件生成的R.java进行合并。


3、JavaC编译生成.javac文件

此步骤是项目中所有的java代码、aidl生成的xxx.java文件还有R.java文件通过JavaCompiler编译器编译生成.class文件。


4、dx工具生成classes.dex

将步骤3中生成的.classes文件和三方库中编译生成的.classes文件通过dx工具,生成classes.dex,这就是Dalvik虚拟机所能识别和执行的文件类型。


5、APKBuilder工具生成apk

将步骤4中生成的classes.dex,项目中非Java文件(如清单文件、so库)、assets目录下文件,三方非Java资源通过工具apkbuilder生成未签名的apk包。


6、Zipalign优化与签名发布

Zipalign(对齐处理) 工具,对APK 中的所有未压缩数据(例如图片)在 4 字节边界上对齐。这使得CPU读写就会更高效,以提高应用在设备上的运行性能。ZipalignAndroid SDK 提供的一个优化工具,确保 APK 中的数据经过对齐,从而减少应用启动时间和内存占用。

步骤5中生成了未签名的apk文件,开发期间使用 AS提供的默认 debug 密钥自动签名,发布应用时,必须使用密钥库文件(keystore)进行签名。密钥库通常是一个 .jks 文件,包含应用的签名信息。

在这里插入图片描述


编译实例


在这里插入图片描述
通过Gradle构建工具进行编译打包,控制台中可以看到构建任务执行的过程,可以看到和上述描述的构建打包流程是一致的。


//准备编译release版本
:app:preReleaseBuild
:app:dataBindingMergeDependencyArtifactsRelease
:app:generateReleaseResValues

//aidl编译器转化aidl文件为java文件
:app:compileReleaseAidl

//生成、合并、处理xml文件,如layout.xml、color.xml等
:app:generateReleaseResources
:app:mergeReleaseResources
:app:dataBindingGenBaseClassesRelease
:app:processReleaseResources

//KotlinC 编译kotlin成.class文件
:app:compileReleaseKotlin
:app:javaPreCompileRelease

//JavaC 编译java
:app:compileReleaseJavaWithJavac

.....

//合并Jni目录
:app:mergeReleaseJniLibFolders
:app:mergeReleaseNativeLibs

.....

//解糖化 Release 文件依赖项
:app:desugarReleaseFileDependencies
:app:mergeExtDexRelease

//合并所有Dex文件
:app:mergeDexRelease

.....


//生成、处理、合并Assets、项目资源文件、Java文件
:app:generateReleaseAssets
:app:mergeReleaseAssets
:app:compressReleaseAssets
:app:processReleaseJavaRes
:app:mergeReleaseJavaResource

.....

//打包
:app:packageRelease

编译打包后,对apk文件进行解压,我们可以发现生成了classes.dexresources.arscAndroidManifest.xml清单文件、kotlin/文件夹 , res/文件夹 , assetsso库会原封不动打到apk对应目录中。

在这里插入图片描述

上图中我们还可以发现,除了有classes.dex还有classes2.dex两个.dex文件,这是由于应用的代码量超出了单个 .dex 文件的 64K 方法数限制,这个限制包括应用的所有方法(包括 Android SDK、第三方库和应用自身的代码),导致构建工具自动启用了 MultiDex 机制,将代码分割到多个 .dex 文件中。通过 MultiDex,应用可以突破这个限制,并继续正常运行。


结尾

至此,我们了解了Android项目打包成apk的大致流程,作以记录,后续有时间再研究每个环节。

标签:dex,文件,java,编译,app,生成,APK,Android
From: https://blog.csdn.net/qq_17470165/article/details/141320401

相关文章

  • 利用源生成器,在编译阶段生成映射代码,减少运行时反射
    利用源生成器,在编译阶段生成映射代码,减少运行时反射这里有一个Product类和ProductDto类,实现对象自身的拷贝,或者Product映射ProductDtoGenMapperAttribute标注了类型需要生成映射方法,同时要求实现IAutoMap接口(由生成器自动实现)构造函数可选参数为目标类型,默认是自身MaoToAttr......
  • 20240819编译 链接 单片机执行的第一个语句
    2024年8月中旬在宝鸡出差,在B站上学习了下。在linux操作系统中,gdb是调试器,gcc是编译器。Linux操作系统将main.elf文件加载到内存中以后,操作系统为其分配进程,然后main函数就开始执行了。输入layoutasm则显示出来汇编代码 键入“starti”的时候 进入到程序里面的第一......
  • Android逆向(七) 解密COCOS游戏lua脚本-第1篇
    目录一、系统环境二、详细分析前言:1.lua脚本是什么?2.为什么游戏开发要用lua脚本?正文:获取Lua脚本的几种方法:1.直接在assets目录提取2.在luaL_loadbuffer函数处获取3.在底层的reader函数处获取1.静态分析2.动态分析一、系统环境OS:Windows_NTx6410.0......
  • CMake编译不同文件目录下的C++文件
        由于我们构建一个项目的时候,通常不会将所有的源文件放在一个文件目录下,这样既不方便开发,也不方便源码阅读,我们通常会对项目文件进行分层,比如分为include、src、res、lib这些目录,src下又分为model、controller、view这些目录。所以跨文件编译C++文件就相当必要了,如......
  • HTC 10 刷系统 LineageOS 19.1 Android 12
    解锁手机解锁会导致数据全部清除,注意保存Bootloader解锁,S-ON可以不用解锁(好像可以绕过解锁安装twrp,暂时没尝试)HTC官方UnlockBootloaderHTCDesire20pro可以不通过官方网站解锁adbrebootbootloader#进入bootloadersudofastbootflashingunlock#选择UNLOC......
  • 在CentOS7.9上 编译安装openssl-3.3.1+编译安装Nginx1.26.2
    编译安装注意事项知识点一:openssl的重要性openssl在Linux系统中扮演着至关重要的角色,尤其是在网络安全方面。许多服务和应用程序都依赖于openssl提供的加密功能,包括但不限于web服务器(如Apache和Nginx)、数据库服务器(如MySQL和PostgreSQL)、邮件服务器、VPN等。以下......
  • 减小编译出来的 .so 文件的尺寸方法
    要减小编译出来的.so文件的尺寸,可以通过去除符号表、调试信息等非必要的内容来实现:一、Linux系统下方法1.使用strip命令strip命令可以删除.so文件中的符号表和调试信息,从而减小文件大小。strip--strip-unneededlibyourlibrary.so--strip-unneeded参数只会......
  • 深入理解Android MTP之存储映射分析
    深入理解AndroidMTP之UsbService启动分析 分析了MTP的服务端的启动,本文来分析切换MTP模式后,存储中的数据(文件、目录)是如何映射到PC端的。首先你得知道如何切换MTP模式。当手机通过usb连接电脑时,会出现一个关于usb的通知,点击通知后,会出现一个类似如下的界面这个FileTransfe......
  • android调用h5代码步骤
    要在Android应用中调用H5代码,可以使用WebView来加载并执行H5代码。以下是一个简单的示例:首先,在你的Android项目中的布局文件中添加一个WebView组件:```xml<WebView  android:id="@+id/webview"  android:layout_width="match_parent"  android:layout_height="......
  • lazarus 3.4+fpc trunk编译tachart控件出错
    lazarus3.4+fpctrunk编译tachart控件出错原因:最新的fpc禁止访问private引起的修改方法:1、打开lazarus\components\tachart\tadatatools.pas将functionTDataPointDistanceTool.FindRef(APoint:TPoint;AMode:TDataPointMode;ADest:TDataPointTool.TPointRef;AOtherEndS......