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

news2024/12/23 9:40:51

目录

一、编译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-user

add_lunch_combo xxxx-userdebug

add_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://www.coloradmin.cn/o/617342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

裸辞3个月没工作,害怕面试,害怕HR问我的问题,怎么办?

其实裸辞最大的伤害就是很容易导致自己的不自信。 现在可能就是你的低谷期&#xff0c;你需要做的是什么呢&#xff0c;丰富自己。 你要相信&#xff0c;你只是太久没有面试过&#xff0c;生疏了而已。 今天小月带你回到面试场&#xff0c;找回面试最纯正的感觉&#xff01; 面…

火龙果MM32F3273G8P开发板MindSDK开发教程1 - 点亮LED

火龙果MM32F3273G8P-MindSDK开发教程1-点亮LED 1、登录官网下载对应的MindSDK固件 https://mindsdk.mindmotion.com.cn/&#xff0c;然后注册下载mm32F3270的固件即可。 下载完的文件为 plus-f3270_mdk.zip 解压后的文件路径如图&#xff1a; 2、新建LED工程 将下载的plu…

基于张量补全的交通数据复原文献汇总(最新)

由于传感器故障和通信故障等因素导致的交通数据缺失严重制约了ITS的发展与应用。如何准确、高效地恢复缺失数据已成为ITS的一个关键问题。近年来&#xff0c;LRTC&#xff08;低秩张量补全&#xff09;的方法已被广泛应用于交通数据补全。本文将介绍几篇最新的关于交通数据补全…

python3 爬虫相关学习7:初步摸索使用 BeautifulSoup

1 一个爬图片pic的代码的例子 下面这段是爬一些图片pic的代码学写了一段bs的代码&#xff0c;但是马上报错 #E:\work\FangCloudV2\personal_space\2learn\python3\py0001.txtimport requests from bs4 import BeautifulSoupurl"https://movie.douban.com/celebrity/10115…

搭建个人博客

个人网站用处有很多&#xff0c;可以写博客来记录学习过程中的各种事&#xff0c;不管是新知识还是踩坑记录&#xff0c;写完就丢在网站上&#xff0c;方便日后复习&#xff0c;也可以共享给他人&#xff0c;让其他人避免踩雷。 当然也不仅限于技术性的文章&#xff0c;生活中有…

隐马尔可夫模型在数学建模中的应用及MATLAB实现

2023年9月数学建模国赛期间提供ABCDE题思路加Matlab代码,专栏链接(赛前一个月恢复源码199,欢迎大家订阅):http://t.csdn.cn/Um9Zd 目录 2023年9月数学建模国赛期间提供ABCDE题思路加Matlab代码,专栏链接(赛前一个月恢复源码199,欢迎大家订阅):http://t.csdn.cn/Um9Zd 隐马尔可…

(二)CSharp-数据类型

一、数据类型 1、C#程序是一组类型声明 C 程序是一组函数和数据类型C 程序是一组函数和类C# 程序是一组类型声明 2、类型是一种模板 类型由下面的元素定义&#xff1a; 名称用于保存数据成员的数据结构一些行为及约束条件 3、实例化类型 从某个类型模板创建实际的对象&am…

完败!资深码农 VS 新手+AI;阿里云AI黑客松千万奖金池;手把手教你用AI写小说;微软AI入门课 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 阿里云首届AI黑客马拉松&#xff0c;共享 1000 万美元风投资金池 阿里云官方宣布&#xff0c;将以国内最大AI模型社区「Model Scope 魔…

基于双视角图表示算法的双向人职匹配偏好建模推荐系统构建

基于双视角图表示算法的双向人职匹配偏好建模推荐系统构建 文章目录 基于双视角图表示算法的双向人职匹配偏好建模推荐系统构建1. 传统推荐系统模型2. 协同过滤算法3. 基于双视角图表示学习算法的模型构建3.1 数据输入3.2 双视角交互图的构建3.3 混合偏好传播策略3.4 对于双向意…

H5项目怎么打包成APP

文章目录 前言一、新建5APP项目二、删除不需要的文件三、将H5打包的文件拷贝到当前目录下四、配置APP五、发行-云打包六、安装apk总结 前言 开发uni-app的编辑器HBuilderX可以将H5项目打包成APP&#xff0c;相信很多小伙伴还不知道这个功能&#xff0c;下面将介绍下如何将H5打…

linux MMU内存管理单元

本篇文章简要阐述MMU的概念&#xff0c;以及以段地址的转换过程为例&#xff0c;简单说明MMU将虚拟地址转换成物理地址的过程。更多详细内容请查看《ARM-MMU(中文手册).pdf》。 1、MMU概述 在ARM存储系统中&#xff0c;使用MMU实现虚拟地址到实际物理地址的映射。为何要实现这…

人工智能学习07--pytorch21--目标检测:YOLO系列理论合集(YOLOv1~v3)

如果直接看yolov3论文的话&#xff0c;会发现有好多知识点没见过&#xff0c;所以跟着视频从头学一下。 学习up主霹雳吧啦Wz大佬的学习方法&#xff1a; 想学某个网络的代码时&#xff1a;到网上搜这个网络的讲解 → 对这个网络大概有了印象 → 读论文原文&#xff08; 很多细…

Django实现接口自动化平台(五)httprunner(4.x)介绍【持续更新中】

上一章&#xff1a; Django实现接口自动化平台&#xff08;四&#xff09;解决跨域问题【持续更新中】_做测试的喵酱的博客-CSDN博客 下一章&#xff1a; 一、httpruner介绍 1.1 背景&#xff1a; 之所以学习httpruner的用法&#xff0c;是要把httpruner嵌入我们的自动化平…

全网最全、最新MyBatis框架核心知识

MyBatis框架 1. 软件开发常用结构 MyBatis是操作数据库的&#xff0c;相当于是一个增强的JDBC 1.1 三层架构 三层架构包括&#xff1a; 界面层&#xff08;User Interface layer&#xff09;业务逻辑层&#xff08;Business Logic Layer&#xff09;数据访问层&#xff08;Dat…

Window搭建IOS App自动化测试环境

平台搭建&#xff1a;tidevice&#xff08;Windows逆向通信iOS工具&#xff09;WebDriverAgent&#xff08;iOS通信服务&#xff09;facebook-wda&#xff08;iOS测试框架&#xff09; macOSXcode&#xff1a;在手机上安装WebDriverAgent的时候需要用到&#xff0c;必须要Xcod…

HDFS概述及其优缺点

什么是HDFS&#xff1f; HDFS的全称是hadoop distributed file system&#xff0c;即hadoop的分布式文件系统。 见名知意&#xff0c;它就是用来进行文件存储的。毕竟它是大数据的一个组件&#xff0c;用来存储这种海量的数据。 它是基于03年10月份&#xff0c;谷歌发表的GFS…

Hadoop 怎么委任和解除节点?

前言 本文隶属于专栏《大数据技术体系》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见大数据技术体系 正文 Hadoop 集群的管理员经常需要向集群中添加节点…

Android Studio引用第三方库的方式

title: 大小端详解 date: 2023-06-06 21:01:24 comments: true #是否可评论 toc: true #是否显示文章目录 categories: #分类 - gradle - android studio tags: #标签 - gradle - android studio summary: android stduio 导入第三方库方式 Android Studio引用第三方库的方式 …

NCUTer 我的创作纪念日(2023-06-06)

前言 大家好&#xff0c;我是NCUTer&#xff0c;今天收到私信&#xff0c;突然发现&#xff0c;我来到CSDN已经2年多了&#xff0c;距离发布第一篇博客已经2年整了。正式规划性的写博客&#xff0c;是在2021年6月底开始的&#xff0c;当时啥也不懂&#xff0c;不知道该怎么去做…

10万字XX市开发区智慧综治中心平台建设一期工程招标文件word

&#xff08;一&#xff09;智慧综治中心信息化平台 需基于“一个平台&#xff0c;多级用户”的原则&#xff0c;利用移动互联网、物联网、大数据、人工智能和地理信息等新一代信息技术&#xff0c;整合辖区多方社会治理数据&#xff0c;建立一个覆盖全区三级综治中心用户的统一…