如何讲CM Android移植到你的设备?

简介: 版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/50343621 关于将cm android移植到你的设备上的一些技巧你可能会遇到CM并不支持的手机设备或者是平板设备。
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/50343621

关于将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和更高版本中使用。

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

目录
相关文章
|
4月前
|
Android开发 iOS开发 UED
探索未来:Android与iOS在智能穿戴设备上的较量
随着科技的飞速进步,智能穿戴设备已经成为我们日常生活中不可或缺的一部分。本文将深入探讨两大操作系统——Android和iOS——在智能穿戴领域的竞争与发展,分析它们各自的优势与挑战,并预测未来的发展趋势。通过比较两者在设计哲学、生态系统、用户体验及创新技术的应用等方面的差异,揭示这场较量对消费者选择和市场格局的影响。 【7月更文挑战第31天】
52 0
|
3月前
|
Shell Linux 开发工具
"开发者的救星:揭秘如何用adb神器征服Android设备,开启高效调试之旅!"
【8月更文挑战第20天】Android Debug Bridge (adb) 是 Android 开发者必备工具,用于实现计算机与 Android 设备间通讯,执行调试及命令操作。adb 提供了丰富的命令行接口,覆盖从基础设备管理到复杂系统操作的需求。本文详细介绍 adb 的安装配置流程,并列举实用命令示例,包括设备连接管理、应用安装调试、文件系统访问等基础功能,以及端口转发、日志查看等高级技巧。此外,还提供了常见问题的故障排除指南,帮助开发者快速解决问题。掌握 adb 将极大提升 Android 开发效率,助力项目顺利推进。
88 0
|
3月前
|
Android开发
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
本文介绍了如何在基于Amlogic T972的Android 9.0系统上使用Platform平台驱动框架和设备树(DTS),实现设备与驱动的分离,并通过静态枚举在设备树中描述设备,自动触发驱动程序的加载和设备创建。
50 0
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
|
3月前
|
Android开发 C语言
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
这篇文章是关于如何在基于Amlogic T972的Android 9.0系统上,通过自动分配设备号和自动创建设备节点文件的方式,开发字符设备驱动程序的教程。
56 0
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
|
3月前
|
自然语言处理 Shell Linux
基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备
本文是关于在Amlogic安卓9.0平台上创建字符设备驱动的教程,详细介绍了驱动程序的编写、编译、部署和测试过程,并提供了完整的源码和应用层调用示例。
81 0
基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备
|
3月前
|
传感器 Android开发 芯片
不写一行代码(三):实现安卓基于i2c bus的Slaver设备驱动
本文是系列文章的第三篇,展示了如何在Android系统中利用现有的i2c bus驱动,通过编写设备树节点和应用层的控制代码,实现对基于i2c bus的Slaver设备(如六轴陀螺仪模块QMI8658C)的控制,而无需编写设备驱动代码。
49 0
不写一行代码(三):实现安卓基于i2c bus的Slaver设备驱动
|
3月前
|
Android开发
不写一行代码(二):实现安卓基于PWM的LED设备驱动
本文介绍了在Android系统中不编写任何代码,通过设备树配置和内核支持的通用PWM LED驱动来实现基于PWM的LED设备驱动,并通过测试命令调整LED亮度级别。
44 0
不写一行代码(二):实现安卓基于PWM的LED设备驱动
|
3月前
|
Linux Android开发 C语言
不写一行代码(一):实现安卓基于GPIO的LED设备驱动
本文通过实践操作,展示了在Android系统中不编写任何代码,利用设备树(DTS)配置和内核支持的通用GPIO LED驱动来控制LED设备,并进一步通过C语言编写NDK测试APP来实现LED的闪烁效果。
146 0
不写一行代码(一):实现安卓基于GPIO的LED设备驱动
|
3月前
|
存储 Ubuntu API
如何使用Python创建服务器向Android设备发送GCM推送通知
如何使用Python创建服务器向Android设备发送GCM推送通知
28 0
|
4月前
|
Android开发 数据安全/隐私保护 iOS开发
探索未来:安卓与iOS在智能穿戴设备领域的较量
随着科技的飞速发展,智能穿戴设备已逐渐成为我们日常生活的一部分。从健康监测到通讯交流,它们正以惊人的速度改变着我们的生活方式。本文将深入探讨安卓和iOS这两大操作系统在智能穿戴领域的现状、竞争以及未来发展趋势,揭示它们如何通过创新技术满足用户需求,并预测未来可能的发展方向。
43 0