Android之路

导航

Android 源码下相关编译命令及刷机

    从事Android源码开发,对于Android Build系统下的常用编译命令必须熟悉,现列出常用的一些命令。而关于Android Build系统的详细介绍请参看https://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/

    引用上述链接中的两段话,介绍一下Android Build系统:

整个 Build 系统中的 Make 文件可以分为三类:

[1] Build 系统核心文件,此类文件定义了整个 Build 系统的框架,而其他所有 Make 文件都是在这个框架的基础上编写出来的。
Build 系统核心文件全部位于 /build/core目录下
[2] 针对某个产品(一个产品可能是某个型号的手机或者平板电脑)的 Make 文件,这些文件通常位于 device 目录下,该目录下又以公司名以及产品名分为两级目录
[3] 针对某个模块(关于模块后文会详细讨论)的 Make 文件。整个系统中,包含了大量的模块,每个模块都有一个专门的 Make 文件,这类文件的名称统一为“Android.mk”,
该文件中定义了如何编译当前模块。Build 系统会在整个源码树中扫描名称为“Android.mk”的文件并根据其中的内容执行模块的编译。

整个 Build 系统的入口文件是源码树根目录下名称为“Makefile”的文件,当在源代码根目录上调用 make 命令时,make 命令首先将读取该文件。
Makefile 文件的内容只有一行:“include build/core/main.mk”。该行代码的作用很明显:包含 build/core/main.mk 文件。在 main.mk 文件中又会包含其他的文件,
其他文件中又会包含更多的文件,这样就引入了整个 Build 系统。

 1、编译整个Android系统:

source build/envsetup.sh          //初始化编译环境,并引入一些辅助的shell函数

lunch  XXX               //编译选项,不同的项目不同

make -j8                //开启8个线程编译,可任选,具体根据编译服务器的核数而定

//上述编译后,还需要编译modem,一般需要先切换至modem目录,然后执行相关脚本,不同项目也不同。
//需要说明的是,不编译modem或者modem编译失败,并不影响单独模块的编译;但可能会影响到刷机.

以下列出envsetup.sh中定义的常用函数,即命令如下:

名称             说明
croot          切换到源码树的根目录            

m             在源码树的根目录执行 make
mm            Build 当前目录下的模块
mmm           Build 指定目录下的模块

mma            编译当前目录下的模块及其依赖项
mmma            编译指定目录下的模块及其依赖项

cgrep             在所有 C/C++ 文件上执行 grep
jgrep             在所有 Java 文件上执行 grep
resgrep          在所有 res/*.xml 文件上执行 grep
godir            转到包含某个文件的目录路径
printconfig      显示当前 Build 的配置信息
add_lunch_combo    在 lunch 函数的菜单中添加一个条目 

2、常用的make 目标:

make help             显示主要的make目标

make clean             清理,等同于 rm -rf out/

make sdk            编译出 Android 的 SDK。

make clean-sdk         清理 SDK 的编译产物 

make update-api        更新API,    在 framework API 改动之后,需要首先执行该命令来更新 API,公开的 API 记录在frameworks/base/api 目录下

make bootimage         生成boot.img
    
make recoveryimage     生成recovery.img

make userdataimage     生成userdata.img

make cacheimage        生成cache.img

make systemimage      生成system.img

3、产品的编译类型:

eng:工程机
user:最终用户机
userdebug:调试测试机
tests:测试机

4、单独编译某个模块:

(1)cd到模块目录(含有Android.mk),然后执行命令:mm

(2)有些模块调用了系统的一些hide函数,因此需要在根目录下编译:make XXX ; 否则编译不过,例如SystemUI.

将编译好的模块(也就是apk),push到设备上的步骤如下:以图库模块为例。

//若设备还未root,可执行下述两个命令
adb root        
adb remount


//执行push
adb push ...    /system/app/Gallery2/  

5、刷机:三种方式。

(1)使用平台提供的刷机软件exe,(可视化的用户界面)进行刷机。

(2)使用命令:

adb reboot edl       //进入刷机模式,     非高通平台可能无效

在命令行切换目录至modem/fastboot;  点击update_all.bat运行即可

(3)使用命令,根据需要烧录指定镜像img或者所有img.(这些img在out/target/product/...目录下),烧录一个文件的命令如下,其他同理:

adb reboot bootloader        //进入fastboot模式

fastboot flash system system文件【system.img文件全路径】

fastboot reboot            //重启设备

使用命令行刷机,可能出现的问题:

例如:以system.img为例.

fastboot flash system ...

sending 'system' (1048262 KB)...
FAILED (remote: data too large)
finished. total time: 0.016s

刷机出现上述问题,原因:
fastboot.exe版本太低,在sdk/platform-tools/下更新fastboot.exe

6、其他刷机命令:

(1)http://bbs.zol.com.cn/sjbbs/d1763_170025.html

 

posted on 2019-07-30 14:36  Android之路  阅读(1297)  评论(0编辑  收藏  举报