• 编译Android源代码与内核总结


    这些天花了些时间自己下载了android源代码来编译,当中走了一些弯路导致耗了些时间,如今又一次梳理总结下,让有同样想法的人自己编译的时候能少走些弯路,官方指导文档在http://source.android.com/source/initializing.html

    1、安装linux环境

    我是windows系统,安装了Vmware虚拟机。在虚拟机上装了ubuntu-12.04,我的这个版本号是32位的,这个还蛮重要的。安装32位或者64位的将决定你能编译的android版本号,官方文档里For Gingerbread (2.3.x) and newer versions, including the master branch, a 64-bit environment is required. Older versions can be compiled on 32-bit systems.

    假设你编译的是2.3以上的版本号,就要安装64位的ubuntu系统。否则装32位版本号就可以。我这里编译的是2.3.5版本号,因此选择32位版本号的Ubuntu 12.04.5 LTS。内存3g。硬盘40g(官网建议是30G以上)。


    2、安装jdk

    非常多网上的资料都讲到http://www.oracle.com官网下载,然后我也去傻傻地下载了,下载了最新版本号1.8以上了,结果后来执行的时候发现andorid使用的是jdk1.6的,因此得安装jdk1.6。

    编译的提演示样例如以下:

    Your version is: java version "1.6.0_24". The correct version is: Java SE 1.6

    http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html

    下载jdk-6u33-linux-i586.bin,然后把它移动到linux文件夹下,我移动到/usr/lib下。

    2.1分配权限 chmod +x jdk-6u33-linux-i586.bin

    2.2解压 ./jdk-6u33-linux-i586.bin

    一路确认下来。最后解压出jdk1.6.0_33目录

    2.3配置 

    sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jdk1.6.0_33/bin/java" 1
    sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/libjdk1.6.0_33/bin/javac" 1
    sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/lib/jdk1.6.0_33/bin/javaws" 1
    sudo update-alternatives --install "/usr/bin/jar" "jar" "/usr/lib/jdk1.6.0_33/bin/jar" 1
    sudo update-alternatives --config java

    假设你的机器本来就装有其它版本号的java,这个时候会让你选择要生效的java版本号,记住选择当前这个1.6的版本号

    2.4 改动环境变量:

    sudo gedit /etc/environment

    export JAVA_HOME=/usr/lib/jdk1.6.0_33
    export JRE_HOME=${JAVA_HOME}/jre
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:${JAVA_HOME}/bin:${JRE_HOME}/bin"

    sudo gedit /etc/profile

    export JAVA_HOME=/usr/lib/jdk1.6.0_33
    export JRE_HOME=${JAVA_HOME}/jre
    export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:${PATH}
    export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH


    2.5.source /etc/profile

    source /etc/environment


    2.6.check java version

    java -version

    得到 

    java version "1.6.0_33"
    Java(TM) SE Runtime Environment (build 1.6.0_33-b04)
    Java HotSpot(TM) Client VM (build 20.8-b03, mixed mode, sharing)


    3、下载android 源代码

    网上非常多教程都是联网下载,但因为众所周知的原因,这种方法可能被墙或者非常慢,我在网上搜了个网址源代码下载 。我下载了2.3.5的源代码Android2.3.5_Kernel.7z。解压后得到.tar,继续解压后得到mydroid目录,这个就是源代码代码,将源代码相同移动到/usr/lib下

    进入源代码文件夹,输入make。就会有非常多输出。

    当中我遇到的一个问题:

    frameworks/base/libs/utils/RefBase.cpp: 在成员函数‘void android::RefBase::weakref_type::trackMe(bool, bool)’中:
    frameworks/base/libs/utils/RefBase.cpp:483:67: 错误: 将‘const android::RefBase::weakref_impl’作为‘void android::RefBase::weakref_impl::trackMe(bool, bool)’的‘this’实參时丢弃了类型限定 [-fpermissive]
    make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o] 错误 1


    这个问题是由于本机装的gcc版本号太高,须要换到合适的能够编译android的版本号


    sudo apt-get install gcc-4.4

    sudo apt-get install g++-4.4

    sudo rm -rf /usr/bin/gcc /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++


    第一次编译会比較久,我是放一晚上让它跑,第二天早上起来看到输出

    Target system fs image:    out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img
     Install system fs image: out/target/product/generic/system.img
     Target ram disk: out/target/product/generic/ramdisk.img
     Target userdata fs image: out/target/product/generic/userdata.img
      Installed file list: out/target/product/generic/installed-files.txt 

    代表成功make编译了源代码。

    4、编译linux内核

    然后我们还须要编译android的linux内核,尽管是linux源代码,但不能随便从网上下个linux源代码,由于Android在Linux内核的基础上加入了自己所特有的驱动程序,因此要编译android的linux内核必须使用android专门的linux内核。网上非常多方法都是提供git clonehttp://android.googlesource.com/kernel/goldfish.git的方法去下载。但由于有墙因此不好用。我搜了半天了搜到了一个http://pan.baidu.com/s/1qW0TkkO这里就能够下载了。大概300多M,比源代码小多了。

    下载完后解压在android源代码文件夹下新建一个文件夹kernel。并将解压后的内核源代码放在该文件夹下


    还须要对Makefile文件的有些地方做些修改,将

     ARCH ?= (SUBARCH)
      CROSS_COMPILE?= 
    改为
      ARCH ?

    = arm  #体系结构为arm

      CROSS_COMPILE     ?= arm-eabi-
    同一时候改动path,加入交叉编译环境。我的如图(红色部分为编译android内核须要的交叉编译环境)

    然后在内核源代码文件夹系运行chenzujie@ubuntu-chen:/usr/lib/mydroid2.3.5/kernel/common$ make goldfish_defconfig
    chenzujie@ubuntu-chen:/usr/lib/mydroid2.3.5/kernel/common$ make

    最后得到Kernel: arch/arm/boot/zImage is ready这个输出证明内核源代码也编译出来了。

    5、执行模拟器查看
    有了前面的步骤后,这一步就方便多了,先加入环境变量(红线部分,大家依据自己的放置路径做对应修改)

    命令行输入chenzujie@ubuntu-chen:/usr/lib/mydroid2.3.5$ emulator -kernel ./kernel/common/arch/arm/boot/zImage &

    随后模拟器将启动,此时输入adb shell进入android系统,继续输入

    cd /proc

    cat version,将看到自己编译出来的版本号,比方我的例如以下




    好了,大功告成了。

  • 相关阅读:
    【华磊随笔】一个企业的内部讨论(含高层)“30岁IT人,产出代码还是产出思想”之我见。
    dotNetGrid 演示站点(new)争取做ASP.NET中最好的Ajax开源表格控件
    【华磊随笔】进一步的分析:开发者版本;你属于哪个版本的程序员?
    新增格式化单元格数据功能dotNetFlexGrid1.24,快速的设置您的表格数据的不同样式;现在开始扔掉你的Asp.net GridView吧。(更新FieldFormatorHandle参数)
    【华磊随笔】技术到底值不值钱,到底值多少钱有感于公司新产品的上线
    【华磊原创】某企业前两年的开发人员技术能力评估表(不分语言)相对比较全面也比较细
    【华磊原创】安装程序自动检测安装.Net Framework运行环境(使用InnoSetup)
    mainline.js主线
    JS中的“!!”
    读“周大师代码评审”有感
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5133055.html
Copyright © 2020-2023  润新知