Ubuntu 14.04 LTS 下 android 2.3.5 源码编译过程
 
在新的Ubuntu 64位系统下去编译早期的安卓源码是会出现很多问题的,因为64位系统在安装完成后,很多32位的兼容包是没有安装的, 而早期的安卓是有不少用的32位的开发包。新手往往很难搞清楚其中的问题根源。而且安卓源码的编译又依赖了很多额外的的第三方开发包,所以编译过程会因为缺少这些包导致编译失败。另外一个问题是在新的Ubuntu系统下,因为gcc 和 g++编译器的升级原因,导致早期的代码在新的编译器下发生错误而中断。例如我的Ubuntu 14.04LTS 64位系统安装完成后gcc 和 g++的版本都是4.8,而网上很多资料都说要编译 2.3的安卓源码需要降级到 4.4。我想这是因为一些在早期版本的代码在后面的编译器看来是一种错误导致的,所以有不少地方需要修改 Android.mk文件,添加 -fpermissive 编译选项,permissive 英文意思为宽容,大概意思是宽容早期的一些语法结构的意思吧。
 
所以一开始先把一些需要的依赖包安装好,然后把gcc 和 g++使用软链接连接到4.4版本的gcc和g++编译器可以减少很多编译失败的问题。
 
这里我列出一些依赖包,但每个人的情况不同,所以一定有缺的,在网上找找应该都能解决:
 
sudo apt-get install git-core gnupg flex bison gperf build-essential \

      zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \

      libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \

      libgl1-mesa-dev g++-multilib mingw32 tofrodos \

      python-markdown libxml2-utils xsltproc zlib1g-dev:i386

sudo apt-get install git-core gnupg flex bison gperf libsdl1.2-dev libesd0-dev libwxgtk2.6-dev squashfs-tools build-essential zip curl libncurses5-dev zlib1g-dev  pngcrush schedtool libxml2 libxml2-utils xsltproc

下载 Android 源码:

  有两种方法:

    1. 直接下载别人已经下载打包的

      百度网盘别人共享的:http://pan.baidu.com/share/link?shareid=7577&uk=4246628909 , 2.3.5版本,要先安装7z解压,然后获得一个大约2G多的tar,这个文件直接解压会出错,错误信息大概是说无法创建硬链接(hard link),使用下面的命令:

      sudo tar -xf Android_Kernel.tar --exclude */.git -C /opt/android/sources

    2. 使用 repo 获取

      参考:http://jileniao.net/post-156.html

      repo 的用法可参考 http://blog.csdn.net/sunweizhong1024/article/details/8055372

      因为 repo sync 会因为网络中断,所以可以使用下面的脚本自动重新运行

      #!/bin/bash

      command="repo sync"

      $command
      result=$?
      echo "result = "$result
      until [ $result -eq 0 ]
      do
      echo "retry"
      $command
      result=$?
      done

      

编译:
 
开始吧...
 
 进入源码路径,然后运行 make即开始编译过程,编译过程出现的一些错误以及解决办法列在下面
 
 
 
 
1. 错误 dalvik/vm/native/dalvik_system_Zygote.c:191:19: error: storage size of ‘rlim’ isn’t known
struct rlimit rlim;

     解决方法:添加头文件#include <sys/resource.h>到以下文件
dalvik/vm/native/dalvik_system_Zygote.cpp
 
 
 
2. make: *** [out/host/linux-x86/obj/EXECUTABLES/mksnapshot_intermediates/src/accessors.o] 错误 1
 
     在网上查资料,网上是说因为GCC 和 G++ 版本太高,应该使用 gcc-4.4 和 g++-4.4,通过以下命令查看我自己的版本
 
     gcc --version (结果为4.8)
     g++ --version (结果为4.8)
 
     解决方法很简单,安装 gcc 4.4 和 g++ 4.4
 
     sudo apt-get install gcc-4.4 g++-4.4 g++-4.4-multilib
 
     安装之后在 /usr/bin下面就会有 gcc-4.4 和 g++-4.4,然后把原来gcc 和 g++ 的符号链接删除,重新建立其指向我们安装的版本:
 
     sudo rm -f /usr/bin/gcc
     sudo rm -f /usr/bin/g++
     sudo ln -s /usr/bin/gcc-4.4 /usr/bin/gcc
     sudo ln -s /usr/bin/g++-4.4 /usr/bin/g++
 
3. external/srec/tools/thirdparty/OpenFst/fst/lib/cache.h:136:11: note: use ‘this->SetState’ instead
make: *** [out/host/linux-x86/obj/EXECUTABLES/grxmlcompile_intermediates/grxmlcompile.o] Error 1
 
解决方法:
  cd external/srec
  wget "https://github.com/CyanogenMod/android_external_srec/commit/4d7ae7b79eda47e489669fbbe1f91ec501d42fb2.diff"
  patch -p1 < 4d7ae7b79eda47e489669fbbe1f91ec501d42fb2.diff
  rm -f 4d7ae7b79eda47e489669fbbe1f91ec501d42fb2.diff
 

4. In file included from system/extras/ext4_utils/output_file.c:30: /usr/include/zlib.h:34: fatal error: zconf.h: 没有那个文件或目录 compilation terminated.

解决方法:原因是zlib1g-dev有个头文件修改了路径,及zconf.h放到了/usr/include/x86_64-linux-gnu/,所以将其拷贝到/usr/include/下即可了

5. make: *** [out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/WebCore/HTMLNames.h] 错误 2
解决方法:安装 sudo apt-get install libswitch-perl

验证

编译完成后,尝试一下我的编译结果:

  编译后生成的模拟器 emulator 在源码的 out/host/linux-x86/bin 下,而生成的系统在 out/target/product/generic 目录下,主要的是system.img、userdata.img和 ramdisk.img。有两种方法可以运行emulator

  第一种: 设置 ANDROD_PRODUCT_OUT 环境变量,将其设置为生成的系统存放目录,如我的机器上 out/target/product/generic:

    export ANDROD_PRODUCT_OUT=out/target/product/generic  (如果只是一次行测试,在终端窗口运行该命令即可,如果希望在以后使用,那么可以写入/etc/profile 或者 ~/.bashrc)

    然后进入源码目录运行: emulator

    这种情况下其使用的系统映像文件均来自与 ANDROID_PRODUCT_OUT指向的目录中的 system.img、userdata.img和 ramdisk.img文件,而其内核文件会使用源码目录中的 prebuilt/android-arm/kernel/kernel-qemu的文件

  第二种:使用完整的 emulator 命令参数启动模拟器

    emulator -kernel /develop/sources/android/2.3.5/prebuilt/android-arm/kernel/kernel-qemu -sysdir /develop/sources/android/2.3.5/out/target/product/generic -system system.img -data userdata.img -ramdisk ramdisk.img

    字体加粗部分应根据自己的源码路径进行修改。正如命令的参数的直观表示一样, -kernel 后面紧接着是指定内核文件,因为我没有编译自己的内核,所以直接使用源码提供的预先编译好的内核, -sysdir 参数后跟着的是系统的映像文件存放路径,后面的 -system、-data和-ramdisk等参数指定的文件如果没有使用绝对路径,那么就使用 -sysdir 指定的路径。

  当我运行我编译好的 emulator 后出现了如下错误:

    SDL init failure, reason is: No available video device

  我前段时间刚好安装了最新的 Android SDK, 里面是带 emulator的,我就抱着试试看的态度,看看能不能成功:

    1. 打开控制台端口,进入放置emulator 的目录

      cd /opt/android/sdk/tools

    2. 然后运行 emulator 命令

      emulator -kernel /develop/sources/android/2.3.5/prebuilt/android-arm/kernel/kernel-qemu -sysdir /develop/sources/android/2.3.5/out/target/product/generic

      成功!

      如果我运行:

      emulator -kernel /develop/sources/android/2.3.5/prebuilt/android-arm/kernel/kernel-qemu -sysdir /develop/sources/android/2.3.5/out/target/product/generic -system system.img -data userdata.img -ramdisk ramdisk.img

      则会出现错误:

      qemu: could not load initrd 'ramdisk.img'

      网上找有网友说使用完整路径来指定ramdisk路径即可,实验了一下,果真如此。 -ramdisk /develop/sources/android/2.3.5/out/target/product/generic/ramdisk.img, 还有一些帖子说 out/target/product/generic 路径需要写权限,不过我不属于这种情况,如果是使用其他用户编译的,或许会有这样的问题,把解决方法也写出来,备查:

    chmod 777 out/target/product/generic

  既然Android SDK的 emulator可以,但是我编译出来的 emulator不行,说明是emulator的问题,突然我想到会不会又是一个 64位和32位的问题。我编译的 emulator是 2.3.5源码的,那时候说不定是使用的32位开发包。在网上查资料,果然如我的猜测,那么解决方法很简单安装32位的开发包

  我先是安装 X11 的32位开发包:

    sudo apt-get install libX11-dev:i386   (注意冒号后面的 i386指示的是安装32位版本)

  运行,还是一样的问题,肯定还有东西没有安装完整,再次找资料,还要安装 SDL的32位包:

    sudo apt-get install libsdl1.2debian:i386

  帖子还有说:

    sudo apt-get install ia32-libs-sdl (这个我没有试)

  还有的说 export DISPLAY=:0, 这个情况或许某些人会有用。

  参考链接: http://stackoverflow.com/questions/4841908/sdl-init-failure-reason-is-no-available-video-device/10128566

比较不错的参考链接:

http://www.cnblogs.com/kobe8/p/3998379.html

http://www.cnblogs.com/webapplee/p/3946506.html

http://blog.csdn.net/jiangwei0910410003/article/details/37988637

http://www.omitol.com/archives/65.html

http://www.linuxidc.com/Linux/2012-09/70052p2.htm

Ubuntu 14.04 LTS 下 android 2.3.5 源码编译过程的更多相关文章

  1. Linux Ubuntu 14.04 LTS下VirtualBox连接USB

    1.环境 主机:Ubuntu 14.04 LTS 虚拟机:Windows 7 专业版本 VirtualBox: 图形用户界面版本 5.1.8 r111374 (Qt5.6.1) 2.在主机上给Virt ...

  2. Ubuntu 14.04 LTS下安装Google Chrome浏览器

    在Ubuntu 14.04下安装Google Chrome浏览器非常简单,只要到Chrome的网站下载Deb安装包并进行安装即可.当然你也可以使用APT软件包管理器来安装Google Chrome浏览 ...

  3. Ubuntu 14.04 LTS 下使用源码编译安装 Sagemath 6.7 x64 (小结)

    原先博客放弃使用,几篇文章搬运过来 下载源码包 系统的最低要求: 6GB 硬盘 : 2GB RAM. 命令行工具: A C/C++ compiler: Since Sage builds its ow ...

  4. Ubuntu 14.04 LTS 下升级 gcc 到 gcc-4.9、gcc-5 版本

    如果没记错的话,阿里云ECS上的Ubuntu也是LTS版本. 如果还在使用较旧版本的Ubuntu,或者是Ubuntu LTS,那么我们是很难体验新版gcc的.怎么办呢? 我们或许可以自己去编译用旧版本 ...

  5. Ubuntu 14.04 LTS 下使用校园网客户端DrclientLinux

    原先博客放弃使用,几篇文章搬运过来 下载客户端并解压 安装开发包 sudo -i dpkg --add-architecture i386 #添加32位的支持 apt-get update apt-g ...

  6. 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

                 分类: Android 系统开发(5)                                              作者同类文章X 版权声明:本文为博主原创文章 ...

  7. 【转】基于Ubuntu 14.04 LTS编译Android4.4.2源代码

    原文网址:http://blog.csdn.net/gobitan/article/details/24367439 基于Ubuntu 14.04 LTS编译Android4.4.2源代码       ...

  8. 基于Ubuntu 14.04 LTS编译Android4.4.2源码

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/gobitan/article/details/24367439 基于Ubuntu 14.04 LTS ...

  9. 基于Ubuntu 14.04 LTS编译Android4.4.2源代码

    转载自:雨水:http://blog.csdn.net/gobitan/article/details/24367439 基于Ubuntu 14.04 LTS编译Android4.4.2源代码     ...

随机推荐

  1. iOS 中constraint 不等于约束和低优先级约束使用的简单体会

    看了些文章发现,在使用constraint时,不等于约束往往是和低优先级约束成对使用的,这样才能实现他们的效果. 看看例子 下面是在3.5存屏幕下的效果 图1,竖屏,在满足>=50的前提下,可以 ...

  2. iOS CoreData 的级联删除等操作

    关于CoreData 的基本操作在网上有一些中文资料,但是这些资料大多没有涉及CoreData的详细操作,只是简单的演示了最基本用法.像级联删除这种最基本的数据库操作都没有提到.今天在网上看到了一些英 ...

  3. iOS 和Android中的基本日期处理

    提到日期处理,主要有2个参数,一个是所在的时区,一个是所用的日历方法. 主要涉及2大类问题,一类是日期类型和字符串之间的转化,另一类是日期的计算问题.ios和android都提供了相应的类来处理问题. ...

  4. 转MYSQL学习(二) 运算符

    MYSQL中的运算符很多,这一节主要讲MYSQL中有的,而SQLSERVER没有的运算符 安全等于运算符(<=>) 这个操作符和=操作符执行相同的比较操作,不过<=>可以用来判 ...

  5. Java for LeetCode 072 Edit Distance【HARD】

    Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...

  6. block引发的陷阱

    block在项目的开发中使用时非常频繁的,苹果官方也极力推荐使用block.其实,究其本质,block就是指向结构体的指针(可利用运行时机制查看底层生成的c代码).然而在使用block时会存在很多陷阱 ...

  7. [Linux] xargs的- n1参数

    起因在对一堆*.tar.gz文件解压缩时,发现tar xvfz *.tar.gz不管用,一查,原来是tar xvfz *.tar.gz会被shell给拆成tar xvfz a.tar.gz b.tar ...

  8. July 23rd, Week 30th Saturday, 2016

    A day is a miniature of eternity. 一天是永恒的缩影. For a man, the eternity is his lifetime which is measure ...

  9. Ajax中的XMLHttpRequest对象详解

    XMLHttpRequest对象是Ajax技术的核心.在Internet Explorer 5中,XMLHttpRequest对象以ActiveX对象引入,被称之为XMLHTTP,它是一种支持异步请求 ...

  10. jquery.validate.unobtrusive.js插件作用

    在 ASP.NET MVC 中启用 Unobtrusive JavaScript 功能,可以在运行时由服务器端根据Model中设置的验证规则,自动生成客户端验证js代码(结合jquery.valida ...