android编译笔记

一、编译框架层和系统运行库源码,APK

1 m mm mmm 命令

android源码目录下的build/envsetup.sh文件,描述编译的命令

- m:       Makes from the top of the tree. 
- mm:      Builds all of the modules in the current directory. 
- mmm:     Builds all of the modules in the supplied directories. 

要想使用这些命令,首先需要在android源码根目录执行. build/envsetup.sh 脚本设置环境
m:编译所有的模块 
mm:编译当前目录下的模块,当前目录下要有Android.mk文件 
mmm:编译指定路径下的模块,指定路径下要有Android.mk文件 

下面举个例子说明,假设我要编译android下的\hardware\libhardware_legacy\power模块,当前目录为源码根目录,方法如下: 
1、. build/envsetup.sh 
2、mmm hardware/libhardware_legacy/power/ 
或者 : 
1、. build/envsetup.sh 
2、cd hardware/libhardware_legacy/power/ 
3、mm 

注意 mmm和mm命令必须在执行“.build/envsetup.sh”之后才能使用,并且只编译发生变化的文件。如果要编译模块的所有文件,需要-B选项,例如mm  -B

2 make 命令

2.1 make 模块名

这种方法适合第一次编译,会把依赖模块一并编译。它需要在全部源代码中找到编译模块的Android.mk文件,并检查依赖模块是否有修改,因此编译时间较长。使用这种方法,我们只需要搜索源码目录下的Android.mk文件,找到模块名,然后指定给make即可。

(1)编译应用层源码

对于应用层程序,需要查看Android.mk文件的LOCAL_PACKAGE_NAME变量。

例如,要编译Phone应用程序的源码,先查看Phone的Android.mk文件,在终端中运行以下命令:

  
  
  
  
  1. allong@android:~/android/jellybean$ cat packages/apps/Phone/Android.mk 

显示Android.mk的内容如下:

  
  
  
  
  1. ……(省略部分内容)  
  2. LOCAL_PATH:= $(call my-dir)  
  3. include $(CLEAR_VARS)  
  4. LOCAL_MODULE :com.android.phone.common  
  5. ……(省略部分内容)  
  6. LOCAL_PACKAGE_NAME :Phone 
  7. ……(省略部分内容) 

找到LOCAL_PACKAGE_NAME字段,其值便是我们需要得到的编译参数,即Phone。得到编译参数后,在终端中运行如下命令便可单独编译Phone模块及其依赖模块:

  
  
  
  
  1. allong@android:~/android/jellybean$make Phone 

(2)编译框架层和系统运行库源码

对于框架层和系统运行库,需要查看LOCAL_MODULE变量。

以frameworks包中的源码为例,在终端中运行以下命令:

  
  
  
  
  1. allong@android:~/android/jellybean$ find  frameworks -name Android.mk 

该命令将搜索frameworks目录下所有的Android.mk文件,列表如下:

  
  
  
  
  1. frameworks/media/libvideoeditor/lvpp/Android.mk  
  2. frameworks/media/libvideoeditor/osal/src/Android.mk  
  3. frameworks/base/cmds/app_process/Android.mk  
  4. ……(省略其他部分) 

以app_process为例,在终端中运行以下命令:

  
  
  
  
  1. allong@android:~/android/jellybean$ cat    
  2. frameworks/base/cmds/app_process/Android.mk  

显示Android.mk的内容如下:

  
  
  
  
  1. LOCAL_PATH:= $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3. LOCAL_MODULE:app_process 
  4. include $(BUILD_EXECUTABLE) 

LOCAL_MODULE变量的值便是我们要找的模块名。在终端中运行以下命令:

  
  
  
  
  1. allong@android:~/android/jellybean$make app_process 

make 后接 LOCAL_MODULE  或者 LOCAL_PACKAGE_NAME

二 编译镜像

1 全编

make -j4

2 编译文件系统和kernel

make bootimage



你可能感兴趣的:(android,编译)