原文网址:http://blog.csdn.net/chenyafei617/article/details/6570928

一、Introduction

今天我们就来谈谈如何在Ubuntu平台上面编译android源码,我的是ubuntu10.04版本,在进行编译流程讲解之前我想讲一下 make 、make snod 、make kernel的作用,m、mm、mmm它们的作用以及区别。

- make:                 编译源码,生成相应的系统镜像文件。                                                            
- make snod:       重新生成一个system.img系统镜像文件
- make kernel:    编译内核(可选)一般根据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 source以及SDK

2.1、完全编译

使用make编译并生成镜像

~$: cd ~/android/src
~$: make

映像编译成功后会在目录 ~/android/src/out/target/product/generic 下产生一些image文件

ramdisk.img system.img userdata.img android -info.txt

我们可以通过启动模拟器来验证我们是否编译正确 ,注意,我们最好在system.img所在的目录下进行如下动作

~$ emulator -kernel ~/android2.2/prebuilt/android-arm/kernel/kernel-qemu -ramdisk ramdisk.img -debug all -data userdata-qemu.img -system system.img -sysdir . -show-kernel -skin 800x480

如果能正确启动则说明完全编译成功啦。

完全编译完后我们就可以使用make sdk命令做一次SDK的编译拉,步骤如下:

~$ cd ~/android/src
~$ make sdk 

注意:如果需要build SDK,随着版本的不同,我们所需的环境也不同,编译android2.2之前的版本需要安装sun-java5-jdk, 而不是sun-java6-jdk,否则会出现如下错误:

build/core/product_config.mk:207: WARNING: adding test OTA key
============================================
TARGET_PRODUCT=generic
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=
============================================
Combining NOTICE files: out/target/product/generic/obj/NOTICE.txt
Finding NOTICE files: out/host/linux-x86/obj/NOTICE_FILES/hash-timestamp
Combining NOTICE files: out/host/linux-x86/obj/NOTICE.txt
Package: out/target/product/generic/generic-img-eng.anjoy.zip
SDK buildinfo: out/target/product/generic/sdk/sdk-build.prop
Docs droiddoc: out/target/common/docs/dx
javadoc: 错误 - 在 doclet 类 DroidDoc 中,方法 start 已抛出异常 java.lang.reflect.InvocationTargetException
com.sun.tools.javac.code.Symbol$CompletionFailure: 未找到 sun.util.resources.OpenListResourceBundle 的类文件 

所以,如果jdk版本不同的话就去官网下载一个或者在线安装一个吧 ,这里我就不多说拉

sdk编译成功后会在~/android /src/out/host/linux-x86/sdk/ 生成sdk的文件目录和压缩包:

android-sdk_eng.anjoy_linux-x86
android-sdk_eng.anjoy_linux-x86.zip 

并在~/android /src/out/target/product/generic(generic是默认的产品名)下打包所有的映像文件:

generic-img-eng.anjoy.zip

 

生成的SDK目录结构为:

/home/anjoy/android/src/out/host/linux-x86/sdk/android-sdk_eng.anjoy_linux-x86:
总计 32
drwxrwx---  6 anjoy anjoy 4096 2011-06-27 17:48 .
drwxr-x---  3 anjoy anjoy 4096 2011-06-27 17:48 ..
drwxrwx---  2 anjoy anjoy 4096 2011-06-27 17:48 add-ons
drwxrwx--- 14 anjoy anjoy 4096 2011-06-27 17:48 docs
-rw-rw----  1 anjoy anjoy  172 2011-06-27 17:50 documentation.html
drwxrwx---  3 anjoy anjoy 4096 2011-06-27 17:48 platforms
-rw-rw----  1 anjoy anjoy  225 2011-06-27 17:50 RELEASE_NOTES.txt
drwxrwx---  3 anjoy anjoy 4096 2011-06-27 17:50 tools 

想很方便的使用生成的SDK只需要在.bashrc中增加:

export PATH=$PATH:/home/anjoy/android/src/out/host/linux-x86/sdk/android-sdk_eng.anjoy_linux-x86/tools

 

2.2、模块化编译

注意:在模块化编译之前我们一定要把envsetup.sh 脚本source 一下,或者你直接把envsetup.sh文件所在的路径配置到你个人的bashrc文件里面,这样你就不要每次都作source动作拉。

envsetup.sh 提供了一些的bash函数定义,当运行了envsetup.sh后就可以使用help 命令来查看:

~$ help
Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment:
- croot:   Changes directory to the top of the tree.
- 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.
- 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.
...  
.. 

其中对模块的编译有帮助的是tapas、m、mm、mmm这几个命令。

其中mmm 后面要跟模块的根目录,不是所有的目录下都有子模块,那些含有Android.mk 文件目录才是模块的根目录,模块名可以从Android.mk 的LOCAL_MODULE 或者LOCAL_PACKAGE_NAME 变量中得到。

单独编译某模块,需要在mmm后面指定模块路径,例如编译application中的Launcher2:

mmm packages/apps/Launcher2/

 

或者在src目录下直接运行make module name:

cd ~/android/src
make Launcher2 

2.3、增量编译的步骤

a、假如我们修改了某个模块下的代码,那么我们只需要从新编译这个模块就可以拉,而不需要整个工程的编译。

b、编译所修改的代码所在模块,例如:

cd ~/android/src 
mmm packages/apps/Launcher2

c、在~/android/src中运行:

cd ~/android/src
make snod

d、该命令生成一个新的系统映像system.img,将这个系统映像拷贝至sdk下:

cd ~/android/src
cp out/target/product/generic/system.img /
   out/host/linux-x86/sdk/android-sdk_eng.anjoy_linux-x86/tools/lib/images/

OK,这样就完成了Android源码的编译以及SDK的生成拉

提醒:如果你是Ubuntu10.04系统 32位机上安装编译Android2.3源码,其步骤和注意事项如下:

1.安装JDK6 
对于Android2.3 系统,不要安装JDK5 ,应该安装最新的JDK6 。
如果安装了JDK6,Android会自动按64位编译,如果系统是32位的,会有编译错误,后面会说如何修改这个错误。
sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
sudo add-apt-repository "deb-src http://archive.canonical.com/ubuntu lucid partner"
sudo apt-get update
sudo apt-get install sun-java6-jdk
sudo update-java-alternatives -s java-6-sun 
安装完后,需要手动设置JAVA_HOME, JRE_HOME , CLASS_PATH为JDK6 的安装路径。

2.进行编译android2.3

~$ cd ~/android2.3
~$ source build/envsetup.sh
~$ make

在make的时候会提示出错:

    ************************************************************
    You are attempting to build on a 32-bit system.
    Only 64-bit build environments are supported beyond froyo/2.2.
    ************************************************************

因为Android2.3默认是64位的系统上编译,需要手动修改build/core/main.mk,把这个判断部分注释掉:

#ifneq (64,$(findstring 64,$(build_arch)))
#$(warning ************************************************************)
#$(warning You are attempting to build on a 32-bit system.)
#$(warning Only 64-bit build environments are supported beyond froyo/2.2.)
#$(warning ************************************************************)
#$(error stop)
#endif 

重新make,如果是安装了JDK6版本,会又报错:

    Docs droiddoc: out/target/common/docs/api-stubs
    Could not load ‘clearsilver-jni’
    java.library.path = out/host/linux-x86/lib
    make: *** [out/target/common/docs/api-stubs-timestamp] Error 45
    make: *** Waiting for unfinished jobs….
    Could not load ‘clearsilver-jni’
    java.library.path = out/host/linux-x86/lib 
    make: *** [out/target/common/docs/doc-comment-check-timestamp] Error 45

 

我们只需要修改这几个文件,该回到32位编译环境即可:

# external/clearsilver/cgi/Android.mk
# external/clearsilver/java-jni/Android.mk
# external/clearsilver/util/Android.mk
# external/clearsilver/cs/Android.mk

 

把上面这些文件内容的编译选项-m64 改成-m32 即可
重新make,大概不到一个小时就make完了。

OK,大工告成

Android常用的一些make命令

http://blog.chinaunix.net/uid-26926660-id-3216956.html

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目录下的还会被打包进去。

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内核的时候有用

【转】Ubuntu10.04上编译Android源码(Build Android source in Ubuntu10.04 Platform)的更多相关文章

  1. [原]在win上编译 subversion 源码实践Tonyfield的专栏

    (百度和网页的作者无关,不对其内容负责。百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面。) [原]在win上编译 subversion 源码实践 2013-6-9阅读400 评论0 (参考 ...

  2. CentOS6.5上编译OpenJDK7源码

    本文地址:http://www.cnblogs.com/wuyudong/p/build-openjdk7.html,转载请注明源地址. 采用开源的OpenJDK版本,获取其源码的方式有两种: 通Me ...

  3. 阅读android源码了解 android 加载so的流程

    参考原文:http://bbs.pediy.com/thread-217656.htm Android安全–linker加载so流程,在.init下断点: http://www.blogfshare. ...

  4. Windows 上编译 corefx 源码生成 Linux 上可用的 System.Data.SqlClient.dll

    最近在排查一个奇怪的 EF Core 查询速度慢的问题,需要在 corefx 2.2.3 的 System.Data.SqlClient 源码中打点. github 上签出 corefx 的源代码,运 ...

  5. 在 iOS 上编译 webkit 源码

    准备工作 买一台 mac 下载并安装 Xcode 下载源码 git clone git://git.webkit.org/WebKit.git WebKit 这个可能要耗费很久很久 编译源码 打开 X ...

  6. 如何下载android源码与android内核源码

    首先,要分清楚,android的源代码和android的内核代码一般是分开的,要分别进行下载. 1.先下载android的源代码.(这里不包括android的内核代码)      下载最新的源代码,一 ...

  7. [Android Pro] Android源码编译之Nexus5真机编译

    reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 在Android安全的研究工作中, ...

  8. Android源码编译出错解决办法

    编译环境:Ubuntu12.04 64位 Android源码:Android 4.3 以下问题是笔者亲自碰到,通过网上查询整合在一起的. 1.error while loading shared li ...

  9. ubuntu18.04.2下编译openjdk9源码

    最近在看<深入理解Java虚拟机 第二版>这本书,上面有关于自己编译OpenJDK源码的内容.自己根据书里的指示去操作,花了三天的时间,重装了好几次Ubuntu(还不知道快照这个功能,好傻 ...

随机推荐

  1. Permutations 解答

    Question Given a collection of numbers, return all possible permutations. For example,[1,2,3] have t ...

  2. socketFunction

    socket     socket() 我们使用系统调用socket()来获得文件描述符: #include<sys/types.h> #include<sys/socket.h&g ...

  3. (转载)XML Tutorial for iOS: How To Read and Write XML Documents with GDataXML

    In my recent post on How To Choose the Best XML Parser for Your iPhone Project, Saliom from the comm ...

  4. 布局神器:Flexbox

    最近的工作内容大多是移动端网页的开发,百分比布局,Media Queries,Bootstrap等常规的响应式/自适应的开发技术皆一一试过,但觉以上都不够灵活,所以,一直再尝试寻求更加灵活的精确的移动 ...

  5. J2EE基础总结(1)——J2EE入门

    J2EE诞生的背景 在传统的开发模式(单层应用结构)下.应用普遍存在下面致命缺点: - 数据.页面和业务逻辑在一个逻辑层次中.功能紧密耦合. - 代码重用性极低,可维护性差. - 应用耦合度高,全然没 ...

  6. DDMS files not found: tools\hprof-conv.exe

    最近在Eclipse下每次更新ADT和SDK后都报一些错误,比如 DDMS files not found: D:\android-sdk-windows-1.6_r1\android-sdk-win ...

  7. android layout属性介绍

    android:id 为控件指定对应的ID android:text 指定控件其中显示的文字,须要注意的是,这里尽量使用strings.xml文件其中的字符串 android:gravity 指定Vi ...

  8. Qt5官方demo解析集21——Extending QML - Adding Types Example

    本系列全部文章能够在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 又是一个新的系列了,只是这个系列和我们之前的Chapt ...

  9. 《31天成为IT服务达人》--机遇篇(二)

    1       第二章 机遇就是选择大于努力 年假设你一咬牙(或者在晚点)买了房,十年的巨幅增值,比你如今干哪行都赚得快,可是往往有选择就有痛苦,这样的痛苦来至于对未知的恐惧和现实须要一定的付出.作为 ...

  10. 打开Eclipse出现 parsesdkcontent failed 的解决办法

    出现这个问题是由于系统曾安装过SDK和AVD,所以需要删除.android和相应的workspace文件夹,然后进入我的电脑->高级系统设置->环境变量,在系统变量里,更新ANDROID_ ...