如何在MacOS10.12.6中为Nexus5编译M固件
来源:互联网 发布:mysql删除唯一约束 编辑:程序博客网 时间:2024/05/25 21:35
前言
Marshmallow,也就是Android6现在对于我们来说也是古老的东西了,所以在编译就会遇到各种版本问题。于是就想写篇文章,把遇到的坑记录下来。
初始编译环境
其他的make等版本号,基本不用怎么管,就新版的。MacOSX-SDK下面出问题的时候再稍微详细地说一下。
初始工作
按照官网的教程,搭建编译环境和下载源代码,一步一步来。
这里需要注意的是:因为我们的都是是Nexus5,所以版本最高只能到Android 6.0.1。所以我在配置远程仓库路径的时候用的是
repo init -u https://android.googlesource.com/platform/manifest -b android-6.0.1_r1
当然这时候需要翻墙,推荐用kcptun加速,它能让搬瓦工最便宜的那种小水管都能达到近2M/s的下载速率。这样能保证repo sync的成功率,要知道这玩意失败后会留下一堆临时文件,还不能断点续传。网上流传的加-f参数只不过是让它不要让失败终止,而是继续下载。下面是我改写的下载脚本。功能就是失败后继续下载,然后统计一下次数,给个交代
#!/bin/bash count=1; repo sync; while [ $? == 1 ]; do echo "$count Sync failed, repeat again:"; find . -iname tmp_pack_* | xargs rm sleep 3 let count++; repo sync; done echo "finish $count sync";
因为我已经在git上设置了代理,于是这里就不用proxychains4了。
git config --global http.proxy 'socks5://127.0.0.1:1080'
有些博客会让人加个https.proxy。
git config --global https.proxy 'socks5://127.0.0.1:1080'
可我看文档好像是没有这个东西的
http.proxy
Override the HTTP proxy, normally configured using the http_proxy, https_proxy, and all_proxy*environment variables (see curl(1)). In addition to the syntax understood by curl, it is possible to specify a proxy string with a user name but no password, in which case git will attempt to acquire one in the same way it does for other credentials. See gitcredentials[7] for more information. The syntax thus is[protocol://][user[:password]@]proxyhost[:port]*. This can be overridden on a per-remote basis; see remote..proxy
按照这个文档来说,http.proxy既管http也管https,所以就没有https.proxy了。不过加上https.proxy也不会报错。当然如果只写了https.proxy肯定不会有效果就是了。
构建
下载驱动
这个在官网上叫做硬件支持的二进制文件。这时候我们要根据在初始工作中选择的分支看它对应的细分版本号是多少,然后再通过这个版本号找到相应的驱动。所以至少需要了两个表
第一个表是源代码标记和细分版本。这个表很长,下面就节选我们所需要部分的附近几行
在这个表中找到版本号(MMB29K)后,可以去二进制驱动的下载页面中下载对应的驱动。这个页面很长,还是 cmd+F 方便。下面是我们所需要的部分:
Nexus 5 (GSM/LTE) binaries for Android 6.0.1 (MMB29K)
下载完成后解压(tar -zxvf *.tgz)到源码的根目录(默认为/Volumes/android),这样就会看到 extract-公司名-版本代码.sh为名字的脚本。然后执行,就会发现给了一个协议让你最后输入一个 I ACCEPT 。所以可以疯狂按会车,到第八条慢一些,第e小条的下面就让你输 I ACCEPT 了。接受这个协议后,它会自解压一些文件到vendor这个文件夹。
清理
为了确保新安装的二进制文件在解压后会被适当考虑在内,请使用以下命令删除所有以前编译操作的已有输出:
make clobber
这时候会出现一些错误,参见后面的遇到的问题那一节
设置环境
使用 envsetup.sh 脚本初始化环境。请注意,将 source 替换成 .(一个点)可以省去一些字符,这种简写形式在文档中更为常用。
source build/envsetup.sh
或
build/envsetup.sh
选择目标
这里呢有二十多种模式,但好在官方给了个参考。在选择编译系统里,我们节选部分表格
有上表可见,这时候所需要的编译模式是aosp_hammerhead-userdebug。
输入下面的命令会给出一个列表让人选择
lunch
列表如下
You're building on DarwinLunch menu... pick a combo: 1. aosp_arm-eng 2. aosp_arm64-eng 3. aosp_mips-eng 4. aosp_mips64-eng 5. aosp_x86-eng 6. aosp_x86_64-eng 7. aosp_deb-userdebug 8. aosp_flo-userdebug 9. full_fugu-userdebug 10. aosp_fugu-userdebug 11. mini_emulator_arm64-userdebug 12. m_e_arm-userdebug 13. mini_emulator_mips-userdebug 14. mini_emulator_x86-userdebug 15. mini_emulator_x86_64-userdebug 16. aosp_flounder-userdebug 17. aosp_angler-userdebug 18. aosp_bullhead-userdebug 19. aosp_hammerhead-userdebug 20. aosp_hammerhead_fp-userdebug 21. aosp_shamu-userdebugWhich would you like? [aosp_arm-eng]
这时输入19就行。然后它会返回一个配置列表
============================================PLATFORM_VERSION_CODENAME=RELPLATFORM_VERSION=6.0.1TARGET_PRODUCT=aosp_hammerheadTARGET_BUILD_VARIANT=userdebugTARGET_BUILD_TYPE=releaseTARGET_BUILD_APPS=TARGET_ARCH=armTARGET_ARCH_VARIANT=armv7-a-neonTARGET_CPU_VARIANT=kraitTARGET_2ND_ARCH=TARGET_2ND_ARCH_VARIANT=TARGET_2ND_CPU_VARIANT=HOST_ARCH=x86_64HOST_OS=darwinHOST_OS_EXTRA=Darwin-16.7.0-x86_64-i386-64bitHOST_BUILD_TYPE=releaseBUILD_ID=MMB29KOUT_DIR=out============================================
编译
这个就简单
make -j4
选择了四个线程同时编译
遇到的问题
在这个环境里,编译的时候是会报错的。
build/core/combo/mac_version.mk:39: * Can not find SDK 10.6 at /Developer/SDKs/MacOSX10.6.sdkbuild/core/combo/mac_version.mk:40: *****************************************************build/core/combo/mac_version.mk:41: *** Stop.. Stop.\e[0;31m#### make failed to build some targets (3 seconds) ####\e[00m
这个就很明显了,SDK的版本不对。我们去
/Applications/XCode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs
里面找找看,会发现只有10.12的SDK。
那么现在假设它是向下兼容的,那么我们试试能否强制用10.12的SDK编译。找到build/core/combo/mac_version.mk,在mac_sdk_versions_supported加上10.12
mac_sdk_versions_supported := 10.6 10.7 10.8 10.9 10.12
然后继续编译,这时后又是java版本不对,毕竟我们这个太老了。
Checking build tools versions...************************************************************You are attempting to build with the incorrect versionof java.Your version is: java version "1.8.0_112" Java(TM) SE Runtime Environment (build 1.8.0_112-b16) Java HotSpot(TM) 64-Bit Server VM (build 25.112-b16, mixed mode).The required version is: "1.7.x"Please follow the machine setup instructions at https://source.android.com/source/initializing.html************************************************************build/core/main.mk:171: *** stop. Stop.\e[0;31m#### make failed to build some targets (13 seconds) ####\e[00m
好吧,这个要jdk1.7。可是我其他的项目还是主要要用java8呀,每次改JAVA_HOME也太麻烦了点。这时候就祭出神器jenv了。它可以很方便的切换java版本,而且可以限定作用范围。虽然也能用brew install jenv安装,但是装完后,会出一些奇奇怪怪的问题,还是建议用git clone吧。至于具体操作,可以看它的github的readme,命令也很简洁方便。
切换到java7进行编译,然后还是会失败的
system/core/libcutils/threads.c:38:10: error: 'syscall' is deprecated: first deprecated in OS X 10.12 - syscall(2) is unsupported; please switch to a supported interface. For SYS_kdebug_trace use kdebug_signpost(). [-Werror,-Wdeprecated-declarations] return syscall(SYS_thread_selfid); ^../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/unistd.h:733:6: note: 'syscall' has been explicitly marked deprecated hereint syscall(int, ...); ^1 error generated.make: *** [out/host/darwin-x86/obj/STATIC_LIBRARIES/libcutils_intermediates/threads.o] Error 1make: *** Waiting for unfinished jobs....\e[0;31m#### make failed to build some targets (02:26 (mm:ss)) ####\e[00m
有个函数在MACOSX.SDK里被废除了。那用老版本的?去https://github.com/phracker/MacOSX-SDKs/releases下载MacOSX10.9.sdk.tar.xz,然后解压到
/Applications/XCode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs
选这个版本的原因是因为我们在前面的原始的build/core/combo/mac_version.mk看到支持的版本号最高是10.9。然后再编译一次试试
xcodebuild[42506:10928497] [MT] DVTSDK: Skipped SDK /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk; its version (10.9) is below required minimum (10.11) for the macosx platform.xcodebuild[42506:10928497] [MT] PluginLoading: Required plug-in compatibility UUID DFFB3951-EB0A-4C09-9DAC-5F2D28CC839C for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/ClangFormat.xcplugin' not present in DVTPlugInCompatibilityUUIDsxcodebuild[42506:10928497] [MT] PluginLoading: Required plug-in compatibility UUID DFFB3951-EB0A-4C09-9DAC-5F2D28CC839C for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/Alcatraz.xcplugin' not present in DVTPlugInCompatibilityUUIDsbuild/core/combo/mac_version.mk:38: *****************************************************build/core/combo/mac_version.mk:39: * Can not find SDK 10.6 at /Developer/SDKs/MacOSX10.6.sdkbuild/core/combo/mac_version.mk:40: *****************************************************build/core/combo/mac_version.mk:41: *** Stop.. Stop.
现在又说版本不能低于10.11。好吧,那重新下10.11,然后修改mac_version.mk,解压编译。
编译成功后,会输出一个报告
Creating filesystem with parameters: Size: 1073741824 Block size: 4096 Blocks per group: 32768 Inodes per group: 8192 Inode size: 256 Journal blocks: 4096 Label: system Blocks: 262144 Block groups: 8 Reserved block group size: 63Created filesystem with 1701/65536 inodes and 106038/262144 blocksInstall system fs image: out/target/product/hammerhead/system.imgout/target/product/hammerhead/system.img+out/target/product/hammerhead/obj/PACKAGING/recovery_patch_intermediates/recovery_from_boot.p maxsize=1096212480 blocksize=135168 total=419150812 reserve=11083776\e[0;32m#### make completed successfully (02:51:38 (hh:mm:ss)) ####\e[00m
所用空间的大小,然后关键的那几个img,于是现在就可以刷机了。
刷机
Nexus5关机状态下,长按音量下+电源,即可进入recovery模式, 然后在源码根目录下执行下面命令:
fastboot -w flashall
刷机成功后就会自动重启
target reported max download size of 1073741824 bytesCreating filesystem with parameters: Size: 13725835264 Block size: 4096 Blocks per group: 32768 Inodes per group: 8144 Inode size: 256 Journal blocks: 32768 Label: Blocks: 3351034 Block groups: 103 Reserved block group size: 823Created filesystem with 11/838832 inodes and 93654/3351034 blocksCreating filesystem with parameters: Size: 734003200 Block size: 4096 Blocks per group: 32768 Inodes per group: 7472 Inode size: 256 Journal blocks: 2800 Label: Blocks: 179200 Block groups: 6 Reserved block group size: 47Created filesystem with 11/44832 inodes and 5813/179200 blocks--------------------------------------------Bootloader Version...: HHZ20hBaseband Version.....: M8974A-2.0.50.2.30Serial Number........: 039da899215fcfec--------------------------------------------checking product...OKAY [ 0.100s]sending 'boot' (9160 KB)...OKAY [ 0.500s]writing 'boot'...OKAY [ 0.788s]sending 'recovery' (9898 KB)...OKAY [ 0.563s]writing 'recovery'...OKAY [ 0.834s]erasing 'system'...OKAY [ 1.237s]sending 'system' (408826 KB)...OKAY [ 13.012s]writing 'system'...OKAY [ 29.164s]erasing 'userdata'...OKAY [ 10.458s]sending 'userdata' (137318 KB)...OKAY [ 4.511s]writing 'userdata'...OKAY [ 9.153s]erasing 'cache'...OKAY [ 0.670s]sending 'cache' (13348 KB)...OKAY [ 0.631s]writing 'cache'...OKAY [ 1.062s]rebooting...finished. total time: 73.191s
展示一下成果
本篇博客同时发布在我的博客上,转载请注明
- 如何在MacOS10.12.6中为Nexus5编译M固件
- 为Nexus5编译Android L固件
- 为Nexus5编译AndroidL固件
- Android 5.1.1谷歌源生编译为Android Lollipop编译固件Nexus5 Nexus6 Nexus7
- 如何在编译内核时添加缺少的固件(以intel wireless 5100 AGN的 iwlwifi 为例)
- MacOS10编译Hadoop2.7.4
- 编译在VMware中运行的OpenWrt固件版本
- 编译cm for nexus5
- 如何在VC中为工程添加一个编译选项
- 如何在VC中为工程添加一个编译选项
- 编译TPLINK WR703Nv1 8M trunk固件
- 自己编译openwrt 8m固件 简单记录
- Nexus5 如何刷机
- 如何在旧型号EVB中使用新版本固件?
- MacOS10.9编译OBS-studio
- macOS10.13.1 上编译wxWidgets
- 编译AOSP刷入nexus5
- macos10.9中配置Maven
- hdoj 5980 Find Small A
- 《Python机器学习算法》勘误
- SpringMVC的数据格式化-注解驱动的属性格式化
- BZOJ1010-玩具装箱toys
- 26. Remove Duplicates from Sorted Array
- 如何在MacOS10.12.6中为Nexus5编译M固件
- 转载一个李神的东西(打一下脸)
- 单线程
- 西山居_2018校招笔试(判断IP地址的合法性)
- Android5.0,6.0,7.0新特性总结
- 浅谈java垃圾收集器
- linux 下执行ant遇到的问题
- 多个集合积-笛卡尔积
- 9.15(floyed,dijkstra,与SPFA)