当前位置: 首页 > news >正文

【北京迅为】iTOP-4412精英版使用手册-第七章 Android 4.0/Linux源码编译

iTOP-4412开发板【精英版】搭载三星Exynos四核处理器,配备1GB内存,4GB固态硬盘EMMC存储,兼具快速读取与大容量,纵使海量思考也能及时处理。配备三星S5M8767电源管理。配备Android、Linux+Qt、Ubuntu操作系统,开启学习、研发的全新方式。Exynos4412开发板处理器成功应用于三星GALAXYS3,联想K860,魅族MX2等热门产品当中,并取得巨大成功。功耗控制以及强劲的性能一直为业内称道,超过5000万片的出货量,足以证明其稳定性与可用性。已成为三星官方推广的处理器之一,并承诺长期供货。


第七章 Android 4.0/Linux源码编译

本章节中将为您详细介绍 uboot、Linux3.0.15 和Android4.0.3 编译环境的搭建以及编译过程。

迅为电子给用户提供两种搭建编译环境的方式,一种方法是用户安装虚拟机,然后安装基础的 Ubuntu16.04 系统,利用我们提供工具和详细的使用步骤,搭建编译环境;另外一种方法是用户安装虚拟机,然后直接加载我们“搭建好的 Ubuntu 镜像”,用户只需要修改一下编译器的环境变量,就可以直接用来编译源码。

目前我们在 PC 机上搭建的开发环境是 Ubuntu16.04,嵌入式开发对宿主机(也就是建立开发环境的 PC 机)的版本很敏感,不同的宿主机上的 Ubuntu 版本在使用的时候也会遇到不同的情况和问题。所以建议大家在初次学习的时候一定注意版本问题,尽量和手册保持一致

本手册基于 Ubuntu16.04平台做交叉编译开发(Ubuntu 需要安装到 PC 机),所有的配置和编译脚本也是基于此平台。如果你对 Linux 和 Android 开发很熟悉,相信你会根据错误提示逐步找到原因并解决,错误提示一般是选用的平台缺少了某些库文件或者工具等原因造成的;我们强烈建议初学者使用和我们一致的平台,即 Ubuntu16.04,等将来使用熟练以后就可以自己来研究开发更新的版本了,理论上都是可行的。

请在迅为提供的网盘来下载 Ubuntu16.04 的镜像,安装的时候务必参考我们手册提供的步骤,这些步骤是经过严格测试的,请认真执行以免遗漏一些开发时所需要的组件。

Linux 的发行版本众多,我们无法为此一一编写文档,敬请原谅。

Uboot、Kernel(即 Linux 内核,下面等同)以及 Android 的编译环境看似复杂,用户只要抓住以下几个要点就可以了:

第一:Uboot、Kernel 编译器。编译器在光盘中都有提供,在需要使用的步骤中,会说明编译器在光盘中的位置。

第二:设置环境变量。Uboot、Kernel 编译器的环境变量设置后,编译的时候,系统才能找到编译器。

第三:Android 文件系统的编译器。编译器需要使用 Ubuntu 系统自带的 gcc 编译器, 但是版本不对,所以需要降低版本。迅为将这个过程编写了成几个简单的命令,用户只需要挨个执行命令就可以了。

第四:库文件。搭建过程中会给通过执行简单的脚本命令来安装库文件,复杂的步骤变的简单有效。

另外,如果用户想了解编译环境具体是怎么搭建起来的,可以利用我们提供的脚本文件来学习。

无论什么文件系统都需要和 linux 内核以及 uboot 对应,所以在本章节先介绍Android4.0.3 文件系统对应的 uboot 以及 kernel 编译,再介绍 Android4.0.3 文件系统的编译。

7.1 使用搭建好的环境

使用已经搭建编译环境的镜像,用户只需要安装虚拟机“Vmware_Workstaion_wm”, 然后用虚拟机加载搭建好环境的 Ubuntu16.04 镜像。“搭建好的镜像”提供网址供大家下载,加载方法参考“3.1安装VMware-workstation”和“3.2 加载搭建好的Ubuntu16.04虚拟机”。加载完成后参考7.2章节检查环境是否正确 。

7.2 搭建环境

本章介绍安装初始Ubuntu16.04 系统后,逐步搭建编译环境。这里需要注意的是,搭建过程中用到的各类软件,都需要和手册提到的版本保持一致,如果使用的是“搭建好的镜像”,则可以跳过这一节,但是编译的时候要针对性的设置一下环境变量。

7.2.1 安装基本软件

首先安装虚拟机“Vmware_Workstaion_wm”,然后使用虚拟机安装“Ubuntu16.04 初始系统”。Ubuntu 的安装方法可以参考 3.2.2小节来安装 Ubuntu16.04 原始系统,如下图所示,Ubuntu 初始系统安装完成。

 

输入密码“topeet”,登陆 Ubuntu,键盘上按“Ctrl+Alt+t”,弹出 Ubuntu 的控制台。如下图所示。 

参考“3.3.3 Ubuntu基本设置”修改虚拟机配置,更改核数,内存。

参考“3.3.7联网设置”进行联网设置。

参考“3.3.8安装和使用SSH软件”安装SSH。

参考“3.3.6 Ubuntu修改数据源地址”更改数据源。

7.2.2 安装交叉编译器

编译的时候需要用到交叉编译工具,我们提供的交叉编译工具是用户光盘“iTOP-4412精英版\20200624\iTOP-4412精英版光盘资料\02_编译器以及烧写工具\arm 交叉编译器”文件夹中的压缩包“arm-2009q3.tar.bz2”。

 使用 SSH 工具将交叉编译工具拷贝到 Ubuntu16.04 系统的文件夹“usr/local/arm”目录下,local 下默认没有 arm 文件夹,可以新建一个。如下图所示。

 拷贝编译器之后如下图所示。

 然后使用解压命令

tar -vxf arm-2009q3.tar.bz2

解压压缩包,解压完成如下图所示。

修改交叉编译工具路径,需要修改环境变量。在 Ubuntu 命令行中,执行命令“cd /root”和“vim .bashrc”,打开环境变量文件“.bashrc”,如下图所示。 

然后在“.bashrc”文件中的最后一行添加如下信息:

export PATH=$PATH:/usr/local/arm/arm-2009q3/bin

如下图所示。

 

修改完成后保存退出。

执行下列命令,更新环境变量“source .bashrc”的命令,如下图所示。

 

最后,在 Ubuntu 命令行中输入命令“arm”,然后按 TAB 键,如果在命令行中能够看到 arm 编译器的信息,就表明交叉编译工具安装成功。如下图所示。 

7.2.3 安装库文件、JDK

为了方便用户,将库文件和 JDK 的安装命令制作成了脚本文件,用户只要执行两个脚本就可以安装库文件和 JDK。这两个脚本在用户光盘“iTOP-4412精英版\20200624\iTOP-4412精英版光盘资料\02_编译器以及烧写工具\tools”文件夹下的压缩包“Android_JDK.tar.bz2”中,如下图所示。

 

用户将压缩包拷贝到 Ubuntu 系统中,解压压缩包会生成文件夹“Android_JDK”,如下图所示。 

由于版本的问题,我们需要安装依赖包以及添加一个软件源,具体步骤如下:

使用以下命令安装依赖:

apt-get install libgl1-mesa-dev-lts-xenial

apt-get install libswitch-perl

apt-get install u-boot-tools

安装完成之后,使用命令

vim /etc/apt/sources.list

进入软件源:添加以下内容如下图所示:

deb http://cz.archive.ubuntu.com/ubuntu trusty main universe

 

添加完成之后,保存退出依次使用以下命令来更新和安装软件

sudo apt-get update

sudo apt-get upgrade

使用 cd 命令,进入解压出来的“Android_JDK” -->“jdk6”文件夹,运行脚本文件“install-sun-java6.sh”。

如下图所示,执行“./install-sun-java6.sh”脚本。

 

执行上面的命令的时候,根据提示输入“回车”命令。升级完成之后如下图所示: 

进入解压出来的文件夹“Android_JDK”中运行脚本“install-devel-packages.sh”,安装库文件。在 Ubuntu 命令行中,执行命令“./install-devel-packages.sh”如下图所示: 

上面命令执行的时候,需要根据提示输入“Y”。

安装完成,如下图所示。 

这里需要注意的是,上面这个脚本执行完毕的时候,注意一下有些库文件是不是提示没有安装。如果发现有库文件没有安装,有可能是网络不好或者下载源丢失。这个时候用户使用一下更新下载源的命令”apt-get update“,然后再执行一下上面的两个脚本。

例如,如下图所示,再次运行“./install-devel-packages.sh”之后,提示没有无法安装的库和软件,那么表明已经安装完全了。

7.2.4 降低GCC版本

使用 Ubuntu 编译 Android 的时候需要用到 Ubuntu 系统自带的 GCC5 编译器,但是安装的 Ubuntu16.04 版本,它的 GCC 版本过高,所以这里需将要 GCC 编译的版本降低到 4.4.7。

进入前面解压的文件夹“Android_JDK”中,会看到一个文本“update_gcc.txt”,打开文本“update_gcc.txt”后会看到里面有 8 条命令,这 8 条命令需要在 Ubuntu 命令行中依次执行。如下图所示,使用命令打开“update_gcc.txt”文件。

 

如下图所示,有 8 条命令。 

例如执行第一条命令。 

根据提示输入“y”,其余几条命令,如下图所示,执行起来很快。 

在执行了这 8 条命令之后,Ubuntu 系统就将 gcc 的版本降低到 4.4.7。如下图所示,使用命令“gcc -v”,可以看到 gcc 的版本为 4.4.7 了。 

需要注意的是,在执行这 8 条命令时,只有第一条命令较长,其它的都会很快完成,而且命令一定要依次执行,不能有遗漏

7.2.5 安装编译安卓应用库NDK

编译的时候需要用到安卓应用库NDK,我们提供的交叉编译工具是用户光盘“iTOP-4412精英版\20200624\iTOP-4412精英版光盘资料\02_编译器以及烧写工具”文件夹中的压缩包“android-ndk-r8b-linux-x86.tar.bz2”。

 

使用 SSH 工具将交叉编译工具拷贝到 Ubuntu16.04 系统的文件夹“usr/local/ndk”目录下,local 下默认没有 arm 文件夹,可以新建一个。如下图所示。 

拷贝编译器之后如下图所示。 

然后使用解压命令

tar -vxf android-ndk-r8b-linux-x86.tar.bz2

解压压缩包,解压完成如下图所。

 

修改交叉编译工具路径,需要修改环境变量。在 Ubuntu 命令行中,执行命令“cd /root”和“vim .bashrc”,打开环境变量文件“.bashrc”,如下图所示。 

然后在“.bashrc”文件中的最后一行添加如下信息:

export PATH=$PATH:/usr/local/ndk/android-ndk-r8b

如下图所示。

 

修改完成后保存退出。

执行下列命令,更新环境变量“source .bashrc”的命令,如下图所示。

至此,编译安卓应用库NDK就安装完成了。

7.3 编译U-boot

U-boot源码在光盘资料“iTOP-4412精英版\20200624\iTOP-4412精英版光盘资料\iTOP-4412精英版光盘资料\06_源码_uboot和kernel”目录下,如下图所示,

编译器是使用的光盘目录下,“iTOP-4412精英版\20200624\iTOP-4412精英版光盘资料\02_编译器以及烧写工具\arm 交叉编译器”下的“arm-2009q3.tar.bz2”。如果使用的是搭建好的环境,确保编译器环境变量, 如下图所示。 

编译 uboot 的脚本是源码文件夹中的“build_uboot.sh”,在编译的时候需要向脚本传参数,根据核心板的不同,脚本执行参数如下表所示。 

硬件分类

脚本执行参数

核心板 SCP 1G 内存

SCP_1GDDR

核心板 SCP 2G 内存

SCP_2GDDR

核心板POP 1G 内存

POP_1GDDR

核心板POP 2G 内存

POP_2GDDR

下面以SCP 1G核心板为例编译镜像。

将光盘“06_源码_uboot 和 kernel”目录下“CodeSign4SecureBoot_POP”、“CodeSign4SecureBoot_SCP”以及“iTop4412_uboot_xxx.tar.gz”拷贝到 Ubuntu 系统同一目录下,然后将“iTop4412_uboot_xxx.tar.gz”解压,得到“iTop4412_uboot”文件夹,如下图所示。

进入“iTop4412_uboot”文件夹,使用编译脚本“build_uboot.sh”编译 uboot,这里需要编译的是“SCP 1G 核心板”的 uboot 镜像,那么编译命令是:./build_uboot.sh SCP_1GDDR

输入编译命令,如下图所示。这里一定先确定核心板是哪种类型,然后将对应的参数传到脚本。

 

编译完成如下图所示: 

如下图所示,脚本执行完成,在“iTop4412_uboot”文件夹下生成了“u-boot-iTOP- 4412.bin”文件。生成的文件“u-boot-iTOP-4412.bin”文件就是 SCP 1G 内存核心板对应的 uboot 镜像文件 

7.4 编译Linux内核

Linux 内核源码在光盘资料“iTOP-4412精英版\20200624\iTOP-4412精英版光盘资料\iTOP-4412精英版光盘资料\06_源码_uboot和kernel”目录下,如下图所示。

 

内核的编译器和 uboot 的编译器一样,参考“7.2.2安装交叉编译器”。

内核的编译是组合式配置文件,基本的配置文件名是“config_for_android_YY_elite”, YY 表示用下表所示的参数替代。编译安卓的配置文件如下:

硬件分类

配置文件

核心板 SCP 1G 或者 2G 内存

config_for_android_scp_elite

核心板 POP 1G 内存

config_for_android_pop_elite

核心板 POP 2G 内存

config_for_android_pop2G_elite

Qt系统,最小linux系统,arm-Ubuntu16系统的内核编译方法相同,对应的内核、源码以及编译环境都和 Android4.0.3 的内核一样。区别在于‘配置文件’不一样。配置文件如下:

硬件分类

配置文件

核心板 SCP 1G 或者 2G 内存

config_for_linux_scp_elite

核心板 POP 1G 内存

config_for_linux_pop_elite

核心板 POP 2G 内存

config_for_linux_pop2G_elite

编译安卓系统内核镜像:

这里以 SCP 1G 核心板为例编译 安卓4.0的zImage 内核镜像,那么配置文件为“config_for_android_scp_elite”。

编译Qt系统内核镜像:

这里以 SCP 1G 核心板为例,编译Qt系统的 zImage 内核镜像,那么配置文件为“config_for_linux_scp_elite”。

将光盘“06_源码_uboot 和 kernel”目录下的压缩包“iTop4412_Kernel_3.0_xxx.tar.gz”拷贝到 Ubuntu,然后解压,得到文件夹“iTop4412_Kernel_3.0 ”,如下图所示。

进入文件夹“iTop4412_Kernel_3.0 ”,编译安卓SCP 1G镜像,使用命令

cp config_for_android_scp_elite .config

覆盖自带的配置文件,如下图所示。

 

如果用户要使用 5 寸屏幕,先要参考用户手册“7.6 支持 5 寸屏的内核补丁文件”,给内核打补丁,然后使用命令“vim .config”,在文件中搜索关键词“CONFIG_TOUCHSCREEN_GT9XX=y”,在“CONFIG_TOUCHSCREEN_GT9XX=y”之后添加一行“CONFIG_TOPEET_LCD5X0=y”,添加完成之后,如下图所示。如果用户不使用 5 寸屏幕,则可以跳过这一步。 

然后使用编译命令“make zImage”,如下图所示。

编译中,会报错,如下图所示:

我们使用命令

vim kernel/timeconst.pl

进入timeconst.pl文件,使用命令

/if (!defined(@val))

对报错的地方进行查找,如下图所示:

 

将(!defined(@val))改为(!@val),如下图所示:

 

保存退出,重新使用命令make zImage,进行编译,编译完成,如下图所示。 

文件夹“iTop4412_Kernel_3.0 ”下的“arch”-->“arm”-->“boot”会生成镜像文件“zImage”,这个 zImage 镜像可以给 SCP 1G 和 SCP 2G 的核心板使用,如下图所示。 

由于 Android 代码中需要内核中 wifi 驱动,在编译好内核之后,还需要在内核目录中, 执行编译模块的命令“make modules”,再执行编译后面 Android4.0.3 文件系统的脚本, Android4.0.3 源码才能通过。

7.5 编译Android 4.0.3文件系统

Android4.0.3 文件系统的源码在光盘“iTOP-4412精英版\20200624\iTOP-4412精英版光盘资料\07_源码_Android4.0.3 文件系统”目录下,如下图所示。

 

Android4.0.3 的编译器是 4.4.7 版本(包括其他所有版本的 Android 编译器都是相同的),如下图所示,在控制台使用命令“gcc -v”,可以查看到 gcc 的版本。 

编译源码需要降低make的版本具体步骤如下所示:

将迅为提供的“iTOP-4412精英版\20200624\iTOP-4412精英版光盘资料\02_编译器以及烧写工具”路径下的make-3.81.tar.bz2文件拷贝到ubuntu。

 

拷贝完成后,使用命令

tar -vxf make-3.81.tar.bz2

对该文件进行解压,如下图所示:

 

使用命令“cd make-3.81”进入make-3.81目录下下,然后使用以下命令进行配置和决定安装的位置:

./configure --prefix=/home/topeet/makeinstall/

 

配置完成之后使用命令“sh build.sh”进行编译,如下图所示: 

编译完成之后使用命令“make install”进行安装,安装完成如下图所示: 

然后使用命令进入安装路径的bin目录下,如下图所示: 

这个make就是我们所用到的,使用命令

cp make /usr/bin/

将make拷贝到/usr/bin目录下,如下图所示:

 

至此,我们编译android4.0.3的环境就搭建完成了。

源码中无参数配置,所有种类核心板对应的 Android4.0.3 都使用同一套源码,同一种编译方法。

编译脚本是“build_android.sh”。

将光盘“07_源码_Android4.0.3 文件系统”目录下压缩包“iTop4412_ICS_git_xxx.tar.gz”拷贝到 Ubuntu 系统中,解压压缩包,得到文件夹“iTop4412_ICS_git”。这里需要注意的是,Android 源码文件夹“iTop4412_ICS_git ”和内核源码文件夹“iTop4412_Kernel_3.0”需要放到同一目录下,如下图所示。

 

进入“iTop4412_ICS_git”目录,使用命令“./build_android.sh”运行编译脚本,编译Android4.0.3,如下图所示。注意:编译 Android4.0.3 必须保证给 Ubuntu 系统提供 2G 以上内存。这里“提供 2G 以上内存”的意思,不仅仅是指在 VMware Workstations 虚拟机中设置分配 2G 内存。例如,用户在编译的时候,PC 机的内存一共是 4G,在虚拟机中设置分配3G 内存,但是在 Windows 系统下,开着 QQ,杀毒软件,音乐播放器,浏览器等等,这样在 Windows 下占用的内存就快 2G 了,那么虚拟机会自动调整到只占用 2G,甚至不到 2G 的内存,这样就有可能没法编译通过。

正确的分配内存方法是,首先给虚拟机分配 2G 以上内存,然后在 Windows 下关掉尽量多的不必要的应用,关掉尽量多应用的后台程序。

当然,如果用户的 PC 是 8G 或者 16G 内存,随意就成。

在编译之前还需要修改一下安卓源码目录下dalvik/vm/native/dalvik_system_Zygote.cpp的头文件,使用命令

vim dalvik/vm/native/dalvik_system_Zygote.cpp

进入dalvik_system_Zygote.cpp文件下,添加头文件#include <sys/resource.h> ,如下图所示:

 

保存退出,使用命令./build_android.sh,开始编译,如下图所示。 

 

编译比较耗费时间,第一次编译会花费 60 分钟以上。 

 

编译完成后在文件夹“iTop4412_ICS\out\target\product\smdk4x12”目录下生成 Android4.0.3 镜像文件“ramdisk-uboot.img”和“system.img”,如下图所示。 

 

如果编译报错,请注意:在编译好内核之后,还需要在内核目录中,执行编译模块的命令“make modules”,再执行编译 Android4.0.3 文件系统的脚本才不会报错,因为Android4.0.3 源码中会用到内核中的 wifi 驱动,wifi 模块的驱动必须要使用命令编译一下才行。

7.6 支持5寸屏的内核补丁

本节介绍如何给内核打补丁,以支持 5 寸屏幕。如果用户不使用 5 寸屏,本节可以直接跳过。

内核源码包是“iTop4412_Kernel_3.0_20180604.tar.gz”,一定要是 20180604 结尾的内核压缩包才行,如果用户使用的是老版本,则需要根据补丁文件添加代码。

补丁包是光盘“iTOP-4412精英版\20200624\iTOP-4412精英版光盘资料\09_uboot_Linux内核扩展驱动补丁文件\LCD5X0 补丁文件”目录下的压缩包“patch_elite4x0_lcd5x0.tar.gz”。

拷贝到内核源码目录下(一定要拷贝到内核源码的目录下),如下图所示,使用命令“tar -vxf patch_elite4x0_lcd5x0.tar.gz”解压得到文件夹“patch_elite4x0_lcd5x0”,文件夹中有 5 个补丁文件,1 个脚本文件。

进入解压得到的文件夹“patch_elite4x0_lcd5x0”,使用命令“chmod 777 script_patch_elite4x0_lcd5.sh”修改脚本权限。

接着使用“./script_patch_elite4x0_lcd5.sh u”命令,到这一步就打完补丁了,如下图所示。

 打补丁的脚本只需要运行一次,如果多次运行则会增加额外的代码,会导致内核无法使用。

用户在 iTop4412_Kernel_3.0_20180604.tar.gz 原始内核的基础上,运行了“./script_patch_elite4x0_lcd5.sh u”N 次,则可以使用命令“./script_patch_elite4x0_lcd5.sh r”同样也是 N 次,则可以返回到打补丁前的状态。

http://www.xdnf.cn/news/317431.html

相关文章:

  • 在 Vue 2 中使用 qrcode 库生成二维码
  • Python 识别图片上标点位置
  • CSDN文章都是VIP
  • Ubuntu 使用dotfiles个性化配置模板
  • 使用 Apache POI 生成包含文本和图片的 Word 文档
  • 【MCP】从0到1实现一个MCP Client
  • 【Python类(Class)完全指南】面向对象编程入门
  • 阿里云服务器-centos部署定时同步数据库数据-dbswitch
  • 【Django】中间件
  • 软件工程(三):模块的内聚模型
  • 如何在大型项目中解决 VsCode 语言服务器崩溃的问题
  • 政务浏览器 一站式首页功能配置说明
  • 极狐GitLab 命名空间的类型有哪些?
  • css animation 动画属性
  • 华为昇腾910B通过vllm部署InternVL3-8B教程
  • 大模型系列(五)--- GPT3: Language Models are Few-Shot Learners
  • IPFS集群部署
  • Linux/AndroidOS中进程间的通信线程间的同步 - 信号量
  • Java游戏服务器开发流水账(1)游戏服务器的架构浅析
  • Wireshark抓账号密码
  • 一文走进GpuGeek | conda常用命令
  • Prompt(提示词)工程师,“跟AI聊天”
  • Java版ERP管理系统源码(springboot+VUE+Uniapp)
  • FID和IS的区别
  • STM32裸机开发问题汇总
  • (1-1)Java的JDK、JRE、JVM三者间的关系
  • 淘宝按图搜索商品(拍立淘)爬虫实战指南
  • 技术视界|青龙机器人训练地形详解(二):添加地形到训练环境
  • 光伏“531”政策倒逼下,光储充一体化系统如何破解分布式光伏收益困局?
  • sql错题(3)