• 点击上方“开发者技术前线”,选择“星标”15:45在看真爱本文内容来自「开源中国」手机厂商们请不要再自行修改Linux内核代码了Google Project Zero(GPZ)团队近...

    点击上方“开发者技术前线”,选择“星标”

    15:45 在看 真爱

    本文内容来自「开源中国」

    手机厂商们请不要再自行修改Linux内核代码了

    Google Project Zero(GPZ)团队近期报告了三星 Android 内核上的漏洞,并指出,三星试图通过修改内核代码来抵御攻击,反而因此暴露出更多安全漏洞。

    来自 GPZ 的研究员 Jann Horn 表示,不仅仅是三星,不少智能手机制造商都会向下游添加自定义驱动程序,以此直接通过硬件访问 Android 的 Linux 内核。但其实,最好还是应当使用 Linux 内核中已经存在的安全功能。

    Horn 在 Galaxy A50 的 Android 内核中发现的正是上述类型的错误,原本旨在降低内核安全性的措施却引发了内存损坏的问题。具体来讲,这些漏洞允许在运行 Android 9.0 和 10.0 的某些 Galaxy 设备上“执行任意可能的代码”。

    Google 于去年 11 月向三星报告了该错误,三星在 2 月刚刚发布的针对 Galaxy 手机的更新中进行了修复。

    目前,一些 Android 手机通过专用的帮助程序来访问硬件,这些帮助程序在 Android 中统称为硬件抽象层(HAL)。但在 Horn 看来,手机厂商修改 Linux 内核核心部分的工作方式反而破坏了其原有的攻击锁定性能。就像三星一样,某些被添加的自定义功能是不必要的,完全可以删去,也不会造成任何影响。

    因此,他建议手机制造商使用 Linux 已经支持的直接硬件访问功能,而无需再自定义 Linux 内核代码。如果要进行修改的话,“我认为,特定于设备的内核修改最好是放到上游或移入用户空间驱动中,在这里它们可以用更安全的编程语言和/或沙箱实现,同时也不会使更新的内核版本复杂化。

    谷歌发布了首个 Android 11 的开发者预览版本

    谷歌发布了首个 Android 11 的开发者预览版本。预览版包括面向开发人员的预览 SDK,以及官方的 Android 模拟器,目前只能与多款 Pixel 设备配合使用。

    通常开发者预览版会在每年 3 月推出,这是迄今为止最早发布的一次。去年谷歌启动了 Android Beta 计划,但今年并没有将第一个预览版本作为 Beta 发布,而是只能手动下载和刷新。也就是说 Android 11 尚未为其他采用者做准备,仅针对开发人员。

    Android 11 将带来更好的 5G 体验,以及一系列关于对话功能的改进;对针孔和瀑布屏的支持也是一大亮点。神经网络 API(NNAPI)专为在 Android 设备上运行用于计算机学习的计算密集型操作而设计,在新版本中也得到了优化。

    此外,谷歌提供了不少关于隐私和安全的新举措。包括授予一次性临时权限、围绕特定路径范围进行存储、扩展对生物识别的支持等。

    在系统方面,Android 11 添加了 12 个新的可更新模块,其中重点包括一个权限模块、一个媒体提供者模块,和一个神经网络 API 模块。新版本还尝试通过提高应用程序的兼容性来使更新速度更快、更流畅,使测试更轻松。

    最后,在 Android 11 中,服务器和 Wi-Fi 的连接性得到了增强;图像和相机有了各方面的改进;视频也迎来了低延迟解码。

    Android 11 的公开测试版预计将于 5 月份开放,可能会与 Google 开发者大会即 Google I/O 同时进行。谷歌提供的发布时间表如下:

    • 2月:Developer Preview 1(早期的基线构建着重于开发人员的反馈,包括新功能、API 和行为更改)

    • 3月:Developer Preview 2(具有附加功能、API 和行为更改的增量更新)

    • 4月:Developer Preview 3(稳定性和性能的增量更新)

    • 5月:Beta 1(初始 Beta 版本,向注册 Android Beta 的早期采用者提供更新)

    • 6月:Beta 2(平台稳定性里程碑,最终的 API 和行为,开始发布 Play)

    • Q3:Beta 3(发布候选版本)

    • Q3:最终版本(向 AOSP 和生态系统正式发布 Android 11)

    开发人员预览版可在 Android 11 开发者网站 获得,更多详情请查看 Android 开发者博客

    END

    后台回复“电子书” “资料” 领取一份干货,数百技术电子书等你

    开发者技术前线 ,汇集技术前线快讯和关注行业趋势,大厂干货,是开发者经历和成长的优秀指南。

    点个在看吧

    展开全文
  • Android rom移植一

    2020-06-01 18:02:41
    写这篇文章时想起我的第一部Android手机HTC Hero。买回来后,同事告诉我可以去刷机玩玩。刷机,怎么刷?同事说,你个土人,刷机都不知道,很多刷机论坛的,你去逛逛,挺简单的。我去逛了逛机锋论坛(那时还不知道...

    文章来自小米社区,原文地址:https://www.xiaomi.cn/post/10984220

    写这篇文章时想起我的第一部Android手机HTC Hero。买回来后,同事告诉我可以去刷机玩玩。刷机,怎么刷?同事说,你个土人,刷机都不知道,很多刷机论坛的,你去逛逛,挺简单的。我去逛了逛机锋论坛(那时还不知道MIUI),打开一看,什么recovery, radio, root各种词汇扑面而来,oh my lady gaga,这么复杂。但是为了不被鄙视,而且闲着也是闲着,还是刷着玩玩吧。后来就结识MIUI来到了小米。这是题外话,咱们言归正传。

    在这纷纷扰扰的Android世界里,如何找到那条刷机大道呢,或许它只是个传说,我们只是一直在探索。让我们从零开始来看一看,看能发现点什么。

    1. bootloader

      当我们拿到一款手机,第一件事应该就是按下电源键开机,那么从开机到进入到桌面程序这中间发生了些什么呢,我们从下面这张简化了的手机结构图开始:
      在这里插入图片描述
      注意:该结构图并不反映手机的实际分区顺序和位置,只是一个逻辑结构图。

      大家可以简单的把手机的ROM存储类比为我们电脑上的硬盘,这个硬盘被分成了几个分区:bootloader分区,boot分区,system分区等等。后面我们会逐渐介绍各个分区的用途。所谓的刷机我们可以简单的理解成把软件安装在手机的某些分区中,类似于我们在电脑上安装Windows系统。

      当按下电源键手机上电启动后,首先从bootloader分区中一个固定的地址开始执行指令,如图所示,bootloader分区分成两个部分,分别叫做primary bootloader和secondary stage bootloader。Primary bootloader主要执行硬件检测,确保硬件能正常工作后将secondary stage bootloader拷贝到内存(RAM)开始执行。Secondary stage bootloader会进行一些硬件初始化工作,获取内存大小信息等,然后根据用户的按键进入到某种启动模式。比如说大家所熟知的通过电源键和其它一些按键的组合,可以进入到recovery,fastboot或者选择启动模式的启动界面等。我们在论坛上看到的bootloader通常指的就是secondary stage bootloader。不过我们不需要关心太多的细节,可以简单的理解为bootloader就是一段启动代码,根据用户按键有选择的进入某种启动模式。

      fastboot模式:fastboot是android定义的一种简单的刷机协议,用户可以通过fastboot命令行工具来进行刷机。比如说fastboot flash boot boot.img这个命令就是把boot.img的内容刷写到boot分区中。一般的手机厂商不直接提供fastboot模式刷机,而是为了显示他们的牛B之处,总是会提供自己专有的刷机工具和刷机方法。比如说三星的Odin,摩托的RSD,华为的粉屏等等。但是其本质实际上是相同的,都是将软件直接flash到各个分区中。

      recovery模式:recovery是android定义的一个标准刷机协议。当进入recovery模式时,secondary stage bootloader从recovery分区开始启动,recovery分区实际上是一个简单的Linux系统,当内核启动完毕后,开始执行第一个程序init(init程序是Linux系统所有程序的老祖宗)。init会启动一个叫做recovery的程序(recovery模式的名称也由此而来)。通过recovery程序,用户可以执行清除数据,安装刷机包等操作。一般的手机厂商都提供一个简单的recovery刷机,而大名鼎鼎的CWM Recovery就是一个加入了很多增强功能的recovery,要想用上CWM Recovery前提是recovery分区可以被刷写。大家在论坛上看到的解锁bootloader,通常指的就是解锁recovery或fastboot,允许刷写recovery分区,这样大家就可以用上喜爱的CWM Recovery了。

      手机除了普通的CPU芯片以外,还有MODEM处理器芯片。该芯片的功能就是实现手机必需的通信功能,大家通常所的刷RADIO就是刷写modem分区。

    2. 正常启动

      当我们只是按下电源键开机时,会进入正常启动模式。Secondary stage bootloader会从boot分区开始启动。Boot分区的格式是固定的,首先是一个头部,然后是Linux内核,最后是用作根文件系统的ramdisk。

      一般针对每个机型的完整刷机包中会有一个boot.img文件,这就是boot分区镜像文件。如何编辑该镜像文件可以参照这篇文章http://android-dls.com/wiki/inde … Re-Pack_Boot_Images。

      当Linux内核启动完毕后,就开始执行根文件系统中的init程序,init程序会读取启动脚本文件(init.rc和init.xxxx.rc)。启动脚本文件的格式大家可以在网上找到很多参考资料,这里就不写了,而且我们在原厂ROM上移植MIUI的原则是不修改boot分区,因为有一些机型无法修改boot分区。

      根文件系统中有一个重要的配置文件,叫default.prop,该文件的内容一般为:

    #

    #ADDITIONAL_DEFAULT_PROPERTIES

    #
    ro.secure=1

    ro.allow.mock.location=1

    ro.debuggable=0

    persist.service.adb.enable=1。

    文件中的每一行对某个属性赋值,在后续的文章中我们还会谈到属性。这里面大家需要注意的两个属性:ro.secure和ro.debuggable。如果ro.secure=0允许我们运行adb root命令。在下一篇我们会详细介绍adb,这是我们做ROM移植的利器。通常大家说得内核ROOT指的就是ro.secure=0。ROOT权限只是的手机上有一个名为授权管理的程序(Superuser.apk)可以授予程序root用户的权限。ro.deguggable=1允许调试系统APP。

    init程序读取启动脚本,执行脚本中指定的动作和命令,脚本中的一部分是运行system分区的程序,下一节我们就来看看system分区的结构。

    1. system分区

      在讲system分区之前,我们先来看下面这张Android的软件系统架构图。
      在这里插入图片描述

    从上到下依次为:

    核心应用层:这一层就是大家平常所接触的各种各样的系统自带应用,比如联系人,电话,音乐等。应用层往下就是开发人员所接触的。

    框架层:这一层是Android系统的核心,它提供了整个Android系统运作的机制,像窗口管理,程序安装包管理,开发人员所接触的Activity, Service, broadcast等等。

    JNI层:JNI层是Java程序和底层操作系统通信的一个机制,它使得Java代码可以调用C/C++代码来访问底层操作系统的API。

    Dalvik虚拟机:Android开发使用Java语言,应用程序的Java代码会被编译成dalvik虚拟机字节码,这些字节码由dalvik虚拟机解释执行。

    本地库:本地库一般是由C/C++语言所开发,直接编译成相应CPU的机器码,这其中包含标准C库,用以绘制图形的skia库,浏览器核心引擎webkit等。

    HAL:硬件抽象层,为了和各个厂家的不同硬件工作,Android定义了一套硬件接口,比如说为了使用相机,厂家的相机驱动必须提供的接口方法。这样使得上层的代码可以独立于不同的硬件运行。

    厂家适配层:本来Android定义的HAL层是直接和厂家提供的设备驱动打交道的,但是目前厂家不想开源HAL部分的代码,因此很多厂家都提供了一个我称之为厂家适配层的代码,这样在HAL层接口的实现只是一个简单的对厂家适配层接口函数的调用。

    内核:这一层就是大家熟悉的Linux内核,内核中包含有各种硬件驱动,这些驱动不同的手机厂商不同的手机是不一样的。Linux内核是支持驱动模块化机制的,简单的说就是允许用户动态的加载或者卸载某个硬件驱动,但是目前来看,手机厂商除了提供WIFI驱动单独加载外,其它驱动都是和内核绑定在一起的。

    从这张软件结构图来看,除了内核是放在boot分区外,其它层的代码都是在system分区中。

    下面结合这张图来介绍system分区的主要目录内容:

    system/app: app目录下存放的是核心应用,也就是大家熟知的系统APP,这些系统自带的程序是不能简单的卸载的,要通过一些特殊的方式才能删除(大家熟悉的一种方法是用RE文件管理器)。

    system/lib: lib目录下存放的是组成JNI层,Dalvik虚拟机,本地库,HAL层和厂家适配层的所有动态链接库(.so文件)。

    system/framework: 该目录下存放的是框架层的JAR包,其中对MIUI移植来说有3个最重要的JAR包(framework.jar, android.policy.jar, services.jar)。后续的文章会重点介绍这3个包。

    system/fonts: 该目录下存放的是系统缺省的字体文件。

    system/media:该目录下存放的是系统所使用的各种媒体文件,比如说开机音乐,动画,壁纸文件等。不同的手机该目录的组织方式可能不一样。如何修改这些文件请参考网上对应机型形形色色的教程,这里不再赘叙。

    system/bin: 该目录下存放的是一些可执行文件,基本上是由C/C++编写的。其中有一个重要的命令叫app_process下一节单独介绍。

    system/xbin: 该目录下存放的是一些扩展的可执行文件,既该目录可以为空。大家常用的busybox就放在该目录下。Busybox所建立的各种符号链接命令都是放在该目录。

    system/build.prop: build.prop和上节说得根文件系统中的default.prop文件格式一样,都称为属性配置文件。它们都定义了一些属性值,代码可以读取或者修改这些属性值。属性值有一些命名规范:

    ro开头的表示只读属性,即这些属性的值代码是无法修改的。

    persist开头的表示这些属性值会保存在文件中,这样重新启动之后这些值还保留。

    其它的属性一般以所属的类别开头,这些属性是可读可写的,但是对它们的修改重启之后不会保留。

    很多ROM制作者都会修改一下build.prop信息,里面的一些以ro.build开头的属性就是你在手机设置中的关于手机里看到的。可以通过修改build.prop文件来将这个ROM打上自己的印记(XXX所修改)。我见过一个只是删了system/app的一些程序,然后修改build.prop中的ro.build.display.id和ro.build.version.incremental中的两个属性值打上自己的大名的ROM。

    system/etc: 该目录存放一些配置文件,和属性配置文件不一样,这下面的配置文件可能稍微没那么的有规律。一般来说,一些脚本程序,还有大家所熟悉GPS配置文件(gps.conf)和APN配置文件(apns-conf.xml)放在这个目录。像HTC将相机特效所使用的一些文件也放在这个目录下。

    1. Zygote(app_process)

      上一节提到init会执行一个重要的命令程序叫app_process,一般大家称之为Zygote。(Zygote是卵的意思,所有的Android进程都是由它生出来的)。Zygote首先会加载dalvik虚拟机,然后产生一个叫做system_server的进程。system_server顾名思义被称作Android的系统服务程序,它主要管理整个android系统。system_server启动完成后开始寻找一个叫做启动器的程序,找到之后由zygote开始启动执行启动器,这就是我们常见到的桌面程序。

    上面描述的是一个相当简化的启动过程,了解这些对于适配MIUI基本上就够了,如果大家对这些想进一步了解的话,请关注市面上各种Android内幕书籍。

    1. data和cache分区

      这一节简单的介绍一下data和cache分区。当我们开机进入桌面程序后,一般来说我们都会下载安装一些APP,这些APP都安装在data/app目录下。所有的Android程序生成的数据基本上都保存在data/data目录下。wipe data实质上就是格式化data分区,这样我们安装的所有APP和程序数据就都丢失了。

      cache分区从名字上来看是用来缓存一些文件的,比如说一些音乐下载的临时文件,或者下载管理下载的内容基本上放在这个分区。

    2. 小结

      本章主要是介绍了一下Android手机的硬软件结构以及主要分区的内容,并简要的介绍了一些开机启动过程。了解这些内容有助于我们从整体上理解ROM移植。

    展开全文
  • 前面的博客中已经记录了Nexus 5手机Android 4.4.4 r1源码的编译基于ubuntu14.04.5,后面来学习一下Android内核源码的编译基于Nexus 5手机。 一、Android内核源码的下载 有关Android内核源码的下载信息可以参考...

    本文博客链接:http://blog.csdn.net/qq1084283172/article/details/54880488


    前面的博客中已经记录了Nexus 5手机的Android 4.4.4 r1源码的编译基于 ubuntu 14.04.5,后面在该编译环境下来学习一下Android内核源码的编译基于Nexus 5手机。


    一、Android内核源码的下载和编译

    有关Android内核源码的下载信息可以参考谷歌官网的地址https://source.android.com/source/building-kernels.html#downloading-sources(需要翻墙)相关的说明。

    参考谷歌官方的文档了解到 Nexus 5 手机的Android内核源码是在源码分支 https://android.googlesource.com/kernel/msm.git 下。


    Downloading sources


    Download the source for the kernel you want to build using the appropriate git clone command:

    $ git clone https://android.googlesource.com/kernel/common.git
    $ git clone https://android.googlesource.com/kernel/hikey-linaro
    $ git clone https://android.googlesource.com/kernel/x86_64.git
    $ git clone https://android.googlesource.com/kernel/exynos.git
    $ git clone https://android.googlesource.com/kernel/goldfish.git
    $ git clone https://android.googlesource.com/kernel/msm.git
    $ git clone https://android.googlesource.com/kernel/omap.git
    $ git clone https://android.googlesource.com/kernel/samsung.git
    $ git clone https://android.googlesource.com/kernel/tegra.git
    
    • The goldfish project contains the kernel sources for the emulated platforms.
    • The msm project has the sources for ADP1, ADP2, Nexus One, Nexus 4, Nexus 5, Nexus 6, Nexus 5X, Nexus 6P, Nexus 7 (2013), and can be used as a starting point for work on Qualcomm MSM chipsets.
    • The omap project is used for PandaBoard and Galaxy Nexus, and can be used as a starting point for work on TI OMAP chipsets.
    • The samsung project is used for Nexus S, and can be used as a starting point for work on Samsung Hummingbird chipsets.
    • The tegra project is for Xoom, Nexus 7 (2012), Nexus 9, and can be used as a starting point for work on NVIDIA Tegra chipsets.
    • The exynos project has the kernel sources for Nexus 10, and can be used as a starting point for work on Samsung Exynos chipsets.
    • The x86_64 project has the kernel sources for Nexus Player, and can be used as a starting point for work on Intel x86_64 chipsets.
    • The hikey-linaro project is used for HiKey reference boards, and can be used as a starting point for work on HiSilicon 620 chipsets.


    在 前面文章 Android 4.4.4r1源码(基于ubuntu 14.04.5系统编译)根路径下创建 kernel 文件用于存放Nexus 5手机的Android的内核源码。

    androidcode@ubuntu:~$ cd /home/androidcode/AndroidDevlop/android-4.4.4_r1
    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1$ mkdir kernel 
    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1$ cd kernel/


    git clone 克隆远程Android内核源码的版本库到 Android 4.4.4r1源码的根路径下的kernel文件下。由于谷歌官方提供的下载地址需要翻墙,也可以使用清华大学的Android源进行下载 ` git clone https://aosp.tuna.tsinghua.edu.cn/kernel/msm.git`。

    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel$ git clone https://android.googlesource.com/kernel/msm.git
    Cloning into 'msm'...
    remote: Sending approximately 1.37 GiB ...
    remote: Counting objects: 280, done
    remote: Total 5746741 (delta 4780079), reused 5746741 (delta 4780079)
    Receiving objects: 100% (5746741/5746741), 1.37 GiB | 330.00 KiB/s, done.
    Resolving deltas: 100% (4780079/4780079), done.
    Checking connectivity... done.


    git branch 查看Android内核源码的代码版本分支。

    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel$ cd msm
    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel/msm$ git branch
    * master
    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel/msm$ git branch -a
    * master
      remotes/origin/HEAD -> origin/master
      remotes/origin/android-4.4
      remotes/origin/android-4.4.y
      remotes/origin/android-msm-2.6.35
      remotes/origin/android-msm-3.9-usb-and-mmc-hacks
      remotes/origin/android-msm-angler-3.10-marshmallow-dr
      remotes/origin/android-msm-angler-3.10-marshmallow-dr1.5
      remotes/origin/android-msm-angler-3.10-marshmallow-dr1.6
      remotes/origin/android-msm-angler-3.10-marshmallow-dr1.6-1
      remotes/origin/android-msm-angler-3.10-marshmallow-mr1
      remotes/origin/android-msm-angler-3.10-n-mr1-preview-1
      remotes/origin/android-msm-angler-3.10-n-mr1-preview-2
      remotes/origin/android-msm-angler-3.10-n-preview-1
      remotes/origin/android-msm-angler-3.10-n-preview-2
      remotes/origin/android-msm-angler-3.10-n-preview-3
      remotes/origin/android-msm-angler-3.10-n-preview-4
      remotes/origin/android-msm-angler-3.10-n-preview-5
      remotes/origin/android-msm-angler-3.10-nougat
      remotes/origin/android-msm-angler-3.10-nougat-hwbinder
      remotes/origin/android-msm-angler-3.10-nougat-mr0.5
      remotes/origin/android-msm-angler-3.10-nougat-mr1
      remotes/origin/android-msm-angler-3.10-nougat-mr1.1
      remotes/origin/android-msm-anthias-3.10-lollipop-mr1-wear-release
      remotes/origin/android-msm-anthias-3.10-lollipop-wear-release
      remotes/origin/android-msm-anthias-3.10-marshmallow-dr1-wear-release
      remotes/origin/android-msm-anthias-3.10-marshmallow-mr1-wear-release
      remotes/origin/android-msm-asus-3.10-lollipop-mr1-wear-release
      remotes/origin/android-msm-asus-3.10-marshmallow-mr1-wear-release
      remotes/origin/android-msm-bass-3.10-lollipop-mr1-wear-release
      remotes/origin/android-msm-bass-3.10-marshmallow-dr1-wear-release
      remotes/origin/android-msm-bass-3.10-marshmallow-mr1-wear-release
      remotes/origin/android-msm-bass-3.10-marshmallow-mr1-wear-release-1
      remotes/origin/android-msm-bullhead-3.10-marshmallow-dr
      remotes/origin/android-msm-bullhead-3.10-marshmallow-dr-0
      remotes/origin/android-msm-bullhead-3.10-marshmallow-dr1.5
      remotes/origin/android-msm-bullhead-3.10-marshmallow-dr1.6
      remotes/origin/android-msm-bullhead-3.10-marshmallow-mr1
      remotes/origin/android-msm-bullhead-3.10-marshmallow-mr1-eas
      remotes/origin/android-msm-bullhead-3.10-marshmallow-mr2
      remotes/origin/android-msm-bullhead-3.10-n-mr1-preview-1
      remotes/origin/android-msm-bullhead-3.10-n-mr1-preview-2
      remotes/origin/android-msm-bullhead-3.10-n-preview-1
      remotes/origin/android-msm-bullhead-3.10-n-preview-2
      remotes/origin/android-msm-bullhead-3.10-n-preview-3
      remotes/origin/android-msm-bullhead-3.10-n-preview-4
      remotes/origin/android-msm-bullhead-3.10-n-preview-5
      remotes/origin/android-msm-bullhead-3.10-nougat
      remotes/origin/android-msm-bullhead-3.10-nougat-hwbinder
      remotes/origin/android-msm-bullhead-3.10-nougat-mr0.5
      remotes/origin/android-msm-bullhead-3.10-nougat-mr0.6
      remotes/origin/android-msm-bullhead-3.10-nougat-mr1
      remotes/origin/android-msm-bullhead-3.10-nougat-mr1.1
      remotes/origin/android-msm-dory-3.10-kitkat-wear
      remotes/origin/android-msm-dory-3.10-lollipop-mr1-wear-release
      remotes/origin/android-msm-dory-3.10-lollipop-wear-release
      remotes/origin/android-msm-dory-3.10-marshmallow-dr1-wear-release
      remotes/origin/android-msm-dory-3.10-marshmallow-mr1-wear-release
      remotes/origin/android-msm-flo-3.4-jb-mr2
      remotes/origin/android-msm-flo-3.4-kitkat-mr0
      remotes/origin/android-msm-flo-3.4-kitkat-mr1
      remotes/origin/android-msm-flo-3.4-kitkat-mr2
      remotes/origin/android-msm-flo-3.4-l-preview
      remotes/origin/android-msm-flo-3.4-lollipop-mr1
      remotes/origin/android-msm-flo-3.4-lollipop-mr1.1
      remotes/origin/android-msm-flo-3.4-lollipop-mr1.2
      remotes/origin/android-msm-flo-3.4-lollipop-release
      remotes/origin/android-msm-flo-3.4-marshmallow
      remotes/origin/android-msm-flo-3.4-marshmallow-mr1
      remotes/origin/android-msm-flo-3.4-marshmallow-mr2
      remotes/origin/android-msm-gar-3.18-marshmallow-dr1-wear-release
      remotes/origin/android-msm-gar-3.18-marshmallow-mr1-wear-release
      remotes/origin/android-msm-hammerhead-3.4-kitkat-mr1
      remotes/origin/android-msm-hammerhead-3.4-kitkat-mr2
      remotes/origin/android-msm-hammerhead-3.4-kk-fr1
      remotes/origin/android-msm-hammerhead-3.4-kk-fr2
      remotes/origin/android-msm-hammerhead-3.4-kk-r1
      remotes/origin/android-msm-hammerhead-3.4-l-preview
      remotes/origin/android-msm-hammerhead-3.4-lollipop-mr1
      remotes/origin/android-msm-hammerhead-3.4-lollipop-mr1.1
      remotes/origin/android-msm-hammerhead-3.4-lollipop-release
      remotes/origin/android-msm-hammerhead-3.4-m-preview
      remotes/origin/android-msm-hammerhead-3.4-marshmallow
      remotes/origin/android-msm-hammerhead-3.4-marshmallow-mr1
      remotes/origin/android-msm-hammerhead-3.4-marshmallow-mr2
      remotes/origin/android-msm-hammerhead-3.4-marshmallow-mr3
      remotes/origin/android-msm-huawei-3.10-lollipop-mr1-wear-release
      remotes/origin/android-msm-huawei-3.10-lollipop-mr1-wear-release-1
      remotes/origin/android-msm-huawei-3.10-marshmallow-mr1-wear-release
      remotes/origin/android-msm-huawei-3.10-marshmallow-mr1-wear-release-1
      remotes/origin/android-msm-huawei-3.10-marshmallow-mr1-wear-release-2
      remotes/origin/android-msm-lego-3.10-marshmallow-dr
      remotes/origin/android-msm-lenok-3.10-kitkat-wear
      remotes/origin/android-msm-lenok-3.10-lollipop-mr1-wear-release
      remotes/origin/android-msm-lenok-3.10-lollipop-wear-release
      remotes/origin/android-msm-lenok-3.10-marshmallow-mr1-wear-release
      remotes/origin/android-msm-mako-3.4-jb-mr1
      remotes/origin/android-msm-mako-3.4-jb-mr1-fr
      remotes/origin/android-msm-mako-3.4-jb-mr1-kgsl
      remotes/origin/android-msm-mako-3.4-jb-mr1.1
      remotes/origin/android-msm-mako-3.4-jb-mr2
      remotes/origin/android-msm-mako-3.4-kitkat-mr0
      remotes/origin/android-msm-mako-3.4-kitkat-mr1
      remotes/origin/android-msm-mako-3.4-kitkat-mr2
      remotes/origin/android-msm-mako-3.4-lollipop-mr1
      remotes/origin/android-msm-mako-3.4-lollipop-mr1.1
      remotes/origin/android-msm-mako-3.4-lollipop-release
      remotes/origin/android-msm-marlin-3.18-n-mr1-preview-2
      remotes/origin/android-msm-marlin-3.18-nougat-dr1
      remotes/origin/android-msm-marlin-3.18-nougat-hwbinder
      remotes/origin/android-msm-marlin-3.18-nougat-mr1
      remotes/origin/android-msm-marlin-3.18-nougat-mr1-eas-experimental
      remotes/origin/android-msm-moto-3.10-lollipop-mr1-wear-release
      remotes/origin/android-msm-nemo-3.10-marshmallow-dr1-wear-release
      remotes/origin/android-msm-nemo-3.10-marshmallow-mr1-wear-release
      remotes/origin/android-msm-nemo-3.10-n-preview-1-wear-release
      remotes/origin/android-msm-nemo-3.10-n-preview-2-wear-release
      remotes/origin/android-msm-nemo-3.10-n-preview-4-wear-release
      remotes/origin/android-msm-sculpin-3.18-marshmallow-dr1-wear-release
      remotes/origin/android-msm-sculpin-3.18-marshmallow-mr1-wear-release
      remotes/origin/android-msm-seed-3.10-lollipop-mr1
      remotes/origin/android-msm-seed-3.10-marshmallow
      remotes/origin/android-msm-seed-3.10-marshmallow-mr1
      remotes/origin/android-msm-seed-3.10-marshmallow-mr2
      remotes/origin/android-msm-seed-3.10-n-mr1-preview-2
      remotes/origin/android-msm-seed-3.10-n-preview-2
      remotes/origin/android-msm-seed-3.10-n-preview-3
      remotes/origin/android-msm-seed-3.10-n-preview-4
      remotes/origin/android-msm-seed-3.10-n-preview-5
      remotes/origin/android-msm-seed-3.10-nougat
      remotes/origin/android-msm-seed-3.10-nougat-mr1
      remotes/origin/android-msm-seed-3.10-nougat-mr1.1
      remotes/origin/android-msm-shamrock-3.10-nougat-release
      remotes/origin/android-msm-shamu-3.10-lollipop-mr1
      remotes/origin/android-msm-shamu-3.10-lollipop-release
      remotes/origin/android-msm-shamu-3.10-m-preview
      remotes/origin/android-msm-shamu-3.10-marshmallow
      remotes/origin/android-msm-shamu-3.10-marshmallow-mr1
      remotes/origin/android-msm-shamu-3.10-marshmallow-mr1-r0.15
      remotes/origin/android-msm-shamu-3.10-marshmallow-mr2
      remotes/origin/android-msm-shamu-3.10-n-preview-1
      remotes/origin/android-msm-shamu-3.10-n-preview-2
      remotes/origin/android-msm-shamu-3.10-n-preview-3
      remotes/origin/android-msm-shamu-3.10-n-preview-4
      remotes/origin/android-msm-shamu-3.10-n-preview-5
      remotes/origin/android-msm-shamu-3.10-nougat-mr0.5
      remotes/origin/android-msm-shamu-3.10-nougat-mr1.2
      remotes/origin/android-msm-smelt-3.10-lollipop-mr1-wear-release
      remotes/origin/android-msm-smelt-3.10-marshmallow-mr1-wear-release
      remotes/origin/android-msm-sony-cm-jb-3.0
      remotes/origin/android-msm-sparrow-3.10-marshmallow-mr1-wear-release
      remotes/origin/android-msm-sprat-3.10-kitkat-wear
      remotes/origin/android-msm-sprat-3.10-lollipop-mr1-wear-release
      remotes/origin/android-msm-sprat-3.10-lollipop-wear-release
      remotes/origin/android-msm-sprat-3.10-marshmallow-dr1-wear-release
      remotes/origin/android-msm-sprat-3.10-marshmallow-mr1-wear-release
      remotes/origin/android-msm-sturgeon-3.10-marshmallow-dr1-wear-release
      remotes/origin/android-msm-sturgeon-3.10-marshmallow-mr1-wear-release
      remotes/origin/android-msm-sturgeon-3.10-marshmallow-mr1-wear-release-1
      remotes/origin/android-msm-sturgeon-3.10-n-preview-1-wear-release
      remotes/origin/android-msm-sturgeon-3.10-n-preview-2-wear-release
      remotes/origin/android-msm-sturgeon-3.10-n-preview-4-wear-release
      remotes/origin/android-msm-swift-3.18-marshmallow-mr1-wear-release
      remotes/origin/android-msm-wren-3.10-marshmallow-dr1-wear-release
      remotes/origin/android-msm-wren-3.10-marshmallow-mr1-wear-release
      remotes/origin/master


    git checkout 下载适用于Nexus 5手机的Android内核源码到本地文件路径 /home/androidcode/AndroidDevlop/android-4.4.4_r1/kernel/msm 下。当然了也可以使用谷歌官方文档中提供的 git checkout -b 的方法下载相应的Android内核源码到本地编译环境的相应文件夹下。

    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel/msm$ git checkout origin/android-msm-hammerhead-3.4-kk-r1
    Checking out files: 100% (41847/41847), done.
    Note: checking out 'origin/android-msm-hammerhead-3.4-kk-r1'.
    
    You are in 'detached HEAD' state. You can look around, make experimental
    changes and commit them, and you can discard any commits you make in this
    state without impacting any branches by performing another checkout.
    
    If you want to create a new branch to retain commits you create, you may
    do so (now or later) by using -b with the checkout command again. Example:
    
      git checkout -b new_branch_name
    
    HEAD is now at 9eb14ba... msm: mdss: wait for ping pong during unblank kickoff
    

    Nexus 5手机的Android内核源码的所有分支:

      remotes/origin/android-msm-hammerhead-3.4-kitkat-mr1
      remotes/origin/android-msm-hammerhead-3.4-kitkat-mr2
      remotes/origin/android-msm-hammerhead-3.4-kk-fr1
      remotes/origin/android-msm-hammerhead-3.4-kk-fr2
      remotes/origin/android-msm-hammerhead-3.4-kk-r1
      remotes/origin/android-msm-hammerhead-3.4-l-preview
      remotes/origin/android-msm-hammerhead-3.4-lollipop-mr1
      remotes/origin/android-msm-hammerhead-3.4-lollipop-mr1.1
      remotes/origin/android-msm-hammerhead-3.4-lollipop-release
      remotes/origin/android-msm-hammerhead-3.4-m-preview
      remotes/origin/android-msm-hammerhead-3.4-marshmallow
      remotes/origin/android-msm-hammerhead-3.4-marshmallow-mr1
      remotes/origin/android-msm-hammerhead-3.4-marshmallow-mr2
      remotes/origin/android-msm-hammerhead-3.4-marshmallow-mr3
    


    对于Android的源码与Android内核源码版本的对应和适用关系,暂时还没有弄清楚,也不知道怎么根据Nexus 5手机的上面的Android内核的型号来下载对应的Android内核源码,经过谷歌查询,https://groups.google.com/forum/#!topic/android-building/ynU-SnGCTGs 讨论给出了一种方法,适用Nexus系列手机上的Android内核的版本号进行Android内核源码的下载。



    有关Android内核源码的版本与Android系统源码选择下载的一些参考依据。

    Platform Codenames, Versions, API Levels, and NDK Releases


    The code names match the following version numbers, along with API levels and NDK releases provided for convenience:

    Code name Version API level
    Nougat 7.1 API level 25
    Nougat 7.0 API level 24
    Marshmallow 6.0 API level 23
    Lollipop 5.1 API level 22
    Lollipop 5.0 API level 21
    KitKat 4.4 - 4.4.4 API level 19
    Jelly Bean 4.3.x API level 18
    Jelly Bean 4.2.x API level 17
    Jelly Bean 4.1.x API level 16
    Ice Cream Sandwich 4.0.3 - 4.0.4 API level 15, NDK 8
    Ice Cream Sandwich 4.0.1 - 4.0.2 API level 14, NDK 7
    Honeycomb 3.2.x API level 13
    Honeycomb 3.1 API level 12, NDK 6
    Honeycomb 3.0 API level 11
    Gingerbread 2.3.3 - 2.3.7 API level 10
    Gingerbread 2.3 - 2.3.2 API level 9, NDK 5
    Froyo 2.2.x API level 8, NDK 4
    Eclair 2.1 API level 7, NDK 3
    Eclair 2.0.1 API level 6
    Eclair 2.0 API level 5
    Donut 1.6 API level 4, NDK 2
    Cupcake 1.5 API level 3, NDK 1
    (no code name) 1.1 API level 2
    (no code name) 1.0 API level 1

    因此,这里Nexus 5手机的Android 4.4.4 r1 源码,选择下载的Android内核源码的版本为 android-msm-hammerhead-3.4-kk-r1


    下载编译Android内核源码的编译链接工具,在编译Android内核源码的时候需要配置该编译连接工具的文件路径。

    Downloading a prebuilt gcc


    Ensure the prebuilt toolchain is in your path:

    $ export PATH=$(pwd)/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin:$PATH

    or

    $ export PATH=$(pwd)/prebuilts/gcc/darwin-x86/arm/arm-eabi-4.6/bin:$PATH

    On a Linux host, if you don't have an Android source tree, you can download the prebuilt toolchain from:

    $ git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6


    下载Android内核源码的编译链接工具到Android内核源码的msm文件夹下,选择下载的编译链接的工具的版本为arm-eabi-4.7。

    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel/msm$ git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/
    Cloning into 'arm-eabi-4.7'...
    remote: Sending approximately 37.12 MiB ...
    remote: Counting objects: 39, done
    remote: Total 218 (delta 53), reused 218 (delta 53)
    Receiving objects: 100% (218/218), 37.12 MiB | 223.00 KiB/s, done.
    Resolving deltas: 100% (53/53), done.
    Checking connectivity... done.

    谷歌官方 https://source.android.com/source/building-kernels.html#building 给出的编译Android内核源码的方法的参考说明,但是是arm64的Android内核源码的编译配置。


    Building the kernel


    When you know the last commit message for a kernel and have successfully downloaded the kernel source and prebuilt gcc, you are ready to build the kernel. The following build commands use the hikey kernel:

    $ export ARCH=arm64
    $ export CROSS_COMPILE=aarch64-linux-android-
    $ cd hikey-linaro
    $ git checkout -b android-hikey-linaro-4.1 origin/android-hikey-linaro-4.1
    $ make hikey_defconfig
    $ make
    

    To build a different kernel, simply replace hikey-linaro with the name of the kernel you want to build.


    在编译Android内核源码之前,通过命令行设置指定目标设备的体系架构和交叉编译器。当然也可以通过修改Android内核源码的Makefile文件来设置 ARCH和CROSS_COMPILE的值来配置,但是感觉比较麻烦。在Android内核源码的 msm 文件下创建 run_this_android.sh 脚本文件。

    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel/msm$ gedit run_this_android.sh


    在run_this_android.sh 脚本文件中添加下面的文件内容(pwd命令的意思是当前文件目录下):

    export CC=$(pwd)/arm-eabi-4.7/bin/arm-eabi-
    export CROSS_COMPILE=$(pwd)/arm-eabi-4.7/bin/arm-eabi-
    
    export ARCH=arm
    export SUBARCH=arm


    然后保存脚本文件 run_this_android.sh并关闭文件,赋予该脚本文件以可执行权限,然后执行该脚本文件设置编译Android内核源码需要的临时环境变量。

    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel/msm$ chmod +x run_this_android.sh
    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel/msm$ source run_this_android.sh


    根据谷歌官方的参考文档 执行 make hammerhead_defconfig 命令生成后面Android内核编译需要配置文件.config文件中,.config文件是一个隐藏目录,保存着各个目录下Kconfig文件的配置,然后执行 make 编译Android内核源码。


    Selecting a kernel

    This table lists the name and locations of the kernel sources and binaries:

    Device Binary location Source location Build configuration
    hikey device/linaro/hikey-kernel kernel/hikey-linaro hikey_defconfig
    angler device/huawei/angler-kernel kernel/msm angler_defconfig
    bullhead device/lge/bullhead-kernel kernel/msm bullhead_defconfig
    shamu device/moto/shamu-kernel kernel/msm shamu_defconfig
    fugu device/asus/fugu-kernel kernel/x86_64 fugu_defconfig
    volantis device/htc/flounder-kernel kernel/tegra flounder_defconfig
    hammerhead device/lge/hammerhead-kernel kernel/msm hammerhead_defconfig
    flo device/asus/flo-kernel/kernel kernel/msm flo_defconfig
    deb device/asus/flo-kernel/kernel kernel/msm flo_defconfig
    manta device/samsung/manta/kernel kernel/exynos manta_defconfig
    mako device/lge/mako-kernel/kernel kernel/msm mako_defconfig
    grouper device/asus/grouper/kernel kernel/tegra tegra3_android_defconfig
    tilapia device/asus/grouper/kernel kernel/tegra tegra3_android_defconfig
    maguro device/samsung/tuna/kernel kernel/omap tuna_defconfig
    toro device/samsung/tuna/kernel kernel/omap tuna_defconfig
    panda device/ti/panda/kernel kernel/omap panda_defconfig
    stingray device/moto/wingray/kernel kernel/tegra stingray_defconfig
    wingray device/moto/wingray/kernel kernel/tegra stingray_defconfig
    crespo device/samsung/crespo/kernel kernel/samsung herring_defconfig
    crespo4g device/samsung/crespo/kernel kernel/samsung herring_defconfig


    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel/msm$ make hammerhead_defconfig
    #
    # configuration written to .config
    #
    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel/msm$ make -j4


    Android内核源码编译成功了。

      OBJCOPY arch/arm/boot/Image
      Kernel: arch/arm/boot/Image is ready
      AS      arch/arm/boot/compressed/head.o
      GZIP    arch/arm/boot/compressed/piggy.gzip
      CC      arch/arm/boot/compressed/misc.o
      CC      arch/arm/boot/compressed/decompress.o
      CC      arch/arm/boot/compressed/string.o
      SHIPPED arch/arm/boot/compressed/lib1funcs.S
      SHIPPED arch/arm/boot/compressed/ashldi3.S
      AS      arch/arm/boot/compressed/lib1funcs.o
      AS      arch/arm/boot/compressed/ashldi3.o
      AS      arch/arm/boot/compressed/piggy.gzip.o
      LD      arch/arm/boot/compressed/vmlinux
      OBJCOPY arch/arm/boot/zImage
      Kernel: arch/arm/boot/zImage is ready
      CAT     arch/arm/boot/zImage-dtb
      Kernel: arch/arm/boot/zImage-dtb is ready


    查看Android内核源码编译生成的文件。

    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel/msm$  ls arch/arm/boot/  
    bootp       msm8974-hammerhead-rev-10.dtb   msm8974-hammerhead-rev-c.dtb
    compressed  msm8974-hammerhead-rev-11.dtb   msm8974-hammerhead-rev-f.dtb
    dts         msm8974-hammerhead-rev-11j.dtb  zImage
    Image       msm8974-hammerhead-rev-a.dtb    zImage-dtb
    install.sh  msm8974-hammerhead-rev-b.dtb
    Makefile    msm8974-hammerhead-rev-bn.dtb


    二、将编译成功的Android内核源码产生的新内核文件替换原来的内核文件

    谷歌文件中提到的 将编译成功的Android内核源码产生的内核文件替换原来内核文件生成新的Android内核 boot.img 文件的方法,但是需要设置相关的参数。


    The image outputs to the arch/arm64/boot/Image directory; the kernel binary outputs to thearch/arm64/boot/dts/hisilicon/hi6220-hikey.dtb fle. Copy the Image directory and the hi6220-hikey.dtb file to the hikey-kernel directory.

    Alternatively, you can include the TARGET_PREBUILT_KERNEL variable while using make bootimage (or any other makecommand line that builds a boot image). This variable is supported by all devices as it is set up via device/common/populate-new-device.sh. For example:

    $ export TARGET_PREBUILT_KERNEL=$your_kernel_path/arch/arm/boot/zImage-dtb
    

    Note: Kernel names differ by device. To locate the correct filename for your kernel, refer todevice/<vendor>/<name> in the kernel source.


    前面的步骤中已经将 android-msm-hammerhead-3.4-kk-r1版本的Android内核文件编译出来了。下面步骤就是解包Android 4.4.4r1源码编译后的产生的 AndroidDevlop/android-4.4.4_r1/out/target/product/hammerhead/boot.img文件,替换原来的Android内核文件为我们前面的操作中编译产生的android-msm-hammerhead-3.4-kk-r1版本的内核文件。


    第一种方法:将编译产生的新的Android内核文件 android-4.4.4_r1/kernel/msm/arch/arm/boot/zImage-dtb 替换掉 Android 4.4.4r1源码中的 android-4.4.4_r1/device/lge/hammerhead-kernel/zImage-dtb文件。这样一来,下次编译Android4.4.4r1源码的时候,使用的就是替换后新的zImage-dtb内核文件。Android 4.4.4r1的源码下载谷歌官方提供的相应的驱动文件进行一次完全编译后,将产生的刷机镜像文件,重启Nexus 5手机进入刷机模式 fastboot flashall -w 刷入手机,Nexus 5手机的内核就更新为我们编译的新Android内核。


    第二种方法:解包Android 4.4.4r1源码编译生成的boot.img文件替换内核文件

    具体的就是对Android 4.4.4r1源码编译后产生的 android-4.4.4_r1/out/target/product/hammerhead/boot.img 镜像文件进行解包替换原来的Android内核文件然后进行打包。解包打包boot.img文件的工具比较多,这里依次整理几个,熟悉一下解包打包boot.img工具的使用。


    1). 使用bootimg-tools工具解包打包boot.img文件替换内核(bootimg-tools工具比较好用--推荐

    下载bootimg-tools解包打包工具到 android-4.4.4_r1/kernel/msm/bootimg-tools文件夹中。

    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel/msm$ git clone https://github.com/pbatard/bootimg-tools.git
    Cloning into 'bootimg-tools'...
    remote: Counting objects: 76, done.
    remote: Total 76 (delta 0), reused 0 (delta 0), pack-reused 76
    Unpacking objects: 100% (76/76), done.
    Checking connectivity... done.


    进入bootimg-tools文件夹,make编译在 android-4.4.4_r1/kernel/msm/bootimg-tools/mkbootimg 文件夹下生成boot.img的打包解包工具mkbootimg和unmkbootimg。由于这里不涉及到的 ramdisk文件 解包打包,因此就不编译产生mkbootfs工具了。
    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel/msm$ cd bootimg-tools/
    
    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel/msm/bootimg-tools$ ls
    cpio  include  libmincrypt  LICENSE  Makefile  mkbootimg  README.md
    
    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel/msm/bootimg-tools$ make
    cc -Wall -Wextra -Wno-unused-parameter -pedantic -pipe -std=c99 -D_GNU_SOURCE -Iinclude   -c -o libmincrypt/sha.o libmincrypt/sha.c
    cc -Wall -Wextra -Wno-unused-parameter -pedantic -pipe -std=c99 -D_GNU_SOURCE -Iinclude   -c -o libmincrypt/rsa.o libmincrypt/rsa.c
    cc -Wall -Wextra -Wno-unused-parameter -pedantic -pipe -std=c99 -D_GNU_SOURCE -Iinclude   -c -o libmincrypt/dsa_sig.o libmincrypt/dsa_sig.c
    cc -Wall -Wextra -Wno-unused-parameter -pedantic -pipe -std=c99 -D_GNU_SOURCE -Iinclude   -c -o libmincrypt/p256.o libmincrypt/p256.c
    cc -Wall -Wextra -Wno-unused-parameter -pedantic -pipe -std=c99 -D_GNU_SOURCE -Iinclude   -c -o libmincrypt/p256_ec.o libmincrypt/p256_ec.c
    cc -Wall -Wextra -Wno-unused-parameter -pedantic -pipe -std=c99 -D_GNU_SOURCE -Iinclude   -c -o libmincrypt/p256_ecdsa.o libmincrypt/p256_ecdsa.c
    cc -Wall -Wextra -Wno-unused-parameter -pedantic -pipe -std=c99 -D_GNU_SOURCE -Iinclude   -c -o libmincrypt/sha256.o libmincrypt/sha256.c
    cc -Wall -Wextra -Wno-unused-parameter -pedantic -pipe -std=c99 -D_GNU_SOURCE -Iinclude   -c -o mkbootimg/mkbootimg.o mkbootimg/mkbootimg.c
    cc -o mkbootimg/mkbootimg libmincrypt/sha.o libmincrypt/rsa.o libmincrypt/dsa_sig.o libmincrypt/p256.o libmincrypt/p256_ec.o libmincrypt/p256_ecdsa.o libmincrypt/sha256.o mkbootimg/mkbootimg.o 
    cc -Wall -Wextra -Wno-unused-parameter -pedantic -pipe -std=c99 -D_GNU_SOURCE -Iinclude   -c -o mkbootimg/unmkbootimg.o mkbootimg/unmkbootimg.c
    cc -o mkbootimg/unmkbootimg mkbootimg/unmkbootimg.o 
    
    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel/msm/bootimg-tools$ ls mkbootimg
    bootimg.h  mkbootimg.c  unmkbootimg    unmkbootimg.o
    mkbootimg  mkbootimg.o  unmkbootimg.c


    将 android-4.4.4_r1/out/target/product/hammerhead/boot.img 文件拷贝到 android-4.4.4_r1/kernel/msm/bootimg-tools/mkbootimg 文件夹下进行解包处理。

    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel/msm/bootimg-tools/mkbootimg$ cp /home/androidcode/AndroidDevlop/android-4.4.4_r1/out/target/product/hammerhead/boot.img .
    
    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel/msm/bootimg-tools/mkbootimg$ ./unmkbootimg -i boot.img
    kernel written to 'kernel' (8405280 bytes)
    ramdisk written to 'ramdisk.cpio.gz' (498995 bytes)
    
    To rebuild this boot image, you can use the command:
      mkbootimg --base 0 --pagesize 2048 --kernel_offset 0x00008000 --ramdisk_offset 0x02900000 --second_offset 0x00f00000 --tags_offset 0x02700000 --cmdline 'console=ttyHSL0,115200,n8 androidboot.hardware=hammerhead user_debug=31 maxcpus=2 msm_watchdog_v2.enable=1' --kernel kernel --ramdisk ramdisk.cpio.gz -o boot.img
    
    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel/msm/bootimg-tools/mkbootimg$ ls
    boot.img   kernel     mkbootimg.c  ramdisk.cpio.gz  unmkbootimg.c
    bootimg.h  mkbootimg  mkbootimg.o  unmkbootimg      unmkbootimg.o

    替换原来的kernel内核文件,重新打包生成新的boot.img。当然了为解包和打包boot.img文件方便也可以将 unmkbootimg工具和mkbootimg工具设置成环境变量。
    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel/msm/bootimg-tools/mkbootimg$ cp /home/androidcode/AndroidDevlop/android-4.4.4_r1/kernel/msm/arch/arm/boot/zImage-dtb kernel
    
    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel/msm/bootimg-tools/mkbootimg$ mkbootimg --base 0 --pagesize 2048 --kernel_offset 0x00008000 --ramdisk_offset 0x02900000 --second_offset 0x00f00000 --tags_offset 0x02700000 --cmdline 'console=ttyHSL0,115200,n8 androidboot.hardware=hammerhead user_debug=31 maxcpus=2 msm_watchdog_v2.enable=1' --kernel kernel --ramdisk ramdisk.cpio.gz -o boot.img
    mkbootimg: command not found
    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel/msm/bootimg-tools/mkbootimg$ ./mkbootimg --base 0 --pagesize 2048 --kernel_offset 0x00008000 --ramdisk_offset 0x02900000 --second_offset 0x00f00000 --tags_offset 0x02700000 --cmdline 'console=ttyHSL0,115200,n8 androidboot.hardware=hammerhead user_debug=31 maxcpus=2 msm_watchdog_v2.enable=1' --kernel kernel --ramdisk ramdisk.cpio.gz -o boot.img

    OK,新的Android系统的镜像文件boot.img生成成功,将生成的 /home/androidcode/AndroidDevlop/android-4.4.4_r1/kernel/msm/bootimg-tools/mkbootimg/boot.img 替换掉Android 4.4.4r1源码生成的 android-4.4.4_r1/out/target/product/hammerhead/boot.img文件,然后重启Nexus 5手机进入刷机状态,单独刷入新的Android镜像文件boot.img。在执行刷机命令 fastboot 时,已经将fastboot刷机工具的文件路径设置为环境变量了。
    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel/msm/bootimg-tools/mkbootimg$ adb reboot bootloader
    * daemon not running. starting it now on port 5037 *
    * daemon started successfully *
    
    androidcode@ubuntu:~/AndroidDevlop/android-4.4.4_r1/kernel/msm/bootimg-tools/mkbootimg$ fastboot boot boot.img
    downloading 'boot.img'...
    OKAY [  1.173s]
    booting...
    OKAY [  0.109s]
    finished. total time: 1.282s


    Nexus 5手机刷入新的Android内核成功的截图:



    2). 使用bootimg.exe工具解包打包boot.img文件替换Android的内核(推荐

    在windows平台下,解包和打包boot.img文件使用的工具是bootimg.exe,该工具最新的版本支持Android 2.3~5.0的版本,具体的功能如下:

    解包命令:bootimg.exe --unpack-bootimg      
    打包命令:bootimg.exe --repack-bootimg   

    在Windows的cmd命令环境下执行:bootimg.exe –unpack-bootimg  命令对boot.img文件进行解压处理得到 kernel文件,将我们自己前面编译的kernel/msm/arch/arm/boot/zImage-dtb文件 重命名为 kernel 替换该解压出来的kernel文件,接着执行 bootimg.exe --repack-bootimg 命令重打包生成新的boot.img文件,然后执行  adb reboot-bootloader 重启Nexus 5手机进入刷机模式,执行 fastboot boot boot.img 将新的 boot.img文件刷入Nexus 5手机,这样Nexus 5手机的Android内核就替换为我们自己编译的Android内核版本了。


    有关bootimg.exe工具解包和打包boot.img文件的是永恒方法可以参考下面的连接:

    《Windows下Nexus 5 改user模式为debug模式》

    工具下载链接:https://github.com/cofface/android_bootimg 
    看雪学习链接:http://bbs.pediy.com/showthread.php?t=198328


    3).使用前面的博文《Ubuntu下修改Nexus 5的boot.img--改user模式为debug模式》中使用的boot.img解包打包工具替换boot.img文件中的 boot.img-kernel文件 为我们自己编译的生成的重命名为boot.img-kernel的 kernel/msm/arch/arm/boot/zImage-dtb文件,然后将重新打包生成的boot.img文件刷入Nexus 5手机即可。


    三、修改Android内核的源过掉Anti-Debug

    前面学习Android内核源码的下载编译以及替换Nexus 5手机的内核,主要的目的是为后面学习修改Android内核源码过掉Android的反调试以及进行Android内核层Hook做准备。下面就来学习通过修改Android源码的绕过Android基于进程状态文件/proc/pid/status的反调试,一般的情况下该种反调试都是通过判断TracerPid的状态值来判断。一般情况下,TracerPid的值为0时,当前Android进程认为没有被别的进程调试,其实手动过掉这种应用层反调试也比较简单,只需要守住 open函数即可。通过查找发现TracerPid在Android内核源码的的 /kernel/msm/fs/proc/array.c 文件里,通过下面的修改即可过掉一般情况下的反调试:

    /*
     * The task state array is a strange "bitmap" of
     * reasons to sleep. Thus "running" is zero, and
     * you can test for combinations of others with
     * simple bit tests.
     */
    static const char * const task_state_array[] = {
    	"R (running)",		/*   0 */
    	"S (sleeping)",		/*   1 */
    	"D (disk sleep)",	/*   2 */
    	"T (stopped)",		/*   4 */
    	"t (tracing stop)",	/*   8  此时当前进程被调试了*/
    	"Z (zombie)",		/*  16 */
    	"X (dead)",		/*  32 */
    	"x (dead)",		/*  64 */
    	"K (wakekill)",		/* 128 */
    	"W (waking)",		/* 256 */
    };
    
    
    static inline void task_state(struct seq_file *m, struct pid_namespace *ns,
    				struct pid *pid, struct task_struct *p)
    {
    	struct group_info *group_info;
    	int g;
    	struct fdtable *fdt = NULL;
    	const struct cred *cred;
    	pid_t ppid, tpid;
    
    	rcu_read_lock();
    	ppid = pid_alive(p) ?
    		task_tgid_nr_ns(rcu_dereference(p->real_parent), ns) : 0;
    	tpid = 0;
    	if (pid_alive(p)) {
    		struct task_struct *tracer = ptrace_parent(p);
    		
    		// 判断当前进程是否被反调试
    		if (tracer) {
    		
    			tpid = task_pid_nr_ns(tracer, ns);
    			
    			// 修改 TracerPid为0,绕过反调试
    			tpid = 0;
    		}
    			
    	}
    	cred = get_task_cred(p);
    	seq_printf(m,
    		"State:\t%s\n"
    		"Tgid:\t%d\n"
    		"Pid:\t%d\n"
    		"PPid:\t%d\n"
    		"TracerPid:\t%d\n"
    		"Uid:\t%d\t%d\t%d\t%d\n"
    		"Gid:\t%d\t%d\t%d\t%d\n",
    		/***get_task_state(p) 需要修改非t绕过反调试***/ "S",
    		task_tgid_nr_ns(p, ns),
    		pid_nr_ns(pid, ns),
    		ppid, tpid,
    		cred->uid, cred->euid, cred->suid, cred->fsuid,
    		cred->gid, cred->egid, cred->sgid, cred->fsgid);
    
    	task_lock(p);
    	if (p->files)
    		fdt = files_fdtable(p->files);
    	seq_printf(m,
    		"FDSize:\t%d\n"
    		"Groups:\t",
    		fdt ? fdt->max_fds : 0);
    	rcu_read_unlock();
    
    	group_info = cred->group_info;
    	task_unlock(p);
    
    	for (g = 0; g < min(group_info->ngroups, NGROUPS_SMALL); g++)
    		seq_printf(m, "%d ", GROUP_AT(group_info, g));
    	put_cred(cred);
    
    	seq_putc(m, '\n');
    }


    当然了,对于修改Android内核源码过反调试的代码修改位置,要根据Android具体的基于反调试的检测方法来进行具体的修改,没有一个万能的办法,按照Android进程的反调试的检测方法来进行修改即可。一般情况下,基于Android进程的 /poc/pid 文件的检测如下所示,都可以通过将Android进程没有被调试 被调试状态下 的cat 到显示的状态值进行对比,然后进行相关不同状态值的修改绕过反调试也可以通过逆向Android对抗进程的具体的反调试代码的检测逻辑对Android内核源码的/kernel/msm/fs/proc/array.c /kernel/msm/fs/proc/base.c 等内核文件作出相应的修改,修改的方法也比较多,按照自己的个人喜好来。

    /proc/pid/status
    /proc/pid/task/tid/status
    /proc/pid/stat
    /proc/pid/task/pid/stat
    /proc/pid/wchan
    /proc/pid/task/pid/wchan



    有价值的参考文档

    Building and booting Nexus 5 kernel (推荐)

    修改android内核绕过Anti-Debug(推荐)

    编译安装Nexus5 Android系统内核(推荐)

    编译Nexus5内核(推荐)

    Compiling and running your own Android kernel on the Nexus 7 2013(推荐)

    Compile your own android kernel

    Android内核的编译与裁剪(推荐)

    如何下载并编译Android4.0内核源码goldfish(图文)

    linux驱动基础开发3——linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解

    为nexus5编译ubuntu14.04TLSx64(android4.4.4)

    Android反调试笔记(推荐)

    https://source.android.com/source/building-kernels.html


    展开全文
  • 手机内核:device/品牌/内核版本/kernel 可 以 在 官 网 中 下 载 对 应 的 内 核 代 码 进 行 编 译 (http://source.android.com/source/building-kernels.html),应该使用的指令为: git clone ...

    1. 内核代码下载
    模拟器内核:prebuilts/qemu-kernel
    手机内核:device/品牌/内核版本/kernel
    可 以 在 官 网 中 下 载 对 应 的 内 核 代 码 进 行 编 译
    (http://source.android.com/source/building-kernels.html),应该使用的指令为:

    git clone https://android.googlesource.com/kernel/msm.git
    cd msm
    git branch –a 查看 branch 分支
    git checkout 分支

    如 果 google 无 法 访 问 , 可 以 将 http://source.android.com/ 替 换 为 清 华 源:https://aosp.tuna.tsinghua.edu.cn/即可,上面的指令可以修改为:git clone https://aosp.tuna.tsinghua.edu.cn/kernel/msm.git
    2. 内核代码 Build:

    在 shell 中导入 gcc 库,位于 Android 源码中
    export PATH=$(pwd)/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin:$PATH
    导出设置

    export ARCH=arm
    export SUBARCH=arm
    export CROSS_COMPILE=arm-eabi-
    make mako_defconfig #对应 mako 版本
    make –j4

    把 build 出来的内核(zImage)copy 到对应 Android 源码下的 prebuild 中来替换

    3. 编译手机镜像
    1) 下载驱动文件
    https://developers.google.com/android/nexus/drivers
    注意下载与手机版本和源代码版本对应的驱动文件,有多少就下载多少
    把下载好的驱动配置文件放到 Android 目录下,使用 chmod a+x,然后执行
    2) 编译

    3) 刷机
    确认上面步骤操作无误后
    adb reboot bootloader
    fastboot –w flashall
    4. 编译指令
    进行部分编译:

    m: 编译所有模块
    mm: 编译当前目录下的模块,当前目录下要有 Android.mk 文件
    mmm: 编译指定路径下的模块,指定路径下要有 Android.mk 文件

    部分编译完成之后,需要使用 make snod 把编译的东西整合到镜像

     

    展开全文
  • 改教程主要是针对安卓5.0以上版本的root,root方式为破解boot.img内核文件。 所需工具:1.booting.exe 访问密码 b34a 2.notepad++ 你需要获取boot.img文件,这个文件通常包含在厂商提供的线刷包中,然后将...
    改教程主要是针对安卓5.0以上版本的root,root方式为破解boot.img内核文件。
    所需工具:1.booting.exe   访问密码 b34a   2.notepad++
    1. 你需要获取boot.img文件,这个文件通常包含在厂商提供的线刷包中,然后将boot.img和booting.exe文件放在同一个文件夹中,我们假设放在D:\boot文件夹中
    2. 打开cmd,并进入D:\boot中,如果你是windows7及以上用户,可以在该文件夹内按住shift,点鼠标右键,选择在此处打开命令窗口
    3. 输入命令
      bootimg.exe --unpack-bootimg
    4. 此时我们可以看到目录中出现一些文件和文件夹
    5. 此时我们找到initrd目录下的init.rc和init.aosp.rc,如果只能找到一个也没有关系,打开所有找到的文件,搜索class_start core,哪个文件能搜索到,我们就修改那个文件。
    6. 我们在class_start core这条语句的上面添加一条语句
      start sysinit
    7. 在这个文件的最底下插入以下代码
      service sysinit /system/bin/logwrapper /system/xbin/busybox run-parts /system/etc/init.d
      disabled
      oneshot
    8. 全部保存,然后我们再修改initrd文件夹下的default.prop文件,将ro.secure=1改为ro.secure=0
    9. 全部保存,回到cmd,输入命令
      bootimg.exe --repack-bootimg
    10. 此时文件夹下会出现两个文件boot-new.img和boot-old.img,将boot-new.img改名为boot.img复制回线刷包所在的文件夹,然后线刷
    11. 此时,你需要找到适合你的设备的第三方recovery,然后卡刷super su即可实现root


    查看原文:http://colorfulshark.cn/wordpress/bootimg-root-1114.html
    展开全文
  • 我想修改一下安卓的Linux内核,在内核启动时加入一个我自己的操作,我该把自己的函数加在哪里呢?Linux内核似乎时从start kernel函数开始启动,我是应该把代码加在这里面吗? 有没有做过类似工作的哥们,求指导一下...
  • 0x1.手机设备环境 Model number: Nexus 5 OS Version: Android 4.4.4 KTU84P ...0x2.Android内核提取 查找Android设备的boot分区文件。高通芯片的设备可以通过下面的命令进行查找。 cd /home/androidcode/AndroidDevlop
  • root技术背后android手机内核提取及逆向分析 安卓ROOT技术背景: Android手机获得Root权限,可以让/system和/data分区获得读写的权限.这两个分区的权限配置,一般在根分区的init.rc文件中,修改这个文件可永久获得...
  • Android手机获得Root权限,其实就是让/system和/data分区获得读写的权限.这两个分区的权限配置,一般在根分区的init.rc文件中,修改这个文件可永久获得root权限. 众所周知,市面上绝大部分的Android手机文件系统有三个...
  • 修改源码路径:kernel/scripts/mkcompile_h #!/bin/sh TARGET=$1 ARCH=$2 SMP=$3 PREEMPT=$4 CC=$5 vecho() { [ "${quiet}" = "silent_" ] || echo "$@" ; } # If compile.h exists already and we don't ...
  • 1.修改Android设备型号 修改点:关于设备->型号 2.修改内核版本
  • 目前,移动设备浏览器上常用的内核有Webkit,Blink,Trident,Gecko等,其中iPhone和iPad等苹果iOS平台主要是WebKit,Android 4.4之前的Android系统浏览器内核是WebKit,Android4.4系统浏览器切换到了Chromium(内核...
  • 目的:修改内核源码,并刷入手机 步骤如下: 1.获取手机对应的内核下载地址 参考https://source.android.com/setup/build/building-kernels 我的设备是pixelsailfish,所以对应的源码地址是kernel/msm,编译配置是...
  • 逆向修改手机内核,绕过反调试 Android应用反调试里最常用的一种反调试方法是查看/proc/self/status的信息,如果TracerPid不为0,就判断为正在被调试。如果自己拥有内核源码,就可以自己编译生成zImage去替换内核就...
  • Android手机设备内核源码的调试需要外部硬件设备的支持,调试步骤比较麻烦。相对来说,Android模拟器内核源码的调试就比较简单了,这里以Android模拟器内核源码的调试为例。首先创建一个Android API 19(Android 4.4...
  • 编译Android内核

    2015-08-20 14:11:37
    首先需要知道自己android内核的版本,我们android系统是android 4.0.1,内核版本为2.6.29.由于我们在下载android源代码的时候默认是不带内核源码的,因为他内置了一个编译好的zImage内核镜像,所以,如果要编译内核...
  • 本部分介绍了 Linux 内核开发和版本模型(如下)、稳定的长期支持 (LTS) 内核(包括所有 Android 设备都应使用稳定版本而非择优挑选补丁程序的原因)、内核配置和加固、接口和模块化内核要求(在 Android O 中推出)...
  • Android内核和驱动程序

    2010-10-29 20:51:00
    2.1 Android内核特性 Android内核是基于Linux 2.6内核的(目前最新开发版本是2.6.31),它是一个增强内核版本,除了修改部分Bug外,它提供了用于支持Android平台的设备驱动,主要包括:And
  • 前言在 二、Android系统源码编译及刷机实战 一文中,我们成功编译了Android 4.4.4_r1源码并刷入系统了 Nexus 5 设备,下面是设置界面的信息。上面显示的内核版本信息是3.4.0-gd59db4e,内核的编译时间是Mon Mar 17 ...
  • 如果我们仅仅对Android内核感兴趣,我们可以选择合适的Android内核下载并编译。 可供选择的内核源码有很多版本: [plain] view plaincopy $ git clone ...
1 2 3 4 5 ... 20
收藏数 18,127
精华内容 7,250