为小米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

相关文章推荐

[rootfs] InitRamdisk & InitRamfs 介绍和使用

一、rootfs     rootfs,Root FileSystem,是指根文件系统,对应/目录节点。     rootfs又分为虚拟rootfs和真实rootfs。     虚拟rootf...

Debian下编译、运行和调试C++程序

本人使用的是Debian 6.04testing版 首先安装g++(需要root权限): gksu apt-get install g++ 安装完成后会出现: update-alter...
  • tiewen
  • tiewen
  • 2012年02月25日 21:59
  • 3123

MI3刷机救砖-小米3换MIUI7-Miflash未指定错误(remote partition table does“t exist)解决方案

MI3刷机救砖 小米3换MIUI7 Miflash未指定错误(remote partition table does“t exist)解决方案...

CM13 安卓6.0.1编译教程(以小米4C为例)

建议的Linux发行版本 (ubuntu 15.x/mint17.3)1.安装编译必需软件包sudo apt-get install bison build-essential curl flex g...

小米3刷机CM13

电脑上安装fastboot和adb.小米3移动版recovery和rom下载:http://pan.baidu.com/share/link?shareid=2552797177&uk=1729907...

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

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

关于小米 Mi4 手机的评测

久负盛名的技术评测网站 Ars Technica 近期发布了一篇小米 Mi4 手机的评测,标题是《中国的 iPhone 杀手随无创新但是产品令人啧啧称奇》(China's iPhone kille...

[ 教程 ] 小米4 MI4 cancro 刷完win10预览版后回到MIUI

米4刷完Windows10不好用怎么办?想回到MIUI但是教程看不懂怎么办? 本教程就能详细的教你如何从win10回到MIUI...
  • lms1206
  • lms1206
  • 2015年11月26日 14:21
  • 992

小米2/2S刷基于Android 5.1.1的CM12.1系统教程

这两天闲来无事,想把手里一台闲置的小米2S刷成原生Android系统玩玩,在网上找了各种教程,历经波折,终于刷成了基于Android5.1.1的CM12.1系统。那么我来讲讲刷机的过程吧! 首先,我...

Xiaomi 5S Mi5S 5.15 inches 1080P Qualcomm MSM8996 Snapdragon 821 Quad Core 3GB RAM 64GB ROM Front 4.

Xiaomi 5S Mi5S 5.15 inches 1080P Qualcomm MSM8996 Snapdragon 821 Quad Core 3GB RAM 64GB ROM
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:为小米4与小米3 Mi3 Mi4编译Cyanogenmod 12.1与13.0 (CM12与CM13) 的步骤以及错误解决
举报原因:
原因补充:

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