当前位置:首页 » 安卓系统 » android内核编译

android内核编译

发布时间: 2023-03-02 22:31:09

1. 为什么编译android内核的时候, 编译器提示找不到头文件,而该头文件其实是存在的,

你应该帖出具体的报错提示。你有没有改好交叉编译链的位置,或者换个交叉编译链的版本试试

2. 自己可以编译安卓源码

用最新的Ubuntu 16.04,请首先确保自己已经安装了Git.没安装的同学可以通过以下命令进行安装:

sudo apt-get install git git config –global user.email “[email protected]” git config –global user.name “test”

其中[email protected]为你自己的邮箱.

简要说明

android源码编译的四个流程:1.源码下载;2.构建编译环境;3.编译源码;4运行.下文也将按照该流程讲述.

源码下载

由于某墙的原因,这里我们采用国内的镜像源进行下载.
目前,可用的镜像源一般是科大和清华的,具体使用差不多,这里我选择清华大学镜像进行说明.(参考:科大源,清华源)

repo工具下载及安装

通过执行以下命令实现repo工具的下载和安装

mkdir ~/binPATH=~/bin:$PATHcurl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repochmod a+x ~/bin/repo

补充说明
这里,我来简单的介绍下repo工具,我们知道AOSP项目由不同的子项目组成,为了方便进行管理,Google采用Git对AOSP项目进行多仓库管理.在聊repo工具之前,我先带你来聊聊多仓库项目:

我们有个非常庞大的项目Pre,该项目由很多个子项目R1,R2,...Rn等组成,为了方便管理和协同开发,我们为每个子项目创立自己的仓库,整个项目的结构如下:


这里写图片描述

执行完该命令后,再使用make命令继续编译.某些情况下,当你执行jack-admin kill-server时可能提示你命令不存在,此时去你去out/host/linux-x86/bin/目录下会发现不存在jack-admin文件.如果我是你,我就会重新repo sync下,然后从头来过.

错误三:使用emulator时,虚拟机停在黑屏界面,点击无任何响应.此时,可能是kerner内核问题,解决方法如下:
执行如下命令:

  • ./out/host/linux-x86/bin/emulator -partition-size 1024 -kernel ./prebuilts/qemu-kernel/arm/kernel-qemu-armv7

  • 通过使用kernel-qemu-armv7内核 解决模拟器等待黑屏问题.而-partition-size 1024 则是解决警告: system partion siez adjusted to match image file (163 MB >66 MB)

    如果你一开始编译的版本是aosp_arm-eng,使用上述命令仍然不能解决等待黑屏问题时,不妨编译aosp_arm64-eng试试.

    结束吧

    到现在为止,你已经了解了整个android编译的流程.除此之外,我也简单的说明android源码的多仓库管理机制.下面,不妨自己动手尝试一下.

    3. Android内核编译时如何获得.config文件

    得到config之后,直接复制到你下载来的内核文件夹kernel下,更名为.config,打开终端,进入此目录(假设你放在里你的home下,即~/kernel)运行make ARCH=arm menuconfig(ARCH=arm表示编译的是arm平台的)

    4. 如何编译android kernel

    1.准备工作: (ubuntu1110 32位)
    ubuntu等linuxOS,下载好eclipse,安装好JDK, 安装好android的SDK, 在eclipse中成功打开android 手机模拟器即OK。

    2.初始化编译环境 :
    关注该网页上的“installing required packages”,其中有的软件包因为版本问题而安装不上,不用管它,之后遇到错误再单独解决。

    3.下载内核源码:
    android 2.3 内核 下载需要等待一段时间。

    4.下载交叉编译器:
    该步骤有可能耗费大量时间,依据网速不同,几个小时到几天不等,或许可以尝试git clone 后面的地址只下载prebuilt/linux-x86/toolchain

    5.设置参数以及编译:
    $ export ARCH=arm
    $ export SUBARCH=arm
    $ export CROSS_COMPILE=arm-eabi-
    $ cd goldfish // 进入下载的源代码目录
    $ git checkout <commit_from_first_step> //这个步骤我没有做,不知道干嘛用的
    $ make goldfish_defconfig
    $ make

    6.报错信息:
    若有报错说找不到 (arm-eabi-gcc command not found)等等,尝试使用http://blog.csdn.net/davidbeckham2901/article/details/7397447 中说到的解决方案即可(即采用另外一个交叉编译器)。

    7.测试:

    最后,测试一下刚才编译的内核:emulator -avd myavd -kernel ~/goldfish/arch/arm/boot/zImageemulator若系统找不到,可以去android SDK中某文件夹找到,加入系统PATH即可。 -avd后面的参数 myavd即为模拟器的名字,这个我是在eclipse中的模拟器管理中新建的一个模拟器,用那个模拟器的名字即可。 -kernel后面的参数就找到刚才编译出的内核的路径。
    若启动模拟器失败,可尝试关闭后再启动。第一次启动模拟器时可能需要等待比较长的时间,3分钟到15分钟不等。

    5. 怎么修改Android 的Linux内核

    Android 产品中,内核格式是Linux标准的zImage,根文件系统采用ramdisk格式。这两者在Android下是直接合并在一起取名为boot.img,会放在一个独立分区当中。这个分区格式是Android自行制定的格式。

    Android开发时,最标准的做法是重新编译于内核和根文件系统,然后调用Android给的命令行文件mkbootimg(out/host/linux-x86/bin/)来打包。

    在制作手机ROM时,有时会单独编译内核或抽出根文件进行修改内容,比如我只编译内核,其余的地方不变。这样重新安装巨大的Android开发环境实在不划算。因此很多boot.img解包工具被人开发出来,这一些工具都是把内核和根文件系统从一个现成的boot.img抽取出来,修发后再次打包还原。

    一.常见的解包工具

    因为boot.img的格式比较简单,它主要分为三大块(有的可能有四块)

    因此很多人开发分析工具,有是linux shell脚本,比如repack-zImage,也有人采用perl,还有C语言编写的 unbootimg,

    我使用的是在源码位置system/core/mkbootimg/ 下的 mkbootimg。为了简化,蓝点工坊把与mkbootimg中打包工具和解包工具以及所包含的libmincrpty库抽出来,并且重写一个Makefile,作为开源项目。
    使用者只需要在linux(需安装gcc,make,一般是标配)或windows(需要安装mingw)的命令行执行make,即可产生可执行文件mkbootimg ,unpackbootimg。

    二.解/打包工具使用

    解包工具:unpackbootimg

    常见格式
    unpackbootimg -i .\tmp\boot.img -o .\out

    这一句命令行表示把boot.img解包,所有文件输出到out目录下

    它会解压出如下文件:
    boot.img-zImage (内核文件)
    boot.img-ramdisk.gz (根文件系统打包文件)
    boot.img-cmdline (mkbootimg cmdline参数)
    boot.img-pagesize (mkbootimg pagesize参数)

    boot.img-base (mkbootimg base参数)

    打包工具:mkbootimg (Android自带)

    常见的命令格式:
    ./mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel zImage --ramdisk boot/boot.img-ramdisk.gz -o boot.img --base 02e00000
    这句含义是把内核文件zImage和boot目录下的根文件压缩包 boot.img-ramdisk.gz打包成boot.img.
    其中cmdline和base的值均来源于unpackbootimg的结果

    6. 在编译android内核的时候出现下面的错误,是怎么回事

    解决方案:找到工程中Makefile文件,将其中 “-m64" 字符串删除即可。
    原因:gcc 3.4 或者更高版本,已经将其去除了,所以会出现上面的错误!
    去android源代码网站找楼主编译android版本的对应GCC,安装后重新编译

    7. 编译Android源码和内核源码的区别

    Android源码编译之后生成的是ramdisk.img、system.img和userdata.img。而内核源码编译完成之后生成的是ZImage。在一般情况下Android源码是不带有内核源码的,但是带有一个镜像,这样在编译完Android源码之后就可以模拟器启动了,如果要更换系统的内核,此时将高版本的内核源码进行编译生成ZImage然后替换Android系统的的镜像。这样使用模拟器启动之后就可以查看内核是否已经被刷新。
    请注意,android源码和kernel源码是分开下载的

    编译android源码
    进入source目录下,执行make 即可。
    编译完成后,可以在源码目录的out/target/proct/generic/目录下看到编译好的ramdisk.img、system.img和userdata.img了。

    编译内核源码
    新建Kernel/goldfish,在这个目录下进行编译

    8. 如何在32位ubuntu11.10 下编译android 4.0.1源码和goldfish内核

    一准备工作

    1安装javasdk6
    (1)从jdk官方网站http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u29-download-513648.html下载jdk-6u29-linux-i586.bin文件。
    (2)执行jdk安装文件

    [html] view plain
    $chmod a+x jdk-6u29-linux-i586.bin
    $jdk-6u29-linux-i586.bin

    (3)配置jdk环境变量

    [html] view plain
    $sudo vim /etc/profile
    [html] view plain
    #JAVAEVIRENMENT
    exportJAVA_HOME=/usr/lib/java/jdk1.6.0_29
    exportJRE_HOME=$JAVA_HOME/jre
    exportCLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
    exportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

    保存后退出编辑,并重启系统。
    2安装依赖包

    [html] view plain
    $sudo apt-get install git-core gnupg flex bison gperf build-essential\
    zipcurlzlib1g-devlibc6-devlib32ncurses5-devia32-libs\
    x11proto-core-devlibx11-devlib32readline5-devlib32z-dev\
    libgl1-mesa-devg++-multilibmingw32tofrodospython-markdown\
    libxml2-utils

    3用repo工具下载源码
    (1)初始化repo

    [html] view plain
    $cd ~
    $mkdir bin
    $curlhttps://dl-ssl.google.com/dl/googlesource/git-repo/repo>~/bin/repo
    $chmod a+x ~/bin/repo
    $exportPATH=$PATH:~/bin(导出环境变量)

    (2)下载android最新源码

    [html] view plain
    $mkdir android
    $cd android
    $ repo init -u https://android.googlesource.com/platform/manifest -bandroid-4.0.1_r1
    ...(输入用户名和邮箱名)
    $repo sync -j5
    ...(此处用5个线程开始下载源码,下载过程及其漫长,需要耐心等待)

    二 编译源码
    1开始编译

    [html] view plain
    $source build/envsetup.sh
    includingdevice/samsung/maguro/vendorsetup.sh

    includingdevice/samsung/tuna/vendorsetup.sh

    includingdevice/ti/panda/vendorsetup.sh

    includingsdk/bash_completion/adb.bash

    $make-j4(此处用4个线程编译)

    编译完成后,会看到类似的输出:

    [html] view plain
    Targetramdisk:out/target/proct/generic/ramdisk.img
    Targetuserdatafsimage:out/target/proct/generic/userdata.img
    Installedfilelist:out/target/proct/generic/installed-files.txt

    2编译遇到的问题
    编译错误:

    [html] view plain
    <命令行>:0:0:错误:“_FORTIFY_SOURCE”重定义[-Werror]

    <built-in>:0:0:附注: 这是先前定义的位置

    cc1plus:所有的警告都被当作是错误

    make:*** [out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o]错误 1

    原因:
    因机器上的gcc版本过高,需替换成4.4.6重新进行编译。
    解决方法:
    1)安装4.4版本的gcc和g++

    [html] view plain
    $ sudo apt-get install gcc-4.4
    $ sudo apt-get install g++-4.4

    2)设置gcc版本,使gcc链接到gcc-4.4

    [html] view plain
    $ ls -l /usr/bin/gcc*

    lrwxrwxrwx 1 root root 7 2011-11-01 23:56 /usr/bin/gcc -> gcc-4.6

    -rwxr-xr-x 1 root root 224544 2011-10-06 05:47 /usr/bin/gcc-4.4

    -rwxr-xr-x 1 root root 302104 2011-09-17 05:43 /usr/bin/gcc-4.6

    $ cd /usr/bin
    $ sudo mv gcc gcc.bak
    $ sudo ln -s gcc-4.4 gcc

    3)设置g++版本,使g++链接到g++-4.4

    [html] view plain
    $ sudo mv g++ g++.bak
    $ sudo ln -s g++-4.4 g++

    4)设置完毕后,重新进行编译即可

    3从模拟器启动编译后的镜像文件
    1)设置环境变量:

    [html] view plain
    export PATH=~/android/out/host/linux-x86/bin:$PATH

    export ANDROID_PRODUCT_OUT=~/android/out/target/proct/generic

    其中linux-x86/bin存放模拟器emulator工具,proct/generic存在编译后的镜像文件。

    2)启动模拟器

    [html] view plain
    $emulator

    emulator:WARNING: system partition size adjusted to match image file (162 MB >66 MB)

    启动后的截图:

    三 编译androidgoldfish内核
    1)进入android4.0.1源码目录,下载goldfish内核源码

    [html] view plain
    $ mkdir kernel
    $ cd kernel
    $ git clone http://android.googlesource.com/kernel/goldfish.git
    $ cd goldfish
    $ git branch -a
    * (no branch)

    master

    remotes/origin/HEAD -> origin/master

    remotes/origin/android-goldfish-2.6.29

    remotes/origin/master

    $ git checkout remotes/origin/android-goldfish-2.6.29

    2)修改Makefile

    [html] view plain
    goldfish$ gedit Makefile

    修改

    [html] view plain
    ARCH ?=$(SUBARCH)
    CROSS_COMPILE ?=



    [html] view plain
    ARCH ?=arm
    CROSS_COMPILE ?=arm-eabi-

    3)导出交叉编译器目录为环境变量
    $ export PATH=$PATH:~/android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin

    4)编译内核

    [html] view plain
    goldfish$ make goldfish_armv7_defconfig

    goldfish$ make

    编译完成后,可看到类似如下的输出:

    [html] view plain
    OBJCOPY arch/arm/boot/zImage
    Kernel: arch/arm/boot/zImage is ready

    5)从模拟器中启动内核镜像

    [html] view plain
    $emulator -kernel ~/android/kernel/goldfish/arch/arm/boot/zImage &

    启动模拟器后,可从Settings->System->AboutPhone中查看内核版本信息。

    热点内容
    三位数乘两位数速算法 发布:2025-05-12 13:05:48 浏览:390
    暴风影音缓存在哪里 发布:2025-05-12 12:42:03 浏览:535
    access数据库exe 发布:2025-05-12 12:39:04 浏览:623
    五开的配置是什么 发布:2025-05-12 12:36:37 浏览:359
    加密ovpn 发布:2025-05-12 12:01:55 浏览:45
    python练手项目 发布:2025-05-12 11:14:07 浏览:123
    压缩听算音频 发布:2025-05-12 10:58:12 浏览:801
    数据库系统报告 发布:2025-05-12 10:43:17 浏览:603
    日产高配有哪些配置 发布:2025-05-12 10:32:16 浏览:475
    大众朗逸哪个配置值得入手 发布:2025-05-12 10:31:20 浏览:505