为小米4与小米3 Mi3 Mi4编译Cyanogenmod 12.1与13.0 (CM12与CM13) 的步骤以及错误解决

原创 2016年06月06日 09:18:36

小米4是Cyanogenmod官方支持的Device,所以编译无需我们做Device specific适配,我们只需要提取代码(Android 与Kernel),获取proprietary binary files即可编译。 

小米4以及小米3的设备名字都是cancro,CM对于这两款设备的WIki位于:

https://wiki.cyanogenmod.org/w/Build_for_cancro


步骤与错误解决

1. breakfast VS proprietary files

先获取proprietary binary files然后再breakfast,否则会出现错误。

2. 提取proprietary file的错误解决

提取有两种方法:

一种是手机刷入cm12.1系统后使用adb pull获取

一种是直接解压cm编译的ota包,然后从里面的system.new.dat中获取

其中第二种方法更为方便,但是我们需要将system.new.dat转换成system.img

sparse

new.dat与默认的system.img的区别

主要在于一个是为了减小size而对内部中的内容进行了压缩,而system.img则没有压缩。

new.dat与默认的system.img的转换方法

解压OTA

因为是zip包,在linux下面我们使用unzip来完成

 unzip -d cm12.1 cm-12.1-20151117-SNAPSHOT-YOG7DAO1K6-cancro.zip 
Archive:  cm-12.1-20151117-SNAPSHOT-YOG7DAO1K6-cancro.zip
signed by SignApk
 extracting: cm12.1/system.patch.dat  
  inflating: cm12.1/META-INF/com/android/metadata  
  inflating: cm12.1/META-INF/com/google/android/update-binary  
  inflating: cm12.1/META-INF/com/google/android/updater-script  
  inflating: cm12.1/META-INF/org/cyanogenmod/releasekey  
  inflating: cm12.1/boot.img         
  inflating: cm12.1/file_contexts    
  inflating: cm12.1/install/bin/backuptool.functions  
  inflating: cm12.1/install/bin/backuptool.sh  
  inflating: cm12.1/install/bin/nfcchecker.sh  
  inflating: cm12.1/install/bin/otasigcheck.sh  
  inflating: cm12.1/install/bin/resize2fs_static  
  inflating: cm12.1/system.new.dat   
  inflating: cm12.1/system.transfer.list  
  inflating: cm12.1/system/build.prop  
  inflating: cm12.1/META-INF/com/android/otacert  
  inflating: cm12.1/META-INF/MANIFEST.MF  
  inflating: cm12.1/META-INF/CERT.SF  
  inflating: cm12.1/META-INF/CERT.RSA  

转换

使用python脚本sdat2img来完成

sdat2img.py system.transfer.list system.new.dat system.img
Skipping command erase
Copying 32767 blocks into position 0...
Copying 2 blocks into position 32768...
Copying 2 blocks into position 32809...
Copying 32212 blocks into position 33323...
Copying 2 blocks into position 65536...
Copying 20457 blocks into position 66050...
Copying 2 blocks into position 98304...
Copying 2 blocks into position 98345...
Copying 32212 blocks into position 98859...
Copying 2 blocks into position 131072...

Done! Output image: /home/hexiongjun/android/CM_XiaoMi4/cm12.1/system.img
这样就有了我们需要的system.img文件了
mount到system目录

 sudo mount -t ext4 system.img  system

拷贝Proprietary Files

脚本extract-files.sh本身就有从local directory拷贝的功能,但是实际上我们运行的时候会有错误

./extract-files.sh -d /home/hexiongjun/android/CM_XiaoMi4/cm12.1/system
cp: cannot stat ‘/home/hexiongjun/android/CM_XiaoMi4/cm12.1/system/system/vendor/lib/libthermalioctl.so’: No such file or directory

提示说找不到某某某文件,我们可以find一下

$ find -name libthermalioctl.so
./system/vendor/lib/libthermalioctl.so

认真细看一下就知道其实是路径问题

因此我们更改前面使用的方式

]$ ./extract-files.sh -d /home/hexiongjun/android/CM_XiaoMi4/cm12.1/
cp: cannot stat ‘/home/hexiongjun/android/CM_XiaoMi4/cm12.1//system/vendor/lib/rfsa/adsp/libscveT2T_skel.so’: No such file or directory

可以看到前面的已经找到了,但是还是有其他文件找不到,同样的find之后我们知道也是路径问题,因此我们可以直接更改device-proprietary-files.txt文件来修正这个问题,也可以手动拷贝。


当然还有更为容易解决的方式

查看脚本,我们可以知道它的路径都是按照实机来的,而实机中像vendor这种目录是位于/vendor中,且这个vendor是/system/vendor的soft link,同样的还有etc等目录:

shell@flo:/ $ ll /
drwxr-xr-x root     root              2016-05-31 15:30 acct
drwxrwx--- system   cache             2016-04-18 22:59 cache
lrwxrwxrwx root     root              1969-12-31 13:00 charger -> /sbin/healthd
dr-x------ root     root              2016-05-31 15:30 config
lrwxrwxrwx root     root              2016-05-31 15:30 d -> /sys/kernel/debug
drwxrwx--x system   system            2016-05-31 15:30 data
-rw-r--r-- root     root          297 1969-12-31 13:00 default.prop
drwxr-xr-x root     root              2016-05-31 15:30 dev
lrwxrwxrwx root     root              2016-05-31 15:30 etc -> /system/etc
-rw-r--r-- root     root        19494 1969-12-31 13:00 file_contexts
drwxrwx--x system   system            2016-05-31 15:30 firmware
-rw-r----- root     root         3464 1969-12-31 13:00 fstab.flo
-rwxr-x--- root     root       422740 1969-12-31 13:00 init
-rwxr-x--- root     root         8288 1969-12-31 13:00 init.cm.rc
-rwxr-x--- root     root         1075 1969-12-31 13:00 init.environ.rc
-rwxr-x--- root     root          162 1969-12-31 13:00 init.flo.diag.rc
-rwxr-x--- root     root         6831 1969-12-31 13:00 init.flo.power.rc
-rwxr-x--- root     root        13544 1969-12-31 13:00 init.flo.rc
-rwxr-x--- root     root         7640 1969-12-31 13:00 init.flo.usb.rc
-rwxr-x--- root     root        22264 1969-12-31 13:00 init.rc
-rwxr-x--- root     root          318 1969-12-31 13:00 init.superuser.rc
-rwxr-x--- root     root         1927 1969-12-31 13:00 init.trace.rc
-rwxr-x--- root     root         3885 1969-12-31 13:00 init.usb.rc
-rwxr-x--- root     root          301 1969-12-31 13:00 init.zygote32.rc
drwxrwxr-x root     system            2016-05-31 15:30 mnt
lstat '//persist' failed: Permission denied
dr-xr-xr-x root     root              1969-12-31 13:00 proc
-rw-r--r-- root     root         3151 1969-12-31 13:00 property_contexts
drwxr-xr-x root     root              1969-12-31 13:00 res
drwx------ root     root              2016-03-20 19:39 root
drwxr-x--- root     root              1969-12-31 13:00 sbin
lrwxrwxrwx root     root              2016-05-31 15:30 sdcard -> /storage/emulated/legacy
-rw-r--r-- root     root          725 1969-12-31 13:00 seapp_contexts
-rw-r--r-- root     root           61 1969-12-31 13:00 selinux_version
-rw-r--r-- root     root       140844 1969-12-31 13:00 sepolicy
-rw-r--r-- root     root        10574 1969-12-31 13:00 service_contexts
drwxr-x--x root     sdcard_r          2016-05-31 15:30 storage
dr-xr-xr-x root     root              2016-05-31 15:30 sys
drwxr-xr-x root     root              2016-05-24 16:50 system
lrwxrwxrwx root     root              2016-05-31 15:30 tombstones -> /data/tombstones
-rw-r--r-- root     root         2819 1969-12-31 13:00 ueventd.flo.rc
-rw-r--r-- root     root         7514 1969-12-31 13:00 ueventd.rc
lrwxrwxrwx root     root              2016-05-31 15:30 vendor -> /system/vendor

因此我们可以手动建立软链接来快速解决这个问题:

ln -s  system/etc etc
ln -s  system/vendor/ vendor

但是最终我们发现有一些文件就是不存在与cm的OTA zip包中,这个时候我们还是需要从设备中pull上来。

同时还需要注意的是一些bin文件本身对others没有读权限,因此可以在adb shell中使用find找到,却无法pull上来,这个时候就需要将adb切成root:

adb root

然后再执行脚本。

同时因为脚本中配置了

set -e

因此一些文件不在/system/lib等目录不会再到/system/vendor/lib中去查找了,因此,我们需要将这行去掉。


编译错误

因为前面二进制文件的路径不正确,编译的时候会有类似下面的错误:

make: *** No rule to make target `vendor/xiaomi/cancro/proprietary/app/qcrilmsgtunnel.apk', needed by `/home/hexiongjun/android/cm13.1/out/target/product/cancro/obj/APPS/qcrilmsgtunnel_intermediates/package.apk'.  Stop.
make: *** Waiting for unfinished jobs....
make: Leaving directory `/home/hexiongjun/android/cm13.1'

#### make failed to build some targets (02:11 (mm:ss)) ####

对此我们需要手动mv对应文件到正确位置才能继续编译。



版权声明:转载请注明出处: http://blog.csdn.net/sy373466062 作者: TonyHo

CM 11.0 13.0 源码编译过程

CM 11.0 13.0 源码编译过程前言 有一台很老的Nexus S机器,很久不用。当前又在研究框架的一些东西,遂想自己下载源码、编译、烧录以及验证自己的修改。可以去Google网站Nexus ...
  • ygd11
  • ygd11
  • 2016年07月10日 23:42
  • 796

编译适配小米2S的CM Linux内核源代码及问题解决

1.下载内核源代码 首先进入CM官网与小米2S相关的页面: http://wiki.cyanogenmod.org/w/Aries_Info 在页面中可以找到Kernel后面的链接: http://...
  • u013541140
  • u013541140
  • 2016年10月01日 15:32
  • 1247

小米3一键调整分区+刷机教程

【1】什么是刷机?   刷机,指的是手机方面的专业术语,是指通过一定的方法更改或替换手机中原本存在的一些语言、图片、铃声、软件或者操作系统。通俗来讲,刷机就是给手机重装系统。使手机的功能更加完善,...
  • happyniceyq
  • happyniceyq
  • 2016年10月02日 17:38
  • 2891

小米4C直接解锁、刷入TWRP、CM13和Gapps

小米4C直接解锁、刷入TWRP、CM13和Gapps
  • ztguang
  • ztguang
  • 2016年10月16日 07:45
  • 6392

CyanogenMod源码下载和编译

前言: CyanogenMod源码下载和编译是一个耗时、耗精力、耗人品的工程,如果你有足够的毅力、耐心,以及做好了承受各种下载出错、编译出错、固化出错打击的心理准备,请一步一步往下看。考虑到Cyan...
  • tdstds
  • tdstds
  • 2014年04月30日 20:33
  • 10215

小米3刷机CM13

电脑上安装fastboot和adb.小米3移动版recovery和rom下载:http://pan.baidu.com/share/link?shareid=2552797177&uk=1729907...
  • feiniao8651
  • feiniao8651
  • 2017年04月20日 16:56
  • 1207

如何编译CyanogenMod系统

如何编译CyanogenMod系统相信很多android开发者都编译过android系统,我之前也编译过android系统,但是编译完后,打开虚拟机玩了玩。但是没法用来调试,如果编译的是arm版本运行...
  • kevin_nazgul
  • kevin_nazgul
  • 2016年11月16日 21:14
  • 627

小米路由器3 opkg安装

小米路由器3 opkg安装1、复制opkg到小米路由的/data路径下。 下载地址:http://sangbo.pub/soft/opkg/opkg 2、修改/etc/opkg.conf文件,替换...
  • CutelittleBo
  • CutelittleBo
  • 2017年11月23日 11:56
  • 705

小米4 专用TWRP2.8.4.1中文单系统版(TTF字体,全屏触摸,支持MTP,支持刷官方MIUI6和OTA,支持5.0刷机)

小米4 中文TWRP2.8.4.1 Recovery 全屏触摸全中文操作 支持MTP连接电脑传刷机包到内置存储,支持截图,支持清除电量操作,支持屏蔽官方Recovery,支持自动Root,支持备份恢...
  • soyudesign
  • soyudesign
  • 2015年01月26日 02:48
  • 8715

android解决小米手机裁剪图片异常问题

android开发中,部分手机裁剪异常。
  • qq_23936173
  • qq_23936173
  • 2016年07月13日 17:26
  • 2629
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:为小米4与小米3 Mi3 Mi4编译Cyanogenmod 12.1与13.0 (CM12与CM13) 的步骤以及错误解决
举报原因:
原因补充:

(最多只允许输入30个字)