Android系统源码与内核下载编译及刷机讲解

Android系统源码与内核下载编译及刷机讲解

  • 0.前言说明
  • 1.准备工作
  • 2.Android源码下载
  • 3.Android编译环境搭建
  • 4.Android系统编译
  • 5.Android内核下载
  • 6.Android内核编译
  • 7.内核模块编译

0.前言说明

  • 这是第一节课我选的题目,第二节课就要汇报PPT的,没办法自己课题组老师开的课,没接触过Android,也得硬着头皮上。以为挺简单的,就选了这个题目,后来周三开始做,周日上午才发给助教,最坑的就是学校限流量,下什么都不舍得~期间多次打算换题,还好,坚持就会柳暗花明又一村。

1.准备工作

  • Android 由四个层组成:
    • Linux 内核(c/c++)
    • 本地用户空间native (c/c++)
    • 应用程序框架层
    • 应用程序层(java)
      老师说她一般在kernel、native、framework层进行代码安全加固。
  • 选择Android4.4,4.4系统优化较4.0,2.3明显,且不算太大;20G,6.0的大约60G
  • 环境:
    • ①安装虚拟机Ubuntu16.04编译快
      4G运存,CPU 4核心,80G硬盘(最后占50G)
    • ②安装samba文件服务器,进行文件传输

2.Android源码下载

两种方式:

  1. repo工具(批处理工具,一次下载多个git仓库)
    • ①.安装repo:
      mkdir ~/bin
      PATH=~/bin:$PATH
      下载repo脚本:
      curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
      设置repo可执行权限:
      chmod a+x ~/bin/repo
    • ②.初始化repo客户端
      创建AndroidCode目录用来存放源码:
      mkdir AndroidCode
      cd AndroidCode
      运行repo下载源码:
      repo init -u https://android.googlesource.com/platform/manifest -b android-4.4_r1
      repo sync
      据说20个G,提供更新.repo文件占10个g,我们暂时用不到,所以采用第二种,并让同学帮我分担了一部分流量~
  2. 直接下载:百度云下Android2.3到6.0的源码链接:
    http://blog.csdn.net/ilittleone/article/details/6823441
    是经过压缩split分割过的,需要合并:
    cat droidSplit*>droid.tar.gz
    文件校验码md5sum校验文件是否被改过:

    这里写图片描述
    合并+解压 耗时2h,期间CPU持续满负荷运行

3.搭建Android编译环境:

  1. 安装一系列工具、依赖:
    sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
    sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
    sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
    sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
    sudo apt-get install git-core gnupg flex bison gperf build-essential
    sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib
    sudo apt-get install libc6-dev-i386
    sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev
    sudo apt-get install lib32z-dev ccache
    sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4

  2. 安装jdk:
    Android4.4的源码编译所使用的jdk为oracle jdk1.6。jdk一定要安装1.6的最高版本,即jdk1.6.0_45,否则编译中会报错

    • 具体过程:
      在/usr/loacl目录下创建jvm文件夹用来存放jdk:mkdir /usr/local/jvm
      复制到/usr/local/jvm中:cp jdk-6u45-linux-x64.bin /usr/local/jvm
      进入到/usr/local/jvm下,给.bin文件一个可执行权限
      chmod +x jdk-6u45-linux-x64.bin
      执行.bin文件进行安装:./jdk-6u45-linux-x64.bin
      安装成功后设置环境变量,打开/etc/profile,添加如下几行后保存
      export JAVA_HOME=/usr/local/java/jdk1.6.0_45
      export JRE_HOME=/usr/local/java/jdk1.6.0_45/jre
      export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
      export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH

      source /etc/profile后,输入java -version,显示java version “1.6.0_45”则成功
  3. 安装make:
    由于ubuntu16.04自带make版本过高,无法编译。因此需要将make降至3.82版本,下载地址ftp://ftp.gnu.org/gnu/make/
    解压:tar -zxvf make3.8.2.tar.gz
    然后进入make3.8.2目录下:
    ./configure
    make
    make install
    执行完后在/usr/local/bin中可得到新的make,复制到/usr/bin中即可

4.编译Android源码

  1. 环境初始化:
    ~.bashrc文件末尾追加export USE_CCACHE = 1(加速编译 )
    echo export USE_CCACHE=1 >> ~/.bashrc
    source ~/.bashrc
    导入编译Android源码所需的环境变量和其他参数:
    source build/envsetup.sh
    最后: make –j4(开启四线程编译)
    CPU满负荷运行,3个多小时后,系统镜像文件 system.img、ramdisk.img和userdata.img
  2. 启动模拟器://也可fastboot 刷Nexus真机
    source build/envsetup.sh
    lunch sdk-eng //加载sdk-eng,默认是full-eng
    (eng: 工程机,user:最终用户机 userdebug:调试测试机,tests:测试机)
    emulator
    启动安卓自带模拟器,也可以用Genymotion 安卓模拟器,启动速度、运行速度都更快;
    我当时是以root身份编译的,图片中的编译时间是23号,而我是23号晚上11点开始编译,24号2点结束,所以是开始编译的时间
    我当时是以root身份编译的,图片中的编译时间是23号,而我是23号晚上11点开始编译,24号2点结束,所以是开始编译的时间。

5. Android内核下载

  1. 说明:Android源码包自带一个编译好的内核镜像,看不到内核源码的。

  2. 下载kernel仓库:还有支持HTC、三星、高通MSM等的内核,goldfish专门针对模拟器的。
    mkdir kernel
    cd kernel
    git clone https:// android.googlesource.com/kernel/goldfish.git
    宿舍网连Google不稳定,git clone不支持断点续传,so我用的是清华的源;
    可以看出清华的源是很给力的,另外同学告诉说可以开启多线程下载,速度会更快!
    可以看出清华的源是很给力的,另外同学告诉说可以开启多线程下载,平均速度可达5m/s!

  3. 确定内核版本:
    查看所有分支:git branch –a
    迁出特定3.4内核代码:
    git checkout –b remotes/origin/android-goldfish-3.4

6. Android内核编译

  1. 环境初始化:
    cd /usr/local/android/kernel/goldfish
    export ARCH=arm
    export SUBARCH=arm
    export CROSS_COMPILE=arm-eabi-
    export PATH=/usr/local/android/prebuilts/gcc/linux- x86/arm/arm-eabi-4.6/bin:$PATH
    make goldfish_armv7_defconfig //Android4.1以上平台

    在内核源码根目录下生成.config
  2. 内核裁剪:
    make menuconfig 来配置源码根目录下的.config
    (这个命令在编译Linux内核时也会用到)
    这是个错误,原因是我窗口化屏幕太小了,f11全屏即可
    这是个错误,原因是我窗口化屏幕太小了,f11全屏即可
    这是执行命令后出来的UI选择功能界面
    这是执行命令后出来的UI选择功能界面。

  3. 内核编译:
    make -j4
    编译结果~

    编译后内核zImage存放在:./arch/arm/boot/zImage

  4. 查看系统信息:
    先设置模拟器的目录到环境变量PATH中去:
    export PATH=$PATH:/usr/local/android/mydroid/out/host/linux-x86/bin
    选择zImage内核启动:emulator –kernel zImage &
    用adb工具连接模拟器:
    输入adb shell进入
    cd proc
    cat version
    这是命令查看
    这是用命令查看。
    当然也可以打开模拟器的设置界面,看到内核是3.4.67和之前的3.4.0不同,so编译内核刷机成功
    当然也可以打开模拟器的设置界面,看到内核是3.4.67和之前的3.4.0不同,so编译内核刷机成功。

7. Android内核模块编译

  1. 在/usr/local/android/kernel/goldfish/drivers/char/my_test/下,gedit hello.c
    hello.c程序
  2. 在my_test下,gedit makefile//编译hello.c
    内容:obj-y := hello.o //内建编译,还有个obj-m表示模块编译,没时间实现了~
  3. 在../char下,gedit Makefile //包含hello驱动
    加入:obj-y += my_test/hello.o
  4. 重新编译,将hello驱动设备编译到内核中;
    make –j4
  5. 启动后查看内核状态:
    emulator –kernel zImage –show-kernel &
    成功打印出hello,它是以drivers下的char字符驱动的形式实现的
    成功打印出hello,而且它是以drivers下的char字符驱动的形式实现的。

PS:期间查了很多Android安全的资料,发现好多游戏的修改都是利用注入、hook技术实现,打算实现一个简单的游戏修改展示的。但由于时间和能力有限,以及编译速度感人,只能退而求其次次,选择Android内核的helloworld来展示。
PS:发博客图片上传不方便~而且老卡。

展开阅读全文

没有更多推荐了,返回首页