编译小米2s CyanogenMod 版本遇到的几个问题
为了破除我对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()
体会:不要担心手机,大胆地添加删除某些模块。
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=/mnt/10GB.swap bs=1024 count=10485760
sudo chmod 600 /mnt/10GB.swap
sudo mkswap /mnt/10GB.swap
sudo swapon /mnt/10GB.swap
关于内存问题,我还遇到过一个奇怪的事情,就是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
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
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。