android 高通与MTK编译命令

单独写号的AP文件存放路径,有时客户刷机需要单独写IMEI号就需要用到此文件

alps\out\target\product\projectname\obj\ETC\apdb_intermediates\APDB_MTxxxx_S01__Wxxxx  


检查安装环境:

  在终端执行指令,切换到MTK Android根目录,执行 ./mk check-env

  提示

**********checking Env************
Your building environment is OK
The detail information is in "checkenv.log"!
*************************************************

环境搭建好,只需要执行工程
  编译指令就可以了。

在终端执行 ./mk 工程名 new


如何编译自己修改的源码模块

1).build/envsetup.sh       //进入源码目录,执行源码build目录下的envsetup.sh脚本,使mmm命令有效(此命令要在源码根目录下运行,用来对单个源码模块进行编译)

2)mmm packages/apps/Launcher2/  //编译单个源码模块(目录下要有Android.mk才好编

make -j8 2>&1 | tee -a build-log.txt     全编并打印log

./mk project_name new 2>&1 | tee -a build-log.txt

./mk project_name r 2>&1 | tee -a build-log.txt

make -j8 kernel  2>&1 | tee build-log.txt    单编kernel

如果白天工作下载或是编译代码太浪费时间可以,将任何放在指定时间执行命令自动编译:

sleep 7h && make -j8 2>&1 |tee build-log.txt


在aosp/out/target/common/obj/APPS/DreamCamera2_intermediates/src/R.stamp  每一个项目的资源文件编译后的生成的R文件位置


如果 frameworks/base/services 下有修改,则也要编译

frameworks/base/services/java/ 执行mm 编译  services.jar

./mk mm frameworks/base/services/java

在Android8.0以上平台的每一个模块都会有TEST项目,如果仍用mmm单编模块,是编不成功的,需指明不编译模块下的TEST项目

mmm frameworks/base/packages/SystemUI:SystemUI

准备好编译环境后,编译Android源码的第一步是 source build/envsetup.sh,其中source命令就是用于运行shell脚本命令,功能等价于”.”,因此该命令也等价于.build/envsetup.sh。在文件envsetup.sh声明了当前会话终端可用的命令,这里需要注意的是当前会话终端,也就意味着每次新打开一个终端都必须再一次执行这些指令。起初并不理解为什么新开的终端不能直接执行make指令,到这里总算明白了。

接下来,解释一下本文开头的引用的命令:

source build/envsetup.sh  //初始化编译环境,包括后面的lunch和make指令
lunch  //指定此次编译的目标设备以及编译类型
make  -j12 //开始编译,默认为编译整个系统,其中-j12代表的是编译的job数量为12。

所有的编译命令都在envsetup.sh文件能找到相对应的function,比如上述的命令lunchmake,在文件一定能找到

function lunch(){
    ...
}

function make(){
    ...
}

source envsetup.sh,需要cd到setenv.sh文件所在路径执行,路径可能在build/envsetup.sh,或者integrate/envsetup.sh,再或者不排除有些厂商会封装自己的.sh脚本,但核心思路是一致的。

具体实现这里就不展开说明,下面精炼地总结了一下各个指令用法和功效。

2.1 代码编译

编译指令解释
m在源码树的根目录执行编译
mm编译当前路径下所有模块,但不包含依赖
mmm [module_path]编译指定路径下所有模块,但不包含依赖
mma编译当前路径下所有模块,且包含依赖
mmma [module_path]编译指定路径下所有模块,且包含依赖
make [module_name]无参数,则表示编译整个Android代码
  • mmm:编译指定目录下的模块,不编译它所依赖的其它模块。
  • mma:编译当前目录下的模块及其依赖项。
  • mmma:编译指定路径下所有模块,并且包含依赖。

下面列举部分模块的编译指令:

模块make命令mmm命令
initmake initmmm system/core/init
zygotemake app_processmmm frameworks/base/cmds/app_process
system_servermake servicesmmm frameworks/base/services
java frameworkmake frameworkmmm frameworks/base
framework资源make framework-resmmm frameworks/base/core/res
jni frameworkmake libandroid_runtimemmm frameworks/base/core/jni
bindermake libbindermmm frameworks/native/libs/binder

上述mmm命令同样适用于mm/mma/mmma,编译系统采用的是增量编译,只会编译发生变化的目标文件。当需要重新编译所有的相关模块,则需要编译命令后增加参数-B,比如make -B [module_name],或者 mm -B [module_path]。

Tips:

  • 对于m、mm、mmm、mma、mmma这些命令的实现都是通过make方式来完成的。
  • mmm/mm编译的效率很高,而make/mma/mmma编译较缓慢;
  • make/mma/mmma编译时会把所有的依赖模块一同编译,但mmm/mm不会;
  • 建议:首次编译时采用make/mma/mmma编译;当依赖模块已经编译过的情况,则使用mmm/mm编译。


1.make -jXX
 XX表示数字,这个命令将编译Android系统并生成镜像,XX表示可以使用到的CPU核数,这在配置好的电脑上特别有用,公司的16核ubuntu服务器执行make -j16只要不到20分钟,而双核PC上需要4个小时!
2.make snod
这条命令将重新生成镜像,消耗的时间很少,类似WinCE的makeimg过程,如果你修改了一些数据文件(如音乐、视频)等文件时比较有用。

3.make cts
这条命令将编译CTS套机,编译出的结果放在out目录对应版的data/app目录下面。CTS测试时有用

4.make installclean
这条命令清除out目录下对应板文件夹中的内容,也就是相当于make clean,通常如果改变了一些数据文件(如去掉)、最好执行以下make installclean,否则残留在out目录下的还会被打包进去。
make clean:执行清理操作,等价于 rm -rf out/


5.mm/mm -B
  开发调试中最喜欢这条命令了,在修改了的目录下执行这条命令,就能智能地进行编译,输出的文件在通过adb推送到目标机,可以很方便地调试。

6.make sdk
  这条命令可以生成可发布的SDK,目前还没试过,据说需要JDK1.5

7.make Setting
  可以单独编译setting这个模块,目前还没试,猜想是不是可以单独编译Email、Music这些模块

 

8.make bootimage
用这条命令可以生成boot.img,这个镜像文件中包含Linux Kernel,Ram disk,生成的boot.img只能通过fastboot进行烧写,这在只修改了Linux内核的时候有用

命令格式:./maketek [option] [project] [action] [modules]
Option:
   -t ,-tee :输出log信息到当前终端
   -o , -opt=...: 编译附加条件,使用-opt=TARGET_BUILD_VARIANT=user来编译用户板软件
   -h ,help : 打印帮助信息并退出
Project : 工程名,例如:basicom72_wet_jb3 

Action : 
n , new : 重新编译整个工程
c , clean:清理编译时copy的文件及log信息
r , remake:整个工程检查修改部分并编译
listp , listproject: 查看目前所有的project
codegen : 生成database
nandgen : 生成nand_device_list.h (仅限使用nand flash 时使用)
check-env : 检查编译环境是否OK
check-dep :检查功能依赖性
check-modem :检查modem
update-modem :更新最新的modem.img 到system.img

 编译模块:preloader , uboot ,kernel , android  对应的简写:pl , ub , k , dr  

./mk $project new  首次编译需要写出工程名称,后续可以省略

./mk $project r(n) pl(/ub/k/dr)  remake or new 单个模块,

./mk bootimage/snod/systemimage   打包模块

./mk otapackage     编译制作SD卡系统升级包,生成的zip包在out/target/product/project/目录下

./mk banyan_addon    编译MTK sdk 包

模块修改及对应的编译命令:

修改DWS 后,首先gencode 或者通过命令./mk drvgen 使其生成相应的.h/.c文件,这个文件会被preloader uboot  kernel 调用,因此需要new preloader uboot kernel 而kernel 还需进一步./mkbootimage 打包

打包成boot.img

./mk bootimage   or      make bootimage是一样

   打包生成$PRODUCT_OUT/boot.img

   打包生成$PRODUCT_OUT/ramdisk.img

./mk recoveryimage

   根据依赖会先生成boot.img

   打包生成$PRODUCT_OUT/recovery.img

./mk snod/systemimage-nodeps

   打包生成$PRODUCT_OUT/system.img 但不检查任何依赖性

./mk systemimage

   打包生成$PRODUCT_OUT/system.img 检查任何依赖性

 ./mk cacheimage

   打包生成$PRODUCT_OUT/cache.img

 ./mk userdataimage

    打包生成$PRODUCT_OUT/userdata.img

 ./mk secroimage

    打包生成$PRODUCT_OUT/secro.img


编译系统

Android 编译系统是Android源码的一部分,用于编译Android系统,Android SDK以及相关文档。该编译系统是由Make文件、Shell以及Python脚本共同组成,其中最为重要的便是Make文件。关于编译系统可参考 理解 Android Build 系统

3.1 Makefile分类

整个Build系统的Make文件分为三大类:

  • 系统核心的Make文件:定义了Build系统的框架,文件全部位于路径/build/core,其他Make文件都是基于该框架编写的;
  • 针对产品的Make文件:定义了具体某个型号手机的Make文件,文件路径位于/device,该目录下往往又以公司名和产品名划分两个子级目录,比如/device/qcom/msm8916
  • 针对模块的Make文件:整个系统分为各个独立的模块,每个模块都一个专门的Make文件,名称统一为”Android.mk”,该文件定义了当前模块的编译方式。Build系统会扫描整个源码树中名为”Android.mk”的问题,并执行相应模块的编译工作。

3.2 编译产物

经过make编译后的产物,都位于/out目录,该目录下主要关注下面几个目录:

  • /out/host:Android开发工具的产物,包含SDK各种工具,比如adb,dex2oat,aapt等。
  • /out/target/common:通用的一些编译产物,包含Java应用代码和Java库;
  • /out/target/product/[product_name]:针对特定设备的编译产物以及平台相关C/C++代码和二进制文件;

在/out/target/product/[product_name]目录下,有几个重量级的镜像文件:

  • system.img:挂载为根分区,主要包含Android OS的系统文件;
  • ramdisk.img:主要包含init.rc文件和配置文件等;
  • userdata.img:被挂载在/data,主要包含用户以及应用程序相关的数据;

当然还有boot.img,reocovery.img等镜像文件,这里就不介绍了。

3.3 Android.mk解析

在源码树中每一个模块的所有文件通常都相应有一个自己的文件夹,在该模块的根目录下有一个名称为“Android.mk” 的文件。编译系统正是以模块为单位进行编译,每个模块都有唯一的模块名,一个模块可以有依赖多个其他模块,模块间的依赖关系就是通过模块名来引用的。也就是说当模块需要依赖一个jar包或者apk时,必须先将jar包或apk定义为一个模块,然后再依赖相应的模块。

对于Android.mk文件,通常都是以下面两行

LOCAL_PATH := $(call my-dir)  //设置当编译路径为当前文件夹所在路径
include $(CLEAR_VARS)  //清空编译环境的变量(由其他模块设置过的变量)

为方便模块编译,编译系统设置了很多的编译环境变量,如下:

  • LOCAL_SRC_FILES:当前模块包含的所有源码文件;
  • LOCAL_MODULE:当前模块的名称(具有唯一性);
  • LOCAL_PACKAGE_NAME:当前APK应用的名称(具有唯一性);
  • LOCAL_C_INCLUDES:C/C++所需的头文件路径;
  • LOCAL_STATIC_LIBRARIES:当前模块在静态链接时需要的库名;
  • LOCAL_SHARED_LIBRARIES:当前模块在运行时依赖的动态库名;
  • LOCAL_STATIC_JAVA_LIBRARIES:当前模块依赖的Java静态库;
  • LOCAL_JAVA_LIBRARIES:当前模块依赖的Java共享库;
  • LOCAL_CERTIFICATE:签署当前应用的证书名称,比如platform。
  • LOCAL_MODULE_TAGS:当前模块所包含的标签,可以包含多标签,可能值为debgu,eng,user,development或optional(默认值)

针对这些环境变量,编译系统还定义了一些便捷函数,如下:

  • $(call my-dir):获取当前文件夹路径;
  • $(call all-java-files-under, ):获取指定目录下的所有Java文件;
  • $(call all-c-files-under, ):获取指定目录下的所有C文件;
  • $(call all-Iaidl-files-under, ) :获取指定目录下的所有AIDL文件;
  • $(call all-makefiles-under, ):获取指定目录下的所有Make文件;

示例:

  LOCAL_PATH := $(call my-dir)
  include $(CLEAR_VARS)
  # 获取所有子目录中的Java文件
  LOCAL_SRC_FILES := $(call all-subdir-java-files)
  # 当前模块依赖的动态Java库名称
  LOCAL_JAVA_LIBRARIES := com.gityuan.lib
  # 当前模块的名称
  LOCAL_MODULE := demo
  # 将当前模块编译成一个静态的Java库
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值