美文网首页逆向专栏
android编译系统源码

android编译系统源码

作者: 超威蓝猫l | 来源:发表于2019-08-27 12:24 被阅读0次

    这里我们的手机是nesus5。用的是windows系统。打算编译4.4.4

    https://hub.docker.com/

    首先先去docker注册个账号,下载个docker。

    因为我是win8.1
    要用toolbox
    https://github.com/docker/toolbox/releases
    从这里下载最新版。
    如果是win10 直接下载官网800m的那个就行。

    image.png

    桌面出现这三个图标即为安装完成

    建议先用代理软件代理商,然后
    用管理员模式打开docker quick start。不过我这里跑不成功。virtualbox有问题。一直不喜欢这个。

    那么没办法。不能用docker。就只能上虚拟机编译了。

    安装vmware

    首先安装vmware。
    然后下载一个ubuntu14.04 64位的镜像。

    然后进入漫长的安装过程(我的机器太慢)

    安装完之后 在虚拟机中将ubuntu设置成桥接模式
    系统设置 –> 网络 –> 网络代理 –> 在HTTP代理填写主机的IP地址。这里主机是宿主机的ip。即我们的电脑的ip。

    安装jdk6

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

    下载那个linux 64位的bin

    • 赋予777权限 然后安装 桌面上会出来一个文件夹

    • 复制到别处

    mkdir -p /usr/lib/jvm/
    
    cp -r jdk1.6.0_45 /usr/lib/jvm/
    
    • 安装jdk6
    update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.6.0_45/bin/javac 1
    
    update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.6.0_45/bin/java 1
    
    update-alternatives --install /usr/bin/javaws javaws /usr/lib/jvm/jdk1.6.0_45/bin/javaws 1
    
    update-alternatives --install /usr/bin/jar jar /usr/lib/jvm/jdk1.6.0_45/bin/jar 1
    
    update-alternatives --install /usr/bin/javap javap /usr/lib/jvm/jdk1.6.0_45/bin/javap 1
    
    update-alternatives --install /usr/bin/javadoc javadoc /usr/lib/jvm/jdk1.6.0_45/bin/javadoc 1
    
    update-alternatives --config javac
    
    update-alternatives --config java
    
    update-alternatives --config javaws
    
    update-alternatives --config jar
    
    update-alternatives --config javap
    
    update-alternatives --config javadoc
    
    • 然后java javac java -version测试通过即可

    安装必要工具

    sudo apt-get update
    
    sudo apt install git
    
    sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev libxml2-utils xsltproc unzip
    
    sudo apt-get install python-dev
    

    下载代码

    下载repo

    清华镜像步骤
    mkdir ~/bin 
    PATH=~/bin:$PATH 
    curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
    chmod a+x ~/bin/repo
    
    谷歌步骤
    mkdir ~/bin 
    PATH=~/bin:$PATH 
    curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
    chmod a+x ~/bin/repo
    

    初始化git邮箱等

    mkdir AOSP-android-4.4.4_r1
    cd AOSP-android-4.4.4_r1
    git config --global user.name "123" 
    git config --global user.email "you@example.com"
    

    初始化repo

    镜像的(默认下载master分支,后期也可以切换再下载)  
    repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest
    或者
    repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-4.4.4_r1
    
    
    谷歌的(默认下载master分支,后期也可以切换再下载)  
    repo init -u https://android.googlesource.com/platform/manifest
    或者
    repo init -u https://android.googlesource.com/platform/manifest -b android-4.4.4_r1
    

    分支可以在这里查看
    https://source.android.google.cn/setup/build-numbers.html#source-code-tags-and-builds

    image.png

    下载并输出

    repo sync -j4 2>&1 | tee sync_log.txt
    
    但是这里可能会掉线 不会重连。可以用下面的shell代码
    
    #!/bin/bash
    #LASTDAY=`date +%Y%m%d -d -1days`
    #modify date format as 160202
    
    fn_repo_sync()
    {
        
        repo sync -j8 2>&1 | tee sync.log.txt
    }
    
    fn_get_source_code()
    {
        echo "fn_get_source_code:$(pwd)"
        fn_repo_sync
        FETCH_ERROR=`grep -i "error: Exited sync " -A 1  sync.log.txt`
        echo  "${FETCH_ERROR}"
        while [ -n "${FETCH_ERROR}" ]
        do
            echo "需要重新拉取代码"
            fn_repo_sync
            FETCH_ERROR=`grep -i "error:" -A 1  sync.log.txt`
        done
        echo "leave begin download source"
        #repo start ${DATE_TIME} --all
    }
    
    
    
    ####================================================
    
    fn_get_source_code
    
    
    • 出现 curl: (22) The requested URL returned error: 404 Not Found Server does not provide clone.bundle; ignoring. 怎么办?
      无视即可。

    下载驱动

    https://developers.google.cn/android/drivers#hammerhead

    image.png

    找到相同的,然后下载

    image.png

    我这个版本有三个 这三个解压出来都是sh文件

    然后放到AOSP4.4的文件夹中 给与执行权限 然后逐个执行

    image.png

    执行的时候会跟你说 你要先看lisence,然后会出来一个说明书 到了最后要输入accept的字样才能解压。所以只能慢慢按(小提示,这里我们可以按空格快速跳过说明)

    image.png

    三个都解压完成


    image.png

    关联代码

    source build/envsetup.sh 
    
    image.png

    其实就是include一些东西

    选择编译目标

    https://source.android.google.cn/setup/running.html#selecting-device-build

    image.png

    Buildtype Use
    user limited access; suited for production
    userdebug like "user" but with root access and debuggability; preferred for debugging
    eng development configuration with additional debugging tools

    lunch aosp_hammerhead-userdebug
    
    image.png

    编译

    清理

    make clobber
    
    make -j8
    

    出现下面是javap没配置

    Gyp action: Generating resources from ui_resources.grd (out/target/product/hammerhead/obj/GYP/shared_intermediates/ui/ui_resources/grit/ui_resources.h)
    Traceback (most recent call last):
      File "../../base/android/jni_generator/jni_generator.py", line 1103, in <module>
        sys.exit(main(sys.argv))
      File "../../base/android/jni_generator/jni_generator.py", line 1099, in main
        GenerateJNIHeader(input_file, output_file, options)
      File "../../base/android/jni_generator/jni_generator.py", line 1012, in GenerateJNIHeader
        jni_from_javap = JNIFromJavaP.CreateFromClass(input_file, options)
      File "../../base/android/jni_generator/jni_generator.py", line 520, in CreateFromClass
        stderr=subprocess.PIPE)
      File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
        errread, errwrite)
      File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child
        raise child_exception
    OSError: [Errno 2] No such file or directory
    make: *** [out/target/product/hammerhead/obj/GYP/shared_intermediates/ui/gl/jni/Surface_jni.h] Error 1
    
    
    image.png

    编译成功就如上

    image.png

    编译产生的文件 以及路径如上

    Build 结果的目录结构 所有的编译产物都将位于 /out 目录下,该目录下主要有以下几个子目录: 
    
    /out/host/:该目录下包含了针对主机的 Android 开发工具的产物。即 SDK 中的各种工具,例如:emulator,adb,aapt 等。 
    
    /out/target/common/:该目录下包含了针对设备的共同的编译产物,主要是 Java 应用代码和 Java 库。 
    
    /out/target/product/<product_name>/:包含了针对特定设备的编译结果以及平台相关的 C/C++ 库和二进制文件。其中,<product_name>是具体目标设备的名称。
    
    /out/dist/:包含了为多种分发而准备的包,通过“make disttarget”将文件拷贝到该目录,默认的编译目标不会产生该目录。
    
    Build 生成的镜像文件 
    
    Build 的产物中最重要的是三个镜像文件,它们都位于 /out/target/product/<product_name>/ 目录下。  这三个文件是:  
    
    system.img:包含了 Android OS 的系统文件库,可执行文件以及预置的应用程序,将被挂载为根分区。 ? 
    
    ramdisk.img:在启动时将被 Linux 内核挂载为只读分区,它包含了 /init 文件和一些配置文件。它用来挂载其他系统镜像并启动 init 进程。 
    
    userdata.img:将被挂载为 /data,包含了应用程序相关的数据以及和用户相关的数据。
    

    刷机

    我这里将刷机文件拷贝到windows上刷机

    进入bootloader模式

    image.png

    或者使用命令进入

    adb reboot bootloader
    

    解锁bootloader

    解锁新款设备
    自 2014 年以来发布的所有 Nexus 和 Pixel 设备(从 Nexus 6 和 Nexus 9 开始)都内置有恢复出厂设置保护功能,需要通过多个步骤才能解锁引导加载程序。
    
    要在设备上启用 OEM 解锁功能,请执行以下操作:
    在“设置”中,点按关于手机,然后点按版本号七 (7) 次。
    当看到“您已处于开发者模式”这条消息后,点按返回按钮。
    点按开发者选项,然后启用 OEM 解锁和 USB 调试(如果 OEM 解锁处于停用状态,请连接到互联网,以便设备可以至少签到一次。如果 OEM 解锁仍处于停用状态,则说明您的设备可能已被运营商锁定 SIM 卡,系统无法解锁引导加载程序)。
    重新启动进入引导加载程序,然后使用 fastboot 解锁。
    对于新款设备(2015 年及之后发布的设备):
    fastboot flashing unlock
    
    对于老款设备(2014 年及之前发布的设备):
    fastboot oem unlock
    
    在屏幕上确认解锁。
    注意:在 Nexus 10 上,解锁引导加载程序后,内部存储空间仍将保持未格式化状态。您可以依次使用 fastboot format cache 和 fastboot format userdata 来格式化设备。
    重新锁定引导加载程序
    要重新锁定引导加载程序,请执行以下命令:
    
    对于新款设备(2015 年及之后发布的设备):
    fastboot flashing lock
    
    对于老款设备(2014 年及之前发布的设备):
    fastboot oem lock
    

    刷机

    set ANDROID_PRODUCT_OUT=G:\nexus5-4.4.4_r1\origin
    fastboot flashall -w
    
    刷机成功

    如何刷原版系统

    adb reboot bootloader
    
      fastboot flash bootloader bootloader-hammerhead-HHZ11d.img (请注意: 这行中的“bootloader-hammerhead-HHZ11d.img”是bootloader的名字,各位刷bootloader的时候改成文件夹中相应的名字。下同!)
    
      fastboot reboot-bootloader
    
      fastboot flash radio radio-hammerhead-M8974A-1.0.25.0.17.img (请注意: 把“radio-hammerhead-M8974A-1.0.25.0.17.img”改成你的文件名。)
    
      fastboot reboot-bootloader
    
      fastboot -w update image-hammerhead-krt16m.zip (请注意: 把“image-hammerhead-krt16m.zip”改成你的文件名。)
    
      fastboot reboot-bootloader
    
      这样就刷完了,等待手机重启就回到最初手机的状态了。
    
      -- 如果你是Mac电脑,请确保在每行命令前添加“./” (比如:./fastboot reboot-bootloader)
    
      -- 如果你想恢复原厂bootloader的锁定状态,请使用这个命令: fastboot oem lock
    
      -- 如果你想保持bootloader解锁状态,那么选择重启手机好了。
    
    • 如果出现Writing 'userdata' FAILED (remote: 'Bogus size sparse and chunk header')
    1) extract image-hammerhead-m4b30z.zip
    
    2) cd to the extracted folder
    
    3) run the following commands (one by one)
    fastboot erase userdata
    fastboot flash userdata userdata.img
    fastboot erase cache
    fastboot flash cache cache.img
    fastboot reboot
    

    则手动刷那几个部分

    刷入过大可以用-S

    fastboot -S 50M flash system system.img
    

    相关文章

      网友评论

        本文标题:android编译系统源码

        本文链接:https://www.haomeiwen.com/subject/xlttectx.html