android 编译

来源:互联网 发布:长沙 三一重工 大数据 编辑:程序博客网 时间:2024/04/26 07:02

1 我的系统是Ubuntu 8.04
    * 2 系统上必须安装以下工具(摘自网上的资料):
      
       sudo apt-get install build-essential
       sudo apt-get install make
       sudo apt-get install gcc
       sudo apt-get install g++
       sudo apt-get install libc6-dev
      
       sudo apt-get install flex
       sudo apt-get install bison
       sudo apt-get install patch
       sudo apt-get install texinfo
       sudo apt-get install libncurses-dev
      
       sudo apt-get install git-core gnupg  //(gnupg系统可能已自带)
       sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl
       sudo apt-get install ncurses-dev
       sudo apt-get install zlib1g-dev
       sudo apt-get install valgrind(可选,有21M大,我觉得一般人是用不到的)
       sudo apt-get install python2.5 (实际上不用装,Ubuntu 8.04 已经自带)
       sudo apt-get install sun-java5-jdk
      
       注意:
       a. 不要用 sun-java6-jdk, 不然在make sdk, 具体来说是make doc这一步中, 遇到这个错误:
         Docs droiddoc: out/target/common/docs/dx
         javadoc: error - In doclet class DroidDoc, method start has thrown an
         exception java.lang.reflect.InvocationTargetException
         com.sun.tools.javac.code.Symbol$CompletionFailure: class file for
         sun.util.resources.OpenListResourceBundle not found
       b. 网上资料说需要设置环境变量, 但我并没有设置:
        export ANDROID_JAVA_HOME=$JAVA_HOME
       
       c. 网上并没有提及要安装ncurses-dev, 但安装之前我编译过程中会出现编译错误.
      
    * 3 建立android源码的存放目录
       $ mkdir ~/open_src
       $ mkdir ~/open_src/android
       $ cd ~/open_src/android
       $ mkdir bi
    * 4 下载repo脚本,放到~/open_src/android/bin目录下,加上可执行权

          $ curl http://android.git.kernel.org/repo > repo
          $ sudo mv repo ~/open_src/android/bin
          $ sudo chmod a+x ~/open_src/android/bin/repo

    * 5 在源码存放目录android中执行
       $ ~/open_src/android/bin/repo init -u git://android.git.kernel.org/platform/manifest.git
       //中间会提示输入电子邮件什么的,如果你打算要提交patch的话,用google accounts注册过的邮箱
      
    * 6 在android目录中执行repo sync就可以开始下载源码了.
       我们也可以从其他地方把源码复制到android目录, 而我正是这么做的.
    * 7 编译源码, 并得到~/open_src/android/out 目录
       在命令行执行make命令:
       $make
       这是一个很漫长的过程, 等吧......
    * 8 测试运行
       8.1 先设置环境变量:
        打开~/.bashrc文件, 并在最后添加下面两行:
        export PATH=$PATH:~/open_src/android/out/host/linux-x86/bin
        export ANDROID_PRODUCT_OUT=~/open_src/android/out/target/product/generic
      
       8.2 运行模拟器:
        emulator --debug-init -skin QVGA-L  //可能会提示unknown option: --debug-init, 去掉--debug-init即可
        或者直接执行emulator, 这样使用的是默认的皮肤
      
       如果最后能进入到系统并看到一个大时钟, 说明就大功告成了.
      
      
    * 9 后续编译:

           先在android目录下执行
           $ . build/envsetup.sh
           然后你就会多出几个可用的命令。在改了Contacts联系人项目后,可以简单的执行一下命令来单独编译这个部分:
           $mmm packages/apps/Contacts/
          为了可以直接测试改动,需要生成新的system.img,在android目录下执行:
           $ make snod
          当然,如果你改动的是emulator或者其它外围相关的,而非系统内部的东西,就不只是要重新生成system.img

 

在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

 

OR

 

然后,将
./build/core/main.mk 中的
ifneq (64,$(findstring 64,$(build_arch)))
改为:
ifneq (i686,$(findstring i686,$(build_arch)))

 

 

重新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然后,将
./build/core/main.mk 中的
ifneq (64,$(findstring 64,$(build_arch)))
改为:
ifneq (i686,$(findstring i686,$(build_arch)))

make: *** [out/target/common/docs/doc-comment-check-timestamp] Error 45

这是由于clearsilver在编译时如果检测到使用Java JDK 6,就使用64位编译,因为Google的一个员工更新了几个文件。这里可以看到详细的修改记录:http://android.git.kernel.org/?p=platform/external/clearsilver.git;a=commitdiff;h=d36910a8110d8377b22301274d2b5131a732a72b

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

external/clearsilver/cgi/Android.mk

external/clearsilver/java-jni/Android.mk

external/clearsilver/util/Android.mk

external/clearsilver/cs/Android.mk

把编译选项-m64改成-m32即可

在externel/clearsilver/make clean一下。

重新make,大概不到一个小时就make完了。

 

要解决gnu/stubs-64.h: No such file or directory,需:
apt-get install libc6-dev-amd64

要解决/usr/bin/ld: cannot find -lstdc++,需:
apt-get install g++-multilib lib64stdc++6 

要解决/usr/bin/ld: cannot find -lz,需
apt-get install lib64z1-dev