androidmake
第一次下载好Android源代码工程后,我们通常是在Android源代码工程目录下执行make命令,经过漫长的等待之后,就可以得到Android系统镜像system.img了。以后如果我们修改了Android源代码中的某个模块或者在Android源代码工程新增一个自己的模块,是不是还是执行make命令呢?答案是否定的,Google为我们准备了另外的命令来支持编译单独的模块,以及重新打包system.img的命令。在继续学习Android源代码之前,就让我们先来看看这个命令吧。
一. 首先在Android源代码目录下的build目录下,有个脚本文件envsetup.sh,执行这个脚本文件后,就可以获得一些有用的工具: USER-NAME@MACHINE-NAME:~/Android$ . ./build/envsetup.sh 注意,这是一个source命令,执行之后,就会有一些额外的命令可以使用: - croot: Changes directory to the top of the tree. - m: Makes from the top of the tree. - mm: Builds all of the moles in the current directory. - mmm: Builds all of the moles in the supplied directories. - cgrep: Greps on all local C/C++ files. - jgrep: Greps on all local Java files. - resgrep: Greps on all local res/*.xml files. - godir: Go to the directory containing a file. 这些命令的具体用法,可以在命令的后面加-help来查看,这里我们只关注mmm命令,也就是可以用它来编译指定目录的所有模块,通常这个目录只包含一个模块。
二. 使用mmm命令来编译指定的模块,例如Email应用程序: USER-NAME@MACHINE-NAME:~/Android$ mmm packages/apps/Email/ 编译完成之后,就可以在out/target/proct/generic/system/app目录下看到Email.apk文件了。Android系统自带的App都放在这具目录下。另外,Android系统的一些可执行文件,例如C编译的可执行文件,放在out/target/proct/generic/system/bin目录下,动态链接库文件放在out/target/proct/generic/system/lib目录下,out/target/proct/generic/system/lib/hw目录存放的是硬件抽象层(HAL)接口文件。
三. 编译好模块后,还要重新打包一下system.img文件,这样我们把system.img运行在模拟器上时,就可以看到我们的程序了。 USER-NAME@MACHINE-NAME:~/Android$ make snod
四. 参照Ubuntu上下载、编译和安装Android最新源代码一文介绍的方法运行模拟器: USER-NAME@MACHINE-NAME:~/Android$ emulator 这样一切就搞定了。
㈡ Android系统编译命令make
在编译Android系统时,需要先执行2条命令,来设置必要的环境变量。
接下来就可以执行make系列命令,来完成不同的需要。
make clean 用来清除编译历史,开始一个全新的编译。
make -j 或 make -j8 启动编译过程。 -j 后面的数字代表要使用的cpu thread的数目。
在完成了全编译后,才能执行生成OTA升级包的操作。
注意事项:
㈢ Android make 基础
Android编译演进过程:
build/ 目录下
source build/envsetup.sh
输入指令hmm 就可以查看信息
lunch 2
通过soong执行编译构建,这里执行make命令时,main.mk文件把一些环境变量和目标都配置好后,会执行envsetup.sh中的make()进行编译。
build/soong/soong_ui.bash --make-mode
------->
soong的编译过程:
soong_ui.bash 调用流程:
可以看到include 了main.mk文件,从main.mk开始,将通过include命令将其所有需要的.mk文件包含进来,最终在内存中形成一个包括所有编译脚本的集合,这个相当于一个巨大Makefile文件。Makefile文件看上去很庞大,其实主要由三种内容构成: 变量定义、函数定义和目标依赖规则,此外mk文件之间的包含也很重要。
5.工具链的关系
REF
https://blog.csdn.net/yiranfeng/article/details/109082489
㈣ Android Makefile中是 如何识别 TARGET_PRODUCT 的
, f Q2 W8 i$ Y# i# make showcommands嵌入式开发联盟; h; Q4 ?. m, q _5 q# f4 N这实际上等价于下面的完整命令 (具体参见 build/core/envsetup.mk ) # TARGET_ARCH=arm TARGET_PRODUCT=generic TARGET_BUILD_TYPE=release make showcommands 可见,默认情况下编译系统认为TARGET_PRODUCT 是generic 的arm,linux,winbond,nuvoton,w90p710,w90n745,开源,嵌入式,操作系统,嵌入式开发,嵌入式联盟,linux,ecos,uclinux,t-kernel,freeos,rtems,ucos,skyeye,6 p) P/ }+ a9 x" e' _/ ]8 l( H8 [, e那如何编译特定产品的Android呢?arm,linux,winbond,nuvoton,w90p710,w90n745,开源,嵌入式,操作系统,嵌入式开发,嵌入式联盟,linux,ecos,uclinux,t-kernel,freeos,rtems,ucos,skyeye,7 n N* t# q" c9 c C% W这就需要查看Android Makefile是如何解析环境变量TARGET_PRODUCT的。 Android Makefile 的引用关系是这样的mcuos.com1 b" z& i3 S. J5 J9 TMakefile -> build/core/main.mk -> build/core/config.mk -> build/core/envsetup.mk -> build/core/proct_config.mk嵌入式开发联盟2 t1 D) I' n) x4 /+ Q# X! D在build/core/proct_config.mk 中编译系统首先调用 build/core/proct.mk中定义的函数get-all-proct-makefiles ,来 遍历整个vendor 的子目录, 找到vendor下所有的 AndroidProcts.mk, 不同子目录下的AndroidProcts.mk 中定义了不同的 PRODUCT_NAME, PRODUCT_DEVICE 等信息,(我们也可以通过 打开build/core/proct_config.mk 中的#$(mp-procts) 语句使控制台编译的时候输出所有proct 的信息) , 接着build/core/proct_config.mk 会调用resolve-short-proct-name 将TARGET_PRODUCT匹配的AndroidProcts.mk 中定义的 PRODUCT_DEVICE 赋值给TARGET_DEVICE。 有了这个TARGET_DEVICE, 再回到 build/core/config.mk, 会include $(TARGET_DEVCIE)/BoardConfig.mk board_config_mk := / $(strip $(wildcard /arm,linux,winbond,nuvoton,w90p710,w90n745,开源,嵌入式,操作系统,嵌入式开发,嵌入式联盟,linux,ecos,uclinux,t-kernel,freeos,rtems,ucos,skyeye,7 s6 h* H) @& B, X. [5 [' t" J& U $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk / vendor/*/$(TARGET_DEVICE)/BoardConfig.mk /- 我们只做简洁、实用、专业的嵌入式开发技术论坛。2 L& f% E. T& M4 S) u))我们只做简洁、专业的嵌入式开发技术论坛。5 }- ~6 j# s8 s/ a* v- iinclude $(board_config_mk)嵌入式开发联盟, [. Z( H) L2 B; s, c而这个配置文件BoardConfig.mk 决定了目标系统编译属性,比如使用ALSA还是不是 GENERIC_AUDIO 等等 另外在这里TARGET_DEVICE 宏也决定了TARGET_DEVICE_DIR, 因为TARGET_DEVICE_DIR 取的是上面提到的BoardConfig.mk 的路径。arm,linux,winbond,nuvoton,w90p710,w90n745,开源,嵌入式,操作系统,嵌入式开发,嵌入式联盟,linux,ecos,uclinux,t-kernel,freeos,rtems,ucos,skyeye,' ~( W" a( p& y9 g- n) A: cTARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk))) 当然Android 的Ob目标输出也是由TARGET_DEVICE决定,见build/core/envsetup.mk TARGET_OUT_ROOT_release := $(OUT_DIR)/target我们只做简洁、专业的嵌入式开发技术论坛。 v( |. V7 ^+ T+ G& mTARGET_OUT_ROOT_debug := $(DEBUG_OUT_DIR)/target TARGET_OUT_ROOT := $(TARGET_OUT_ROOT_$(TARGET_BUILD_TYPE))( ?. c1 J& d) o9 M. [TARGET_PRODUCT_OUT_ROOT := $(TARGET_OUT_ROOT)/proctmcuos.com7 N! X' G9 T7 o& j+ }# |2 S. p# xPRODUCT_OUT := $(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE)嵌入式开发联盟 P& ]2 q" C/ x: ?再回到 build/core/main.mk, 编译系统接着做的一个件事情是,遍历所有字目录,找到所有Android.mk文件,并将这些Android.mk文件include 进来## Typical build; include any Android.mk files we can find.#subdir_makefiles := /我们只做简洁、专业的嵌入式开发技术论坛。% T9 p" L4 e. O6 ?, h" @' @$(shell build/tools/findleaves.py --prune=out --prune=.repo --prune=.git $(subdirs) Android.mk)- 我们只做简洁、实用、专业的嵌入式开发技术论坛。7 N. z& r* z; @! p5 n; {include $(subdir_makefiles)- 我们只做简洁、实用、专业的嵌入式开发技术论坛。0 b% j5 a+ L2 E" r9 R3 v7 m我们再来看其中的 ./build/target/board/Android.mk ,对了它引用了
㈤ 安卓系统(android)怎样才能成功编译安装‘make’命令
tar.gz(bz或bz2等) 一、安装1、打开一个SHELL,即终端2、用cd 命令进入源代码压缩包所在的目录3、根据压缩包类型解压缩文件(*代表压缩包名称) tar -zxvf ****.tar.gztar -jxvf ****.tar.bz(或bz2)4、用CD命令进入解压缩后的目录5、输入编译文件命令:./configure(有的压缩包已经 编译过,这一步可以省去) 6、然后是命令:make 7、再是安装文件命令:make install8、安装完毕如果安装了busybox命令就要这样用: busybox+空格+命令
㈥ 如何在Android系统源码的环境下用make来编译
第一个方法简单点,不过需要在Android系统源码的环境下用make来编译:
1. 在应用程序的AndroidManifest.xml中的manifest节点中加入
android:sharedUserId="android.uid.system"这个属性。
2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行
3. 使用mm命令来编译,生成的apk就有修改系统时间的权限了。
㈦ Android Studio手动配置Makefile、CMake
在Ubutu上编译出来的.so文件,怎么添加到Android项目中去使用呢?目前:可以通过
Makefile方式和CMake方式引入预编译静动态库(静态库.a 动态库.so)到项目中去使用。就目前而言CMake是Goole推荐使用方式,但是加入接手一个老的NDK项目是MakeFile方式,看不懂就GePi了,所以这里我们还是介绍一下MakeFile方式将静动态库加入到AS中,完成NDK项目的开发。废话不多说,直接撸步骤了:
1、在src/main目录下创建一个ndkBuild文件夹
2、在此文件中创建一个Android.mk文件
3、在此文件中创建一个test.c的源文件
4、将编译好的的.so库复制到src/main目录下
如图所示目录结构:
1、编辑Android.mk文件
2、编辑grade(app)文件
3、编辑test.c文件
4、使用编译好的.so库里面的函数
本结果运行在Android 5.1 系统上
再次运行在Android 8.0系统上
看以清楚知道,其实我们的APK包里面就没有libMainTest.so库,所以APP在8.0上会出现奔溃的现象。so...
1、在src/main目录下创建一个cmake文件夹
include:里面包含需要一些头文件
cmakeTest.c:需要编译的源文件
2、在app目录下创建一个文件:CmakeLists.txt
3、编辑grade(app)
4、编辑cmakeTest.c文件
4、引用编译好的libcmakeTest.so
Android 8.0.0系统:
Android 5.1.1系统: