android编译系统源码

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

https://hub.docker.com/

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

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

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

建议先用代理软件代理商,然后
用管理员模式打开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 "[email protected]"

初始化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

下载并输出

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

找到相同的,然后下载


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

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

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

三个都解压完成


关联代码

source build/envsetup.sh 

其实就是include一些东西

选择编译目标

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

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

编译

清理

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


编译成功就如上

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

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模式

或者使用命令进入

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章