【Android7.1.2源码解析系列】android init目录下的Android.mk编译文件分析

[android源码分析]bluetoothd service的启动的总体流程分析 本篇文章将会从总体流程上解释一下每一个函数的意义,具体的每一个函数的解释将是一个很长的过程,后面的文章中我将会针对每一个有意义的函数来具体分析。 在具体分析bluetoothdservice的启动之前,我们先来看一下bluetoothd service究竟是什么,他同样定义在init.rc中: servicebluetoothd /system/bin/bluetoothd -n 阅读详情

上一篇文章对于源码中的安卓编译系统文档进行了翻译,本文就以android当中的init模块作为例子,对其中的Android.mk文件进行分析,读者可以在阅读本文的同时查看我的译文:http://blog.youkuaiyun.com/class_brick/article/details/70859809。

 

总的来说,init模块中的Android.mk文件主要进行了 个流程的操作:

1、设置本模块名称

2、清理LOCAL_变量

3、设置LOCAL_变量,包括编译的内容、方式、选项等

4、执行编译

5、设置其他模块对于init的联系并编辑

 

以上前四步是Android.mk文件的通常流程,在阅读其他文件时,也可以按照这样的思路。

 

文件位于/system/core/init/文件不大,只有75行:

 

# Copyright 2005 The Android Open Source Project

 

#第一行,为LOCAL_PATH进行赋值,实际上的值就是当前Android.mk所在的目录,即为#/system/core/init/。

LOCAL_PATH:= $(call my-dir)

#第二行,清除除了LOCAL_PATH之外的所有LOCAL_前缀的变量

include $(CLEAR_VARS)

 

#第三行,对于LOCAL_SRC_FILES进行赋值,指定需要编译的.cpp/.c/.y/.l/.java文件

LOCAL_SRC_FILES:= \

builtins.c \

init.c \

devices.c \

property_service.c \

util.c \

parser.c \

keychords.c \

signal_handler.c \

init_parser.c \

ueventd.c \

ueventd_parser.c \

watchdogd.c

 

#第四行,对于LOCAL_CFLAGS进行赋值,指定c/c++编译器的额外标签,相当于在编译时执

#行gcc *.c -Wno-unused-parameter,作用是忽略未使用参数的警告

LOCAL_CFLAGS    += -Wno-unused-parameter

 

#第五行,如果INIT_BOOTCHART的值为true,就编译bootchart.c与加入编译命令#-DBOOTCHART=1,bootchart的作用是对android的开机性能进行分析,默认是关闭的

ifeq ($(strip $(INIT_BOOTCHART)),true)

LOCAL_SRC_FILES += bootchart.c

LOCAL_CFLAGS    += -DBOOTCHART=1

endif

 

#第六行,如果编译目标是userdebug或者eng,就加入编译选项允许设置selinux的开关

ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))

LOCAL_CFLAGS += -DALLOW_LOCAL_PROP_OVERRIDE=1 -DALLOW_DISABLE_SELINUX=1

endif

 

# Enable ueventd logging

# 第七行,直译,允许ueventd记录日志

#LOCAL_CFLAGS += -DLOG_UEVENTS=1

 

# 第八行,设置本模块的名称为init

LOCAL_MODULE:= init

 

# 第九行,设置init模块可以被静态链接

LOCAL_FORCE_STATIC_EXECUTABLE := true

# 第十行,将编译后的此模块放到TARGET_ROOT_OUT目录下,TARGET_ROOT_OUT的值在编译时的

# envsetup.sh脚本中被设置,值为out/target/product/xxx/root

LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)

# 第十一行,编译后的没有经过符号剥离的目标路径

LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_UNSTRIPPED)

 

# 第十二行,init模块需要的静态库列表

LOCAL_STATIC_LIBRARIES := \

libfs_mgr \

liblogwrap \

libcutils \

liblog \

libc \

libselinux \

libmincrypt \

libext4_utils_static \

libsparse_static \

libz

 

# 第十三行,额外的依赖项,表示必须该目录下必须存在Android.mk文件(悖论?)

LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.mk

 

# 第十四行,将init模块编译成可执行文件

include $(BUILD_EXECUTABLE)

 

# Make a symlink from /sbin/ueventd and /sbin/watchdogd to /init

# 第十五行,直译,设置/sbin/ueventd和/sbin/watchdogd到/init的符号链接

SYMLINKS := \

$(TARGET_ROOT_OUT)/sbin/modprobe \

$(TARGET_ROOT_OUT)/sbin/ueventd \

$(TARGET_ROOT_OUT)/sbin/watchdogd

 

 

# 这里涉及到makefile文件的语法,简单的描述一下, 通常的形式是:

# 变量1 : 变量2

# 命令

# 含义:

# 代表变量1的生成需要变量2,如果变量2中的内容有任何一个比变量1要新的话

# 就执行命令中的内容

# 所以接下来的含义就是SYMLINKS中的内容将会依赖于init模块

# 并在init模块更新之后执行接下来的四行命令

$(SYMLINKS): INIT_BINARY := $(LOCAL_MODULE)

$(SYMLINKS): $(LOCAL_INSTALLED_MODULE) $(LOCAL_PATH)/Android.mk

@echo "Symlink: $@ -> ../$(INIT_BINARY)"

@mkdir -p $(dir $@)

@rm -rf $@

$(hide) ln -sf ../$(INIT_BINARY) $@

 

ALL_DEFAULT_INSTALLED_MODULES += $(SYMLINKS)

 

# We need this so that the installed files could be picked up based on the

# local module name

# 第十六行,直译,我们需要通过这个来基于init模块名称的找到已安装文件

ALL_MODULES.$(LOCAL_MODULE).INSTALLED := \

    $(ALL_MODULES.$(LOCAL_MODULE).INSTALLED) $(SYMLINKS)

 

Anbox编译实战:CMake与Android.mk常见错误排查指南 CMake作为跨平台构建系统生成器,是现代C++项目构建的标准工具,它通过解析CMakeLists.txt文件生成平台特定的构建脚本。Android NDK则提供了Android.mk这一基于GNU Make的构建系统,用于编译原生代码。在Linux系统上实现Android应用兼容性时,常需同时处理这两种构建系统,其技术价值在于能够高效集成Android运行时环境而不依赖硬件虚拟化。应用场景包括嵌入式系统、容器化Android环境以及定制化ROM开发。本文聚焦于Anbox项目编译过程中CMake依赖缺失、版 阅读详情

相关推荐

Android 系统启动流程源码分析

servicemanager用来管理系统中所有的binder service,不管是本地的c++实现的还是java语言实现的都需要这个进程来统一管理,最主要的管理就是,注册添加服务,获取服务。进入的代码位置为:frameworks\base\core\java\com\android\internal\os\ZygoteInit.java。通过上面的共享库和资源加载preload(),整个虚拟机的资源都是共享的,当有fork出其他的虚拟机时候,就可以节省资源了,提高了效率!此异常是在哪里处理的呢?

结合项目案例,记录点点滴滴,自己回顾,分享他人o__o 9703

android10 c语言测试字符设备程序

高通平台上测试spi字符设备程序,如下: #include <stdint.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <getopt.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/ioctl.

iisktz的专栏 396

绿盾注册机 使用手册

在很多涉及工程设计的单位(如建筑、模具、电路、广告等),电子图纸的应用极为普遍,而电子图纸的丢失、被盗对企业利益的影响是显而易见的,如果被竞争对手获取,甚至可能造成致命的打击。因此,对于这类企业,电子图纸的保密显得至关重要。绿盾信息安全管理软件充分考虑了电子图纸的各种可能传播途径,制定了针对性的解决方案,从而保证了电子图纸的安全。 我们总结了电子图纸的各种传播途径以及相应的对策,有如下几点:

998

Android.mk 变量

Android.mk 变量 (1)LOCAL_------这些变量在每个模块中都被设置。他们被命令include $(CLEAR_VARS)清理,所以你可以在包含include $(CLEAR_VARS)命令后,相信他们是空的。在你会使用的大多数的模块中的大多数变量都是LOCAL_变量。(2)PRIVATE_------这些变量是编译指定目标的变量。那意味着他们只在特定模块的命令当中是有用的。这也...

nwpushuai的博客 1723

软件工程期末知识点总结【超详细】

生命周期模型(过程模型):瀑布模型、快速原型模型、增量模型、螺旋模型、喷泉模型。2、实体联系图:1、数据对象2、属性3、联系(1:1、1:N、M:N)3、语句覆盖 就是设计足够的调试用例,使得程序中的每个语句至少执行一次。 5、判定覆盖就是设计足够的测试用例,使得程序中每个判定的取“真”分支和取“假”分支至少都执行一次,判定覆盖又称分支覆盖 6、条件覆盖就是设计足够的测试用例,使得程序判定中的每个条件能获得各种可能的结果。7、软件开发时期通常分成4个阶段:总体设计、详细设计、编码和单元测试、综合测试。

这个人好有趣....hh 1万+

【华为鸿蒙3.0/荣耀安卓12使用VMOS Pro的激活方式】

解压激活工具 →连接数据线 轻松搞定激活!

Amy_mumu的博客 142万+

android build system

The build system looks at LOCAL_SRC_FILES to know what source files to compile -- .cpp .c .y .l .java. For lex and yacc files, it knows how to correctly do the intermediate .h and .c/.cpp files automa

Aaronzzq的专栏 1032

Transformer凭什么取代RNN?深入拆解自注意力机制与梯度消失问题的终极对决

本文深入探讨了Transformer如何通过自注意力机制解决RNN的梯度消失问题,成为自然语言处理领域的新标准。通过对比RNN和Transformer的架构差异,揭示了自注意力机制在并行计算、长期依赖处理等方面的技术优势,并提供了实际任务中的性能对比数据。

f6g7h8i9j的博客 190

(DRM) Direct Rendering Manager 学习

(DRM)Direct Rendering Manager 学习

qq_42538455的博客 377

基于FPGA的TDC延迟链优化与码密度校准方法(1)——原理与实现

本文深入探讨了基于FPGA的时间数字转换器(TDC)延迟链非均匀性问题及其码密度校准方法。通过分析工艺偏差、温度电压影响等根源,详细介绍了码密度测试原理、逐位校准技术及气泡消除算法,并分享了自适应校准策略与多场景应用实践,有效提升TDC测量精度至皮秒级。

kiwi8的博客 488

看懂 SAP S/4HANA 产品主数据里的 GTIN:一串号码背后的全球商品识别与业务协同

SAP S/4HANA中的GTIN管理是企业供应链运营的关键环节。本文深入解析GTIN的业务内涵及其在SAP系统中的实现方式:1) GTIN是全球通用的商品标识码,不同于企业内部物料编码;2) SAP主数据中GTIN与计量单位强绑定,需为不同包装层级维护独立GTIN;3) 同一产品可能因渠道、供应商差异存在多个GTIN;4) GTIN贯穿零售POS、仓储管理、EDI订单等核心业务流程;5) 通过典型案例说明错误维护GTIN将导致收银异常、仓库作业低效等运营问题。文章强调GTIN管理需结合包装层级、计量单位等

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1433

嵌入式Android开发 系统层 busybox 工具的导入使用 选配了 ntpd ftpd

busybox导入嵌入式Android系统。

weixin_43522377的博客 1220

文章ACCEPT之后填写内容教程-Springer-Verlag即施普林格

1. 确认corresponding author通讯作者机构是否正确(最好细分到系,如搜不到系只填大学也可)这些信息因为在投稿的时候都填过,所以一般都没问题,可确认并继续。2. Co-Author: 这篇文章有没有其他作者,如果有就选yes,并确认投稿时所填的作者姓名和机构是否正确。这个也是如果前期都填对了就不用修改。3. Research funders: 问文章的研究有没有资助,没有就选no,有就选yes,并填写机构名称和grant/contact numbers。

ZhangJiqun&191cm&85kg 4786

Android启动init.rc与Android.mk简单介绍

init  init是Linux系统中用户空间的第一个进程。也是Android中第一个被启动得进程。 内核启动过程: start_kernel()-> init_post()-> run_init_process() ->启动init.  init的pid为0,它通过解析init.rc脚本构建出系统的初始运行形态,很多其他的系统服务是在这个init.rc脚本中描述并启动。  关于init.

My Way 1108

基于Python的二手奢侈品电商平台商品保值率数据爬取与分析

本文旨在探讨如何利用Python网络爬虫技术获取二手奢侈品电商平台商品数据,并通过数据分析研究奢侈品的保值率特性。研究将使用最新的爬虫技术(包括Playwright、异步处理和数据清洗技术)来高效获取数据,并利用Pandas、Matplotlib等数据分析库进行深入的数据可视化分析。本文详细介绍了爬虫的设计思路、实现过程以及数据分析方法,为奢侈品投资和消费提供数据参考。关键词:Python爬虫、奢侈品保值率、数据分析、Playwright、异步处理。

2201_76125261的博客 512

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android.bp 语法,设置-g, debug,android.mk 编译 debug 版本

同时,Android.mk可以引用Android.bp中的模块,反之Android.bp不能引用Android.mk中的模块。name :编译出的模块的名称,类似于Android.mk中的LOCAL_MODULE。cflags:编译flag,类似于Android.mk中的LOCAL_CFLAGS。srcs:源文件,类似于Android.mk中的LOCAL_SRC_FILES。Android.bp使用单行注释//和多行注释/* */两种方式。

sun007700的专栏 1706

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Android.mk 绑定.rc和二进制

引言:需求如下,有一个二进制Service服务,比如叫CarplaySevice,他的具体作用就是一个后台Service,但是需要在系统开机之后被调用起来。 因为.rc文件的特性,所以我们就采用rc文件来启动,其实本来就是用rc文件来启动CarplayService 的,只不过之前是手动启动,用户是肯定不能自己去输入命令的,所以就需要自动绑定并启动该Service 以下总结了2种方法: 方法1:是...

唯爱丶卡卡西的博客 1461

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Android init源代码分析(1)概要分析

功能概述 init进程是Android内核启动的第一个进程,其进程号(pid)为1,是Android系统所有进程的祖先,因此它肩负着系统启动的重要责任。Android的init源代码位于system/core/init/目录下,伴随Android系统多个版本的迭代,init源代码也几经重构。 目前Android4.4源代码中,init目录编译后生成如下Android系统的三个文件,分别是

Prife的专栏 3722

Android.mk文件模板

Android.mk文件是告知NDK Build System关于Source的信息。 Android.mk是GNU Makefile的一部分,将被Build System解析一次或多次。 # 1.必须以LOCAL_PATH开头,用于在开发树种查找源文件 # 2.my-dir为宏,由编译系统提供,返回包含Android.mk文件的目录路径 LOCAL_PATH := $(call my-dir...

Less is More 571

Android系统编译小总结

Android系统编译简介搭建编译环境系统编译命令常见小知识点Android编译版本Android.mk文件编译系统中的变量和宏native layer编译碰到的问题安装lib32bz2-1.0出问题add-apt-repository命令不存在Jack server installation not foundsubcommand failed问题内核目录下存在.config文件导致编译错误输出目录中的重要目录编译模块系统属性相关目标和依赖文件的定义打包新添加的模块至system.img 简介 Andro

weixin_41388144的博客 1119

Android 系统源码-1:Android 系统启动流程源码分析

现在我们来梳理下 Android 系统的启动过程。Android 启动过程还是比较重要的,因为在这个过程中除了要完成 Linux 系统的初始化工作还要完成 Android 的基础服务和启动界面的初始化工作。 在这篇文章中,我们不打算过多深入源码。因为 Android 中任何一个功能模块在 Framework 层都涉及大量的代码调用。过多深入源码只会让我们迷失在一层层的调用栈中。相比之下,我更倾向于...

你好,开发者 1302

Android 7系统编译与刷机(一)源码环境搭建与完整编译流程

Android 7系统编译与刷机(一):源码环境搭建与完整编译流程 本文是Android 7系统编译与刷机系列的首篇,重点讲解源码环境搭建与完整编译流程。主要内容包括: 学习编译流程的重要性:解决日常开发中全编耗时、镜像打包机制不明、分区表配置等实际问题。 编译环境准备: 硬件要求:150GB硬盘空间,16GB内存(解决jack-server OOM问题) 操作系统:推荐Ubuntu 14.04/16.04 JDK版本:必须使用OpenJDK 8 源码下载: 使用清华镜像站加速下载 Repo工具解析及多仓库

AfinalStone的专栏 252

Anbox编译实战:解决CMake与Android.mk混合构建的常见错误

在Linux系统上构建Android运行时环境,常涉及CMake与Android.mk(ndk-build)两种构建系统的混合使用。CMake以其跨平台和模块化优势,负责管理项目的主体架构和平台无关代码;而Android.mk则是Android原生开发的核心,专门处理深度依赖AOSP框架、Bionic C库及Binder等系统服务的组件。这种混合模式在实现跨平台兼容性与利用Android原生能力方面具有重要技术价值,尤其适用于容器化Android运行时、系统服务模拟等场景。然而,工具链不一致、头文件路径冲突

weixin_30700977的博客 371

android目录

不同的用户会把各自的数据和应用存储/安装在 /data/user/用户号/(用户号从 0 开始顺序编号,0 ,1...)下的各个目录中,系统运行时,把 /data/data 下的对应目录做符号链接,使之指向 /data/user/用户号/ 下的对应目录,以这种方式让 Android 系统能支持“多用户”。:存放了多个 XML 文件,每个 XML 文件规定了个内置应用(不论是 AOSP 的还是厂商提供的〕的权限,它会被 PackageManager 使用。:文件系统是用于(输出)内核级的调试信息的。

sun007700的专栏 1592

浅谈android源码之out

文章目录1. 前言2. 目录结构 1. 前言 Android源码中的out目录一开始是不存在的,是在我们执行编译操作之后才由系统自动生成,了解out目录对系统开发是必经之路。 2. 目录结构 属性 目录 媒体 ...

生于忧患,死于安乐 1575

Android基础知识学习

一. ./build/envsetup.sh分析 加载编译命令; 加载平台信息;

溯源守拙的博客 1688
上一篇: Android编译时TARGET_OUT_ROOT/TARGET_OUT变量的由来
下一篇: android init.c
class_brick
博客等级 码龄12年 223粉丝 76原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值