博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为小米4与小米3 Mi3 Mi4编译Cyanogenmod 12.1与13.0 (CM12与CM13) 的步骤以及错误解决
阅读量:4170 次
发布时间:2019-05-26

本文共 6710 字,大约阅读时间需要 22 分钟。

小米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.zipsigned 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.imgSkipping command eraseCopying 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/systemcp: 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 acctdrwxrwx--- system   cache             2016-04-18 22:59 cachelrwxrwxrwx root     root              1969-12-31 13:00 charger -> /sbin/healthddr-x------ root     root              2016-05-31 15:30 configlrwxrwxrwx root     root              2016-05-31 15:30 d -> /sys/kernel/debugdrwxrwx--x system   system            2016-05-31 15:30 data-rw-r--r-- root     root          297 1969-12-31 13:00 default.propdrwxr-xr-x root     root              2016-05-31 15:30 devlrwxrwxrwx root     root              2016-05-31 15:30 etc -> /system/etc-rw-r--r-- root     root        19494 1969-12-31 13:00 file_contextsdrwxrwx--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.rcdrwxrwxr-x root     system            2016-05-31 15:30 mntlstat '//persist' failed: Permission denieddr-xr-xr-x root     root              1969-12-31 13:00 proc-rw-r--r-- root     root         3151 1969-12-31 13:00 property_contextsdrwxr-xr-x root     root              1969-12-31 13:00 resdrwx------ root     root              2016-03-20 19:39 rootdrwxr-x--- root     root              1969-12-31 13:00 sbinlrwxrwxrwx 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_contextsdrwxr-x--x root     sdcard_r          2016-05-31 15:30 storagedr-xr-xr-x root     root              2016-05-31 15:30 sysdrwxr-xr-x root     root              2016-05-24 16:50 systemlrwxrwxrwx 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.rclrwxrwxrwx root     root              2016-05-31 15:30 vendor -> /system/vendor
因此我们可以手动建立软链接来快速解决这个问题:

ln -s  system/etc etcln -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://bybai.baihongyu.com/

你可能感兴趣的文章
(二)线程的应用及挑战
查看>>
(四)Thread.join的作用和原理
查看>>
(五)Synchronized原理分析
查看>>
基于redis分布式锁实现“秒杀”
查看>>
分布式理论:深入浅出Paxos算法
查看>>
Java高级架构2018年好文清单
查看>>
【jvm】Java垃圾回收
查看>>
Spring 面试问题 TOP 50
查看>>
拼多多Java后端团队面试题:epoll+集群+事务隔离+Kafka+分布式等
查看>>
最全BAT算法面试130题:阿里、百度、腾讯、京东、美团、今日头条
查看>>
想进阿里P7,你必须掌握这些技能专题
查看>>
看完你还敢说你懂JVM吗?
查看>>
面试了一个2年程序员,竟然只会curd,网友神回复!
查看>>
ElasticSearch基础分布式架构讲解
查看>>
年底了,程序员来说说你今年写过的最牛逼的bug是什么?
查看>>
阿里P8架构师讲述:3—5年程序员的发展和出路在哪里?
查看>>
题库分库分表架构方案
查看>>
一篇文读懂缓存在大型分布式系统中的最佳应用
查看>>
当亲戚问你工资,程序猿如何作答,简直不能再机智
查看>>
Redis从单机到集群,一步步教你环境部署以及使用
查看>>