编译小米2s CyanogenMod 版本遇到的几个问题 (02.26更新)
背景介绍为了破除我对android的神秘感,准备亲自编一个cm rom到真机上跑。反复看了cm 支持的devices, 我能网上,国内买到最便宜的,就只有小米2s了[0],为此特意从小米官网定了一个翻新标准版。吐槽下锤子,竟然藐视我等,不让root,不让安装第三方rom。关于编译机器,我用的是azure 3GB内存的那种虚拟机, 一块钱试用版的。 现在想来我应该建最高配置的VM。我
为了破除我对android的神秘感,准备亲自编一个cm rom到真机上跑。反复看了cm 支持的devices, 我能网上,国内买到最便宜的,就只有小米2s了[0],为此特意从小米官网定了一个翻新标准版。
吐槽下锤子,竟然藐视我等,不让root,不让安装第三方rom。
关于编译机器,我用的是azure 3GB内存的那种虚拟机, 一块钱试用版的。 现在想来我应该建最高配置的VM。我的i3笔记本可以编但是把机器卡得其他活都干不了。
关于连接googlesources, 买国外的VPS吧, 或者国内的,然后你懂得。
下面的Q&A是在[0]上遇到问题总结的,如果要折腾先执行它提到的操作,这里不再重复。
Q: 我没有真机,并且在VPS上也不能extract_files,如何弄到专有驱动?
A:
最初我是小米miui论坛下载的官方版本,提取时缺少diag_klog, 搜索找到[1]中提到的才有。
git clone https://github.com/CyanogenMod/android_device_xiaomi_aries.git device/xiaomi/aries
git clone https://github.com/cyanogenmod/android_kernel_xiaomi_aries kernel/xiaomi/aries
git clone https://github.com/linuxxxxx/proprietary_vendor_xiaomi vendor/xiaomi/aries
如果太慢就wget, 并注意解开的顶层目录有多个文件就行了。
Q: 编译加速
A:打开编译缓存,最好把下面的export放到.bashrc,不然重新登录shell,忘了设置,先前编的都白费了。
export USE_CCACHE=1
export CCACHE_DIR=~/disk_c/tmp_aries
export OUT_DIR_COMMON_BASE=~/disk_c/out_aries
./prebuilts/misc/linux-x86/ccache/ccache -M 100G
这里设置out目的是源码和中间结果分开,便于在不同build之间切换[3]
最好源码和cache,out在不同分区,这样可以分散io而加快速度。
(参考数据: 编译成功结束后cache是928MB, out是27G)
参数"-jN", 跟据cm上的建议取物理线程数+2, 我的vps是amd 双核,所以取4,
如果是intel 四核,一个核可以跑线程,就取10。
Q: 找不到gcc.
A:重新登录shell时下面的envsetup之后,忘了lunch, 直接就make了,这时你发现编译的target=generic。
Q:
make: *** No rule to make target `/home/azureuser/disk_c/out_aries/xm2s/target/product/aries/obj/STATIC_LIBRARIES/libinit_msm_intermediates/export_includes', needed by `/home/azureuser/disk_c/out_aries/xm2s/target/product/aries/obj/EXECUTABLES/init_intermediates/import_includes'. Stop.
A:
我在网上找到一个临时办法:它说不是缺这个文件吗,我们就touch一个,如果写在mk里面,
大致这样:
$(shell touch $(OUT)/obj/...)
我不知道加在哪个文件,直接shell里面搞了。
继续编译后缺libinit_msm.a。我也不知道如果touch一个合法的.a文件,怎么办呢?
怀疑过多线程编译,删掉hardware目录重新同步,都不行。
(此间徘徊过,几乎花了一天时间后)
最后看代码发现只需把它注释掉也可以把init编过:
device/xiaomi/aries/BoardConfig.mk
#TARGET_INIT_VENDOR_LIB := libinit_msm
好奇的随便看下是啥:
device/xiaomi/aries/init/init_aries.c
init_msm_properties()读取
/sys/devices/system/soc/soc0/raw_id,
并设置ro.product.model=1812(MI2S)
<--vendor_load_properties()<--property_service_init_action()
<--system/core/init/init.c:main()
02.02: 发现根本原因这个提交缺了两个文件:
https://github.com/CyanogenMod/android_device_xiaomi_aries/commit/ed8a74f02842fb7eb074800952379dac7d690e44
增加的文件在:
https://github.com/DeYangLiu/android_device_xiaomi_aries/commit/c5a516bb090e8e2d5817ebd85658e41893b547e0
体会:不要担心手机,大胆地添加删除某些模块。
Q: libwebviewchromium.so ld terminated with signal 9
A: 内存不够。即使你的物理内存有8G也不行(因为ld.gold是for linux 2.6.8的?),需要设置交换分区,
由于在VPS上,不方便增加物理分区,我们用磁盘文件作为分区[6]:
#增加交换分区大小
sudo dd if=/dev/zero of=/root/swapfile bs=1M count=10240
sudo mkswap /root/swapfile
sudo swapon /root/swapfile
#free -h 看swapon和swapoff的差异
#开机自启动
sudo vim /etc/fstab
/root/swapfile swap swap defaults 0 0
关于内存问题,我还遇到过一个奇怪的事情,就是ssh连接没有响应了。
Q:编译
A: 我成功编译的指令序列,按这个试了一遍的:
vim ~/.bashrc
export USE_CCACHE=1
export CCACHE_DIR=/mnt/tmp_aries
export OUT_DIR_COMMON_BASE=/mnt/out_aries
source ~/.bashrc
cd ~/disk_c/xm2s
source build/envsetup.sh
lunch
make -j4 --print-directory showcommands | tee ../build.log
# 02.26
上面的lunch & make 并不生成真正的ROM。
#把ubuntu 笔记本的执行文件拷贝到服务器
cp ~/schedtool prebuilts/devtools/tools/
time brunch aries | tee ../build-brunch-aries2.log
Package Complete: .../xm2s/target/product/aries/cm-11-20150226-UNOFFICIAL-aries.zip
real 36m0.183s
user 487m17.630s
sys 75m7.810s
服务器是16个Intel(R) Xeon(R) CPU E5-4620 v2 @ 2.60GHz
# 03.10
在笔记本2g内存上跑brunch总是出错, 只好改成make -j2的方式,机器卡的动不了。编译完成花了至少4个多小时。后来增加内存条,
笔记本 4个Intel(R) Core(TM) i3-2328M CPU @ 2.20GHz , 6GB内存:
real 258m49.233s -- real time
user 762m37.176s -- spent in user mode
sys 46m52.751s -- spent in kernel mode
实际花费约4.3个小时。编译过程中内存使用峰值是3GB, 机器不卡,浏览网页正常。看来影响速度还有其他比如磁盘IO等待等。
TODO
等手机到了,放到真机上跑。
Ref
[0] http://wiki.cyanogenmod.org/w/Aries_Info[1] http://en.miui.com/thread-16834-1-1.html
[2] CM11.0源码编译 -- http://blog.csdn.net/mxgg123/article/details/26269313
[3] ccache -- http://blog.cofface.com/archives/78.html#more-78
[4] https://github.com/razrqcom-dev-team/android_local_razrqcom/issues/1
[5] http://wiki.cyanogenmod.org/w/Doc:_Using_manifests#The_local_manifest
[6] signal 9 -- http://stackoverflow.com/questions/5682854/why-is-the-linker-terminating-on-me-when-i-build-clang
http://d.hatena.ne.jp/none53/20131128/1385601681
[7] http://wiki.cyanogenmod.org/w/Doc:_Building_Basics
更多推荐
所有评论(0)