Android系统(AOSP)--编译指令篇

news/2024/7/19 19:48:05

目录

一、编译Android系统

二、普通编译指令

三、快速编译指令

四、新建lunch项和编译类型说明

五、Android编译系统的整体架构

六、编译后的输出目录和生成文件

七、Android常用编译命令总结  


一、编译Android系统

1.Android系统全编译(Android5.1以后mtk都是这种方式,Google原生也是这样)

source build/envsetup.sh
lunch msm8953_64-userdebug
make –j32

2.高通平台Android11.0以后系统全编译 

source build/envsetup.sh
lunch msm8953_64-userdebug
./build.sh dist -j32

二、普通编译指令

在服务器上编译AOSP(Android Open Source Project)代码通常涉及以下步骤:

Step 1: 准备服务器环境在服务器上安装所需的软件和工具,包括Java JDK、Git、Python、make、gcc等。确保服务器具备编译AOSP所需的依赖项。

Step 2: 克隆AOSP代码库使用Git命令克隆AOSP代码库到服务器上的本地目录。例如:

git clone https://android.googlesource.com/platform/manifest

这将下载AOSP代码库到本地目录。

Step 3: 配置环境变量设置环境变量,包括设置Java JDK的路径、Android SDK的路径等。这些环境变量的设置可以根据服务器环境和具体需求进行调整。

Step 4: 初始化编译环境进入AOSP代码库所在的目录,并运行以下命令来初始化编译环境:

source build/envsetup.sh

这将设置必要的编译环境变量和函数。

source 引入了 build/envsetup.sh脚本,该脚本的作用是初始化编译环境,并引入一些辅助的 Shell 函数,这其中就包括下一步使用 lunch 函数。除此之外,该文件中还定义了其他一些常用的函数,如:m、mm、mmm,mma,mmma。

Step 5: 选择目标设备和构建类型使用lunch命令选择要编译的目标设备和构建类型。例如:

lunch aosp_arm-eng

这将设置编译环境为针对ARM架构的eng(工程师)版本。

“lunch aosp_arm-eng”是调用 lunch 函数,并指定参数为“aosp_arm-eng”。lunch 函数的参数用来指定此次编译的目标设备以及编译类型。在这里,这两个值分别是“aosp_arm”和“eng”。“aosp_arm”是 Android 源码中已经定义好的一种产品,是为模拟器而设置的。而编译类型会影响最终系统中包含的模块。如果调用 lunch 函数的时候没有指定参数,那么该函数将输出列表以供选择,该列表如下图中的内容,此时可以通过输入编号或者名称进行选择。

 Step 6: 开始编译运行以下命令开始编译AOSP代码:

make -j<threads>

其中<threads>表示使用的并发线程数,可以根据服务器的配置进行调整。编译过程可能会耗时较长,请耐心等待。

Step 7: 获取编译结果编译完成后,编译输出位于out目录下。根据需求,可以获取生成的系统镜像、应用程序包等。


三、快速编译指令

使用如下指令来编译AOSP的单个模块:

./prebuilts/build-tools/linux-x86/bin/ninja -f out/combined-aosp_arm-eng.ninja SnapdragonCamera -j32

该指令是AOSP的快编指令,用于快速编译单个模块。  

下面是该指令生成的步骤解释:

  1. ./prebuilts/build-tools/linux-x86/bin/ninja: 这部分指定了要使用的构建工具,即Ninja构建系统。该指令通过在AOSP预构建工具链目录下找到Ninja可执行文件进行调用。

  2. -f out/combined-aosp_arm-eng.ninja: 这部分指定了Ninja构建系统要使用的构建文件的路径和名称。在AOSP编译过程中,生成的构建文件会存储在out目录中,且命名通常包含目标设备的相关信息。

  3. SnapdragonCamera: 这部分指定了要构建的目标模块或子模块的名称。在这种情况下,目标是构建SnapdragonCamera模块,该模块是相机应用的一部分。

  4. -j32: 这部分指定了并发构建的线程数。-j32表示同时使用32个线程进行构建,以加快构建速度。

        综上所述,该指令的作用是使用Ninja构建系统,通过给定的构建文件路径和名称,在指定的线程数下构建SnapdragonCamera模块。这样可以快速生成相机应用所需的构建结果。

下面是编译其它模块的快编指令:

#编译Settings
./prebuilts/build-tools/linux-x86/bin/ninja -f out/combined-aosp_arm-eng.ninja Settings -j32#编译selinux
./prebuilts/build-tools/linux-x86/bin/ninja -f out/combined-aosp_arm-eng.ninja selinux_policy -j32#编译Framework
./prebuilts/build-tools/linux-x86/bin/ninja -f out/combined-aosp_arm-eng.ninja frameworks -j32#全编译
./prebuilts/build-tools/linux-x86/bin/ninja -f out/combined-aosp_arm-eng.ninja -j32 2>&1 |tee ninja_build.log#WIFI-service
./prebuilts/build-tools/linux-x86/bin/ninja -f out/combined-aosp_arm-eng.ninja com.android.wifi -j32

四、新建lunch项和编译类型说明

1.vendorsetup.sh(以前)

add_lunch_combo xxxx-useradd_lunch_combo xxxx-userdebugadd_lunch_combo xxxx-eng

2.AndroidProducts.mk(现在

AndroidProducts.mkCOMMON_LUNCH_CHOICES添加对应的lunch选项

3. 编译类型说明

1. eng默认类型,该编译类型适用于开发阶段

           当选择这种类型时,编译结果将:
           a.
安装包含 eng, debug, userdevelopment 标签的模块

           b. 安装所有没有标签的非 APK 模块

           c. 安装所有产品定义文件中指定的 APK 模块

2. user该编译类型适合用于最终发布阶段。

          当选择这种类型时,编译结果将:

          a.安装所有带有 user 标签的模块

          b.安装所有没有标签的非 APK 模块

          c.安装所有产品定义文件中指定的 APK 模块,APK 模块的标签    将被忽略

3. userdebug 该编译类型适合用于 debug 阶段。

         该类型和 user 一样,除了:

         a.会安装包含 debug 标签的模块

         b.编译出的系统具有 root 访问权限


五、Android编译系统的整体架构

1.build/core/config.mk

        该文件根据lunch命令所配置的产品信息在build/target/boardvendor或者device目录中找到对应的BoradConfig.mk文件,以及通过加载build/core/product_config.mk文件在build/target/productvendor或者device目录中找到对应的AndroidProducts.mk文件,来进一步对编译环境进行配置,以便接下来编译指定模块时可以获得必要的信息。

2.build/core/definitions.mk

该文件定义了在编译过程需要调用到的各种自定义函数。 

3.指定的Android.mk

        这些指定的Android.mk环境是由mmm命令通过环境变量ONE_SHOT_MAKEFILE传递给build/core/main.mk文件使用的。这些Android.mk文件一般还会通过环境变量BUILD_PACKAGEBUILD_JAVA_LIBRARYBUILD_STATIC_JAVA_LIBRARYBUILD_SHARED_LIBRARYBUILD_STATIC_LIBRARYBUILD_EXECUTABLEBUILD_PREBUILTbuild/core/package.mkbuild/core/java_library.mkbuild/core/static_java_library.mkbuild/core/shared_library.mkbuild/core/static_library.mkbuild/core/executable.mkbuild/core/prebuilt.mk等编译片段模板文件加载进来,来表示要编译是APKJava库、Linux动态库/静态库/可执行文件或者预先编译好的文件等等。 

4.build/core/Makefile

        该文件包含了用来制作system.imgramdisk.imgboot.imgrecovery.img等镜像文件的脚本。 


 

六、编译后的输出目录和生成文件

1.Build结果的目录结构

所有的编译产物都将位于 /out 目录下,该目录下主要有以下几个子目录:

/out/host/:该目录下包含了针对主机的 Android 开发工具的产物。即 SDK 中的各种工具,例如:emulatoradbaapt 等。

/out/target/common/:该目录下包含了针对设备的共通的编译产物,主要是 Java 应用代码和 Java 库。

/out/target/product/<product_name>/:包含了针对特定设备的编译结果以及平台相关的 C/C++ 库和二进制文件。其中,<product_name>是具体目标设备的名称。

2.Build生成的镜像文件

Build 的产物中最重要的是四个镜像文件,它们都位于 /out/target/product/<product_name>/ 目录下;这四个文件是:

system.img:包含了 Android OS 的系统文件,库,可执行文件以及预置的应用程序,将被挂载为根分区。

ramdisk.img:在启动时将被 Linux 内核挂载为只读分区,它包含了 /init 文件和一些配置文件。它用来挂载其他系统镜像并启动 init 进程。

userdata.img:将被挂载为 /data,包含了应用程序相关的数据以及和用户相关的数据

boot.img: 是手机启动所必须加载的文件。简单的说,boot.img包含两部分,分别为kernel ramdisk


七、Android常用编译命令总结  

常用编译命令:makemmmmmmmmammma

lunch命令一样,mmmmmmmmammma命令也分别是由定义在build/envsetup.sh文件中的函数mmmmmm提供的,而这三个函数又都是通过make命令来对源代码进行编译的。事实上,命令m就是对make命令的简单封装,并且是用来对整个Android源代码进行编译,而命令mmmmmmmammma都是通过make命令来对Android源码中的指定模块进行编译。

  1. m:编译所有的模块,与make功能等同;
  2. mm:编译当前目录下的模块,当前目录下需要有Android.mk这个makefile文件,否则就往上找最近的Android.mk文件;
  3. mma:编译当前目录下的模块,并且编译相关的依赖库,如果当前目录新增或删除文件后,可以用mma重新编译;
  4. mmm:编译指定路径下的模块,指定的路径下面需要有Android.mk这个makefile文件;
  5. mmma:编译指定路径下的模块,并且编译相关的依赖库,如果指定目录下新增或删除文件后,可以用mmma重新编译。

        我们经常习惯于使用mmm编译,而6.0以后经常会报依赖库的编译错误,我们可以先使用mmma编译,第二次编译时可以使用mmm编译。


本文只是对Android系统的编译指令作简要介绍,难免存在不足之处。如有任何错误或改进意见,请不吝指正和建议。


http://wed.xjx100/news/268761.html

相关文章

CVE漏洞复现-CVE-2023-32233 NetFilter权限提升

CVE-2023-32233 NetFilter权限提升 Netfilter是Linux 内核中的网络数据包处理框架&#xff08;iptables&#xff09;通过各种规则和过滤器&#xff0c;基于数据包的来源、目标地址、协议类型、端口号等信息&#xff0c;控制网络流量和数据包的转发和处理具体&#xff0c;详情请…

路径规划算法:基于松鼠优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于松鼠优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于松鼠优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法松鼠…

【服务器相关面试题】解析服务器:了解服务器分类、负载均衡和高可用性

服务器精选面试题 1. 什么是服务器&#xff1f; 服务器是一种提供计算资源和服务的计算机系统。它能够接收和处理来自客户端的请求&#xff0c;并向客户端返回相应的数据或服务。 2. 服务器的分类有哪些&#xff1f; 常见的服务器分类包括&#xff1a; 物理服务器&#xf…

阿里P8大佬七天七夜制作这份自动化核心知识点,错过了就是错过了

整理了一份自动化核心知识点。覆盖了web前端基础&#xff0c;HTML标签&#xff0c;CSS样式&#xff0c;自动化测试工具&#xff0c;webdriver环境搭建&#xff0c;元素定位&#xff0c;手机操作系统&#xff0c;移动自动化测试工具&#xff0c;自动化测试的流程与分类&#xff…

被上司问“测得怎么样了?”我心里慌到不行

目录 前言 你测的怎么样了&#xff1f; 这样回答 初入测试职场 结尾&#xff1a; 前言 说实话&#xff0c;我真想从上面去掉"似乎"两个字&#xff0c;软件测试人&#xff0c;就是苦逼&#xff01;有的人曾抱怨过开发很糟糕&#xff0c;但我们没办法要求开发在会写代…

【复变函数笔记】傅里叶变换和拉普拉斯变换

文章目录 一、傅里叶变换和拉普拉斯变换的定义1. 傅里叶积分2. 傅里叶变换3. 单位脉冲函数和单位阶跃函数4. 拉普拉斯变换 二、常见函数的傅里叶变换和拉普拉斯变换三、傅里叶变换和拉普拉斯变换的性质 一、傅里叶变换和拉普拉斯变换的定义 1. 傅里叶积分 傅里叶积分定理 若 …

SQLite简单概述以及使用

SQLite是一种轻量级的关系型数据库管理系统&#xff0c;它不需要独立的服务器进程&#xff0c;也不需要配置多个参数&#xff0c;就可以直接访问一个文件中的数据库&#xff0c;它以C语言库的形式提供了一个嵌入式的数据库引擎&#xff0c;支持SQL语言标准的大部分功能&#xf…

web自动化测试入门篇02——selenium安装教程

1. 目的 web自动化测试作为软件自动化测试领域中绕不过去的一个“香饽饽”&#xff0c;通常都会作为广大测试从业者的首选学习对象&#xff0c;相较于C/S架构的自动化来说&#xff0c;B/S有着其无法忽视的诸多优势&#xff0c;从行业发展趋、研发模式特点、测试工具支持&#x…