【转】Ubuntu10.04上编译Android源码(Build Android source in Ubuntu10.04 Platform)
原文网址: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,大工告成
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)的更多相关文章
- [原]在win上编译 subversion 源码实践Tonyfield的专栏
(百度和网页的作者无关,不对其内容负责。百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面。) [原]在win上编译 subversion 源码实践 2013-6-9阅读400 评论0 (参考 ...
- CentOS6.5上编译OpenJDK7源码
本文地址:http://www.cnblogs.com/wuyudong/p/build-openjdk7.html,转载请注明源地址. 采用开源的OpenJDK版本,获取其源码的方式有两种: 通Me ...
- 阅读android源码了解 android 加载so的流程
参考原文:http://bbs.pediy.com/thread-217656.htm Android安全–linker加载so流程,在.init下断点: http://www.blogfshare. ...
- Windows 上编译 corefx 源码生成 Linux 上可用的 System.Data.SqlClient.dll
最近在排查一个奇怪的 EF Core 查询速度慢的问题,需要在 corefx 2.2.3 的 System.Data.SqlClient 源码中打点. github 上签出 corefx 的源代码,运 ...
- 在 iOS 上编译 webkit 源码
准备工作 买一台 mac 下载并安装 Xcode 下载源码 git clone git://git.webkit.org/WebKit.git WebKit 这个可能要耗费很久很久 编译源码 打开 X ...
- 如何下载android源码与android内核源码
首先,要分清楚,android的源代码和android的内核代码一般是分开的,要分别进行下载. 1.先下载android的源代码.(这里不包括android的内核代码) 下载最新的源代码,一 ...
- [Android Pro] Android源码编译之Nexus5真机编译
reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1. 前言 在Android安全的研究工作中, ...
- Android源码编译出错解决办法
编译环境:Ubuntu12.04 64位 Android源码:Android 4.3 以下问题是笔者亲自碰到,通过网上查询整合在一起的. 1.error while loading shared li ...
- ubuntu18.04.2下编译openjdk9源码
最近在看<深入理解Java虚拟机 第二版>这本书,上面有关于自己编译OpenJDK源码的内容.自己根据书里的指示去操作,花了三天的时间,重装了好几次Ubuntu(还不知道快照这个功能,好傻 ...
随机推荐
- [RxJS] Getting Input Text with Map
By default, Inputs will push input events into the stream. This lesson shows you how to use map to c ...
- QtWebkit2.2.0 HTML5.0支持情况
Canvas: 支持element, 2d context以及文本 解析规则:支持 HTML5 tokenizer/tree building, SVG in text/html, MathML ...
- public,private,protected的区别
一,public,private,protected的区别public:权限是最大的,可以内部调用,实例调用等.protected: 受保护类型,用于本类和继承类调用.private: 私有类型,只有 ...
- AVT Vimba与OpenCV环境配置
近来,由于项目需求,需要使用AVT的一款相机采集图像并进行相应的算法处理.环境的配置过程较为复杂,特此记录,以做备忘.也给有需要的小伙伴们一些key point的分享. 搭建环境:Windows7 + ...
- android Log.isLoggable步骤的使用
原文地址: http://www.cnblogs.com/maxinliang/p/4024442.html android Log.isLoggable方法的使用 android 动态控制logca ...
- 转载 Silverlight实用窍门系列:1.Silverlight读取外部XML加载配置---(使用WebClient读取XAP包同目录下的XML文件))
转载:程兴亮文章,地址;http://www.cnblogs.com/chengxingliang/archive/2011/02/07/1949579.html 使用WebClient读取XAP包同 ...
- Homebrew -- Mac软件管家(套件管理yun……)
也许是之前使用linux系统的时候总是习惯使用wget 在mac中只有curl,有点略显不习惯 于是乎某天在搜索mac开发者的时候发现了Homebrew这个东西 ok,是那么句话--惰性是人的天性 有 ...
- Render和template?
Template是一个模板. render = web.template.render('templates/') 这会告诉web.py到你的模板目录中去查找模板.然后把 index.GET改成: 告 ...
- 对于JavaScript对象的prototype和__proto__的理解
一.Object和Function的关系: 刚学JavaScript的时候,看书上说JavaScript中万物皆对象,而javascript中的其他对象都是从Object继承而来,包括内置对象.瞬间觉 ...
- Altium Designer 生成 Mach3 G代码的程序
Altium Designer做PCB设计,还是很方便的,最近头脑发热,在网上买了一套CNC机床,用来做钻孔用,但是翻来翻去,基本上所有的软件都是铣削功能,而且很多软件很复杂.翻了好几天,发现没有什么 ...