如何讲CM Android移植到你的设备?_android androidboard boardconfig devicecommon-程序员宅基地

技术标签: android  cm  源码  移植  

关于将cm android移植到你的设备上的一些技巧


你可能会遇到CM并不支持的手机设备或者是平板设备。

原来的时候我们可能会编译那些cm支持的设备源码,并将其烧录到设备中来测试运行,那个过程是相当轻松的,但是如果要移植到CM并不支持的设备上去的话,可能需要费点力气。

在这边文章中,我们假设你所在的目录是android的源码根目录。

先决条件


移植cm到一个新的设备上去可以是非常简单的,也可能是非常困难的,这依赖于设备本身,设备当前是否运行一个最近版本的Android系统,还有一个原因就是你的开发技巧。

此外,你应该熟悉CM的源码。在整个移植过程中,你需要做的所有的工作都是在目录/device/[vendor]/[codename],/vendor/[vendor]/[codename],和/kernel/[vendor]/[codename]中。

收集你的设备的信息


在你开始移植之前,你需要尽可能多的去收集你设备的信息。我们需要的信息是设备名称,代码名称,架构,内存大小,内部存储大小和平台架构。将这些信息放在一个便于检索的文件中。尝试更多的去了解你的设备,包括它与其他设备的相似性。

有用技巧

多设备在架构上可能与一些其他设备相似,这些其他设备可能已经有cm支持了。当新的设备出现的时候,查看你是否能够找到相似的其他设备,仅仅在屏幕大小或者是内存或者是其他微小地方上的不同。如果你发现了你的设备的一个”ancestor”或者是”sibling”,大部分工作已经为你做好了。

大多数你需要的信息可以在网络上获取得到,但是假如设备已经运行了一个非cm的Android系统,你可以从设备本身获取一些信息。为了查看包含这些信息的文件,设备可能需要获取root权限。然而,有的时候你可能在线获取到一个固件升级包,然后可以从.zip文件包中查看这些文件。

查看设备的当前/system/build.prop

假设设备已经运行了一个版本的Android系统,他的文件系统中应该存在一个文件,/system/build.prop,该文件可以提供一些有用的信息。该文件包含用于Android设置和变量参数的定义。

所以,如果在你的计算机中已经安装了adb,你可以使用下面的命令拉到你的计算机中:

adb pull /system/build.prop

如果收到了关于权限的错误,设备可能需要去获取root权限去访问该文件。然而,有其他方式去定位这个文件。例如,他也会包含在固件更新包中。

一旦你有了这个文件:

  • 写下ro.product.manufacturer参数的值。这个就是你的vendor的名称。[vendor]是设备的制造商/提供商的名称。CM已经为大多数主要的供应商简历了名称,例如samsung,htc,lge等等。注意在这些目录名称中,vendor一直是小写的,并且不包含空格。
  • 写下参数ro.product.device的值。该值就是你的设备的codename[codename]对应着设备本身的项目代码名称。如果你之前构建过CM,你应该熟悉每一个设备的代码名称的概念。就像是vendor名称,codename一直都是小写的,并且不包含空格。

    注意:
    有的时候,设备会定义其他参数,例如ro.product.board

保留着build.prop文件,因为后面我们会用到他。

检查boot.imgrecovery.img


如上所述,当进行移植的时候,你可能希望使用一个现存可用的预构建的内核而不是从源码重新编译。依赖于您的设备,你可能需要从设备中提取该内核文件。内核可能以一个单一文件存在或者是在boot或者是recovery分区中被打包起来。

相似的,ramdisk的内容可能是非常有用的,并且能够被提取出来。他可能为正确启动,加载模块等提供特定的文件。在大多数情况下,你可以从设备的ramdisk中去查看这些文件。

注意:

ramdisk是一个文件和目录的小组,它通过内核加载到内存当中。内核接着运行位于ramdisk中称为init的一个文件,然后运行一个脚本文件(init.rcinit.[codename].rc等),该脚本文件加载Android的其他部分。我们可以使用称为mkbootimgmkimage或其他方法以不同方式讲ramdisk和内核打包在一起。

我们可以使用dd从一个获取root权限的android设备中提取出boot和recovery镜像文件(我们称为boot.imgrecovery.img),或者是如果你可以从供应商中访问一个更新包.zip文件的话,你在里面也可以找到这些文件。

收集任何现有的源码


使用Android的设备的制造商或者是供应商都会尽可能的遵守GPL协议,将源码包括内核公开的,所以,我们需要这样一份代码。

决定分区表


你的移动设备的基本上长期存储部分 – 通常是一个”emmc”(嵌入式多媒体卡) – 看上去更像是计算机的硬盘,他能以不同的方式去定义和隔离不同数据的区域。这些独一无二的区域被称为分区,他们有很多不同类型的数据存储在这里面。一些分区包含原声数据 – 固件,内核,ramdisk等等。大多数情况下,一个分区被格式化去使用一个特定的文件系统,该文件系统会被内核重新识别,这样文件和目录就能够被读取和写入了。

在你可以使用CM替换原来的操作系统的时候,确定设备的分区表是非常重要的。你构建的recovery镜像需要这个信息去了解到哪里去查找各种各样的Android目录。特别的,你需要知道哪一个分区被分配到/system,/data,/cache/sdcard。你需要知道哪一个分区存在,在什么设备上,他们是怎样被挂在的,还有就是分区的大小。这些信息后续都需要传送到位于你的/vendor目录中的BoardConfig.mk文件中。

如果你幸运的话,recovery.fstab文件坐落在recovery.img镜像中,这样就能够加快我们弄清楚什么去哪里的速度。当然,位于ramdisk中的inint.[codename].rc文件也会有一些有用信息。我们通过下面的命令来查看分区被挂载到哪里了:

cat /proc/partitions

从一个运行的设备中可以帮助我们定义分区。也可以查看/proc/emmc,/proc/mounts,/proc/mtd。你也可以从命令mount中获取一些信息。(以root身份运行)。

也要检查/cache/recovery.log或者是/tmp/recovery.log文件。

最后,如果你有bootloader的源码,你也可以获取一些信息。

注意:
要知道会有一些特殊例子,例如HP Touchpad,他就使用了一个抽象的虚拟文件系统。

设置三个新的目录


现在,我们已经收集了关于我们的设备的一些信息,是时候为你的设备配置生成一些文件夹了。

  • device/[vendor]/[codename]/–这个是存放你的设备特有的安装文件的地方。device/目录包含配置设置的99-100%和用于特别设备的其他代码。你将会发现这个目录是非常好的。正如上面提到的,当为这个设备开始了一个文件夹,模仿和他相似的设备的目录是一个好主意。
  • vendor/[vendor]/[codename]/vendor/目录包含了属性,从原始设备备份来的二进制块(或者是有供应商提供的)。
  • kernel/[vendor]/[codename]/–内核源码的位置。当你初次开始移植尝试的时候,你可能希望简单是使用预编译的内核而不是通过源码重新编译。方法就是从其他系统中提取出内核,然后带着新的ramdisk重新打包它,把他打包成你的设备可以使用的格式。该方法在设备和设备之间是不同的,所以查看相似的设备是非常有用的。从源码中构建内核不是对每一个设备都很严格,但是本着开源精神,对CM来说这个是更好的方式。

有至少三种方法来生成这些目录:

方法一:使用mkvendor.sh来生成基本文件

使用位于build/tools/device/中的mkvendor.sh来自动生成目录。

注意:

mkvendor脚本仅仅在设备使用一个标准的boot.img,使用标准的Android协议和头文件的时候才能正常运转,在其他方式下是不能正常工作的。

该脚本接受三个参数:vendor,codename,还有一个boot.img文件。

举例:

./build/tools/device/mkvendor.sh samsung i9300 ~/Desktop/i9300boot.img

在上面的例子中,samsung代表vendor,i9300代表codename,最后一个参数是boot.img所在的路径。

其中的boot.img是使用dd命令从boot分区下载的或者是从更新包中获取的。

上面的命令应该会在你的CM源码目录下创建一个/device/samsung/i9300文件夹。在文件夹里面,会有文件AndroidBoard.mkAndroidProducts.mkBoardConfig.mkcm.mkdevice_[codename].mkkernelrecovery.fstab等等。

这个命令并不会创建kernel/目录。当我们准备好构建内核的时候,我们需要手动创建该文件夹。

注意:

如果返回信息”unpackbootimg not found.Is your android build environment set up and have the host tools been built?”,请运行下面的命令:

`make -j4 otatools`

方法2:fork一个相似设备的git仓库

方法3:手动创建目录和文件

你可以手动的创建相应的目录和文件。这个不太推荐,因为这或许是一个无聊的方法,但是很有指导意义。你可以查看其他设备作为参考你需要什么文件。

定制文件


device/文件夹中有很多文件。我们将会通过关注四个文件BoardConfig.mk,device_[codename].mk,cm.mk,recovery.fstabkernel开始。

我们来检查每一个文件:

BoardConfig.mk

这个文件包含关于你设备母板,CPU和其他硬件架构的重要信息。正确的获取这个文件是非常重要的。为了得到一个基本的recovery booting,在这个文件中需要设置一些参数。

为了编译一个正常运转的recovery镜像,下面的参数必须要在BoardConfig中设置:

  • TARGET_ARCH:这个是设备的架构,他通常是arm或者是omap3.
  • BOARD_KERNEL_CMDLINE:不是所有的设备传递boot参数,然而如果你的设备这样做的话,为了成功启动,这个选项一定要正确填写。你可以在ramdisk.img中找到这个信息。
  • BOARD_KERNEL_PAGESIZE:boot.img的页面大小,为了能够启动,一定要正确设置。该参数典型的数值是2048和4096。该信息可以从内核中提取出来。
  • BOARD_BOOTIMAGE_PARTITION_SIZE:分配给内核镜像分区的字节数
  • BOARD_RECOVERYIMAGE_PARTITION_SIZE:分配给recovery镜像分区的字节数
  • BOARD_SYSTEMIMAGE_PARTITION_SIZE:分配给Android系统文件系统分区的字节数
  • BOARD_USERDATAIMAGE_PARTITION_SIZE:分配给Android数据文件系统分区的大小

    注意:
    上面的信息都可以从/proc/partitions或者是/proc/mtd获取的到,典型的就是1024。

  • BOARD_HAS_NO_SELECT_BUTTON:(可选),如果你的设备需要使用他的Power按钮来确认选择就使用该选项。

  • BOARD_FORCE_RAMDISK_ADDRESS/BOARD_MKBOOTIMG_ARGS:(可选),使用这些来为ramdisk强制一个专用地址。这些值可以从内核中获取到,前一个参数在Android 4.2.x失效了,后一个参数现在在Android 4.2.x和更高版本中使用。

现在先到这里,后面的教程会在下一篇文章中讲解!!谢谢大家。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hongbochen1223/article/details/50343621

智能推荐

SpringBoot (profile)以及配置文件的加载顺序_spring profiles加载顺序-程序员宅基地

文章浏览阅读1k次。profile的使用_spring profiles加载顺序

文件上传失败原因分析与解决-程序员宅基地

文章浏览阅读754次,点赞14次,收藏3次。*原因分析:**上传时头部信息,content-type内容不对应,修改为multipart/form-data即可。:在前端开发时,需要通过表单元素上传图片或其他文本,但是上传不成功,后端接口也没问题。

faric-ca-server使用https_failed to enroll admin user : error: calling enrol-程序员宅基地

文章浏览阅读418次。文章目录声明使用的版本两种方法使用fabric-ca使用ca-server的docker容器打开https配置对应的yaml文件停止/启动docker查看容易的log查看证书目前的ip在其他机器上使用ca-server使用二进制工具打开https一个标识打开https接下来的步骤最终生成的文件夹如下声明使用的版本fabric版本如下:1.4.8node-sdk版本:1.4.8node版本:v8.11.1ubuntu版本:16.04两种方法使用fabric-ca有两种方法都能使用fabric_failed to enroll admin user : error: calling enroll endpoint failed with err

php编译安装与配置_php编译后面--profile所对应的路径是-程序员宅基地

文章浏览阅读2.1w次,点赞3次,收藏5次。php编译安装与配置===========================================官网:http://php.net/官网下载:http://php.net/downloads.php===========================================一:了解与准备1.1:Apache(httpd) nginx 与 php 连接方式:..._php编译后面--profile所对应的路径是

路由器的Loopback地址是什么意思?_loopback是什么意思-程序员宅基地

文章浏览阅读1.8w次,点赞8次,收藏35次。本地环回接口(或地址),亦称回送地址(loopback address)。此类接口是应用最为广泛的一种虚接口,几乎在每台路由器上都会使用。常见于如下用途:1 作为一台路由器的管理地址 系统管理员完成网络规划之后,为了方便管理,会为每一台路由器创建一个loopback 接口,并在该接口上单独指定一个IP 地址作为管理地址,管理员会使用该地址对路由器远程登录(telnet ),_loopback是什么意思

自然语言处理-情感分析_自然语言处理情感分析matlab-程序员宅基地

文章浏览阅读233次。情感分析python 包https://www.jianshu.com/p/d50a14541d01英语:textBlob包中文:snownlp实战:IMDb电影评论https://baijiahao.baidu.com/s?id=1598913702189213115&wfr=spider&for=pc步骤:1、清洗文本数据:删除不需要的字符2、标记文档:分词、词..._自然语言处理情感分析matlab

随便推点

identifier 'SYS.DBMS_LOCK' must be declared错误处理方法-程序员宅基地

文章浏览阅读611次。用户在执行延时语句dbms_lock.sleep(5); 时报PLS-00201: identifier 'SYS.DBMS_LOCK' must be declared错误。解决办法:请用GRANT EXECUTE..._dbms_clock must be declare

2024年G1工业锅炉司炉证考试题库及G1工业锅炉司炉试题解析-程序员宅基地

文章浏览阅读415次,点赞4次,收藏3次。20、【多选题】熄火保护装置,燃烧器设有火焰监测器,随时监测炉膛内()是否成功.火焰监测器一般在5秒钟内(点火)及1秒钟内(运行时)关闭进油进气电磁阀并通过电铃声发出声、光报警信号,这时风机继续运转()炉膛内残留可燃气体.通风时间对于锅炉至少应持续()秒钟。54、【单选题】利·安全生产 模拟 考试一点通·用微压气动控制技术,用于保持物料容器顶部保护气(氮气)的微压力恒定,避免容器内物料与空气直接接触,阻止物料的挥发、被氧化,同时保护容器的安全,这种装置称:()。

MT6735 EMI 定制_mtk emi-程序员宅基地

文章浏览阅读532次。一:MTK 平台查看eMMC和DDR的工作频率eMMC:adb shell cat /sys/kernel/debug/mmc0/clockDDR:adb shell cat /sys/bus/platform/drivers/emi_clk_test/read_dram_data_rate1. 获取 flash id:cat /sys/bl..._mtk emi

分享86个行业PPT,总有一款适合您-程序员宅基地

文章浏览阅读900次,点赞26次,收藏20次。知识付费甚欢喜,为咱码农谋福利。简洁清新时尚大学生恋爱心理健康教育ppt模板。简洁时尚大气卡通教育教学课件培训ppt模板。简洁清新时尚房地产计划运营培训ppt模板。简洁时尚大气金融网络面试介绍ppt模板。简洁时尚大气教育培训说课通用ppt模板。简洁时尚清新物流转正述职报告ppt模板。简洁时尚清新工业地产招商项目ppt模板。简洁时尚清新保险公司团建活动ppt模板。简洁时尚大气银行员工述职报告ppt模板。简洁时尚大气银行营销产品介绍ppt模板。简洁时尚清新教育信息技术说课ppt模板。

如何查看HAL库版本\stm32 HAL版本号_stm32 hal 查看版本-程序员宅基地

文章浏览阅读1.6k次。查看HAL版本_stm32 hal 查看版本

java基于OpenCv图像处理_读取_保存图片_javacv 读取图片-程序员宅基地

文章浏览阅读3.8k次,点赞2次,收藏6次。java基于openCv图像处理本文使用javaCV封装后的OpenCv<dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platform</artifactId> <version>1.5.5</version></dependency>1、图片读取、保存在openCv中有一函数用于读取图片 imr_javacv 读取图片

推荐文章

热门文章

相关标签