安卓Android ROM定制移植教程.docx
《安卓Android ROM定制移植教程.docx》由会员分享,可在线阅读,更多相关《安卓Android ROM定制移植教程.docx(11页珍藏版)》请在冰豆网上搜索。
安卓AndroidROM定制移植教程
CyanogenMOD移植教程
转自秋叶随风Ivan;乐蛙论坛等。
第一章:
环境的搭建
一.系统选择和安装
建议使用ubuntuLTS10.04X64
新手朋友推荐DeepinLinux基于ubuntu定制的,适合新手使用
系统安装教程,以下方法通用于UBUNTU官方版本
U盘安装:
光盘安装:
搭建android编译环境:
英文好的请猛击这里:
WIKI:
1.安装JDK
因为ANDROID大部分东西是java写的,所以首先我们需要安装JDK
打开终端按照如下命令输入或者直接复制粘贴:
编译android2.3或者更新的版本请使用jdk6
$sudoadd-apt-repository"deblucidpartner"
$sudoapt-getupdate
$sudoapt-getinstallsun-java6-jdk如果你需要编译的是2.2以下的版本请使用JDK5,因为现在大家都是使用Gingerbread以上的系统,这里就不介绍jdk5如何安装的了,如果有需要请度娘或者google
2.安装各种依赖包
64位环境:
依然是终端中输入
$sudoapt-getinstallgit-coregnupgflexbisongperfbuild-essential\
zipcurlzlib1g-devlibc6-devlib32ncurses5-devia32-libs\
x11proto-core-devlibx11-devlib32readline5-devlib32z-dev\
libgl1-mesa-devg++-multilibmingw32tofrodospython-markdown\
libxml2-utilsxsltproc
如果这些依赖包依然不能解决你的问题,请参考如下:
3.下载代码
打开终端:
在个人目录下面使用的是android代替我的工程,用cm7代替CM7的源码用CM9代替CM9的源码
如果要更新下载CM7的源码
请输入:
mkdir-p~/bin
mkdir-p~/android/cm7
个人目录下的bin目录是为了保存repo等更新脚本的
依然再终端输入:
curlhttps:
//dl->~/bin/repochmoda+x~/bin/repo
可以把~/bin/repo加入到环境变量里面
终端输入sudogedit/etc/environment
在PATH=“”加入PATH="/home/ivanhuang/bin:
"
ivanhuang为个人目录的名称,也就是计算机登录名
更改结束之后终端输入source/etc/environment
就能直接在终端中使用repo命令了。
然后下一步开始同步代码:
依然是打开终端输入
cdandroid/cm7
repoinit-ugit:
//-bgingerbreadreposync-j16
这个是更新CM7的源码Gingerbread分支的
如果要更新CM9的源码
请输入
mkdir-pandroid/cm9
repoinit-ugit:
//-bics
reposync-j16
Ubuntu中安装配置JDK
首先从SUN网站下载JDK
然后在shell中执行:
代码:
sudochmod+xjdk-6u17-linux-i586.bin
修改bin文件权限,使其可执行。
然后执行
代码:
jdk-6u17-linux-i586.bin
将会出现字幕,持续按回车键,直到屏幕出现需要输入yes/no,此时输入yes/y回车,将会把JDK解压到文件夹,得到jdk1.6.0_17.此时JDK安装完毕。
下面进行配置。
执行
代码:
sudogedit/etc/environment
在environment中修改如下信息:
PATH="........:
/home/cy/jdk1.6.0_17/bin"
CLASSPATH=".:
/home/cy/jdk1.6.0_17/lib"
JAVA_HOME="/home/cy/jdk1.6.0_17"
由于ubuntu中有默认jdk还需要执行如下工作
执行
代码:
sudoupdate-alternatives--install/usr/bin/javajava/home/cy/jdk1.6.0_17/bin/java300
sudoupdate-alternatives--install/usr/bin/javacjavac/home/cy/jdk1.6.0_17/bin/javac300
通过这一步将,安装的JDK加入java选单
然后执行。
代码:
sudoupdate-alternatives--configjava
通过这一步设置系统默认的JDK
然后在shell中执行
代码:
java-version
此时显示的系统中的java就是刚刚安装的java
第二章:
android源码总体结构
–Makefile(全局的Makefile文件)
–bionic(Bionic含义为仿生,这里面是一些基础的C库源代码)
–bootloader(引导加载器)
build目录中的内容不是目标所用的代码,而是编译和配置所需要的脚本和工具)
–build(build目录中的内容不是目标所用的代码,而是编译和配置所需要的脚本和工具)
–cts(Android兼容性测试套件标准)
–libcore(核心库相关)
Dalvik虚拟机针对嵌入式设备优化的Java
Java虚拟机)
–dalvik(Dalvik虚拟机,针对嵌入式设备优化的Java虚拟机)
–development(创建应用程序所需要的模板和工具)
qcom,
–device(与具体设备相关的一些编译脚本和库,如htc,qcom,samsung等)
–external(Android使用的一些外部的开源框架和库)
(应用程序的框架层,SDK
SDK的接口基本都是在这里实现的)
–frameworks(应用程序的框架层,SDK的接口基本都是在这里实现的)
–hardware(与硬件相关的库)
Linux2.6
–kernel(Linux2.6的内核源代码)
–ndk(本地开发套件--C语言开发套件)
--C
Android的各种应用程序)
–packages(Android的各种应用程序)
–prebuilt(Android在各种平台下编译的预置脚本)
–sdk(SDK及模拟器)
Android的底层的一些库)
–system(Android的底层的一些库)
`–vendor(厂商私有的代码)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
packages/
|–apps(各种应用程序,如联系人、浏览器等)
|–experimental(一些实验性的项目,如错误报告)
|–inputmethods(输入法相关)
|–providers(各种数据源实现,如联系人数据、媒体库等信息)
|–wallpapers(各种壁纸程序)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
AndroidFramework功能介绍
android.app:
提供高层的程序模型和基本的运行环境。
android.content:
包含对各种设备上的数据进行访问和发布。
android.database:
通过内容提供者浏览和操作数据库。
android.graphics:
底层图形库,包含画布、点、矩形等,可以将其直接绘制到屏幕上。
android.location:
定位和相关服务的类。
android.media:
提供一些类管理多种音频、视频的媒体接口。
:
提供帮助网络访问的类,超过通常的.*接口。
android.os:
提供了系统服务、消息传输和IPC机制。
android.opengl:
提供OpenGL的工具。
android.provider:
提供访问Android内容提供者的类。
android.telephony:
提供与拨打电话相关的API交互。
android.view:
提供基础的用户界面接口框架。
android.util:
涉及工具性的方法,例如时间日期的操作。
android.webkit:
默认浏览器操作接口。
android.widget:
包含各种UI元素(大部分是可见的)在应用程序的布局中使用
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/
|–buildspec.mk.default
|–cleanspec.mk
|–core(各种以mk为结尾的文件,它门是编译所需要的Makefile)
|–envsetup.sh
|–libs
|–target(包含board和product两个目录,为目标所需要文件)
|–tools(编译过程中主机所需要的工具,一些需要经过编译生成)
其中,core中的Makefile是整个Android编译所需要的真正的Makefile,它被顶层目录的Makefile引用。
第三章:
如何编译一个支持你设备的recovery
前面已经介绍过CyanogenMod是什么东西,以及环境搭建,android源码的大概框架。
地址:
,所以这里就不再介绍。
首先要确定你的设备,是否支持刷第三方recovery,或者是否支持fastboot模式,或者是否解锁bootloader,如果你的设备上述都不支持,那么你的机器可能就不能移植第三方系统。
如果这样请跳过本文。
当你确定你的设备有支持上述所讲的,那么恭喜你,你的设备可以移植第三方系统。
接下来开始干活了,工欲善其事,必先利其器。
制作支持你手持设备的recovery。
这里以中兴n760为例子介绍如何编译支持中兴n760的recovery.
如果你已经下载了cm源码,请往下看,如果你没有下载源码,请按照前面发的教程下载源码.首先在device目录下面建立一个zte目录,这个目录是厂商的名字,例如中兴就是zte我就建立zte,华为的话我就建立huawei,然后在zte目录下面建立一个目录为roamer这个名字如何得到呢,在手机rom里面system/build.prop目录下面搜索ro.product.device你会发现ro.product.device=roamer所以我把设备名称定为roamer目录都新建好了之后,我们来看一下目录树
system
|-------device
|-------zte
|----roamer
这个就是目录结构,我们在roamer目录下面,新建
recovery_ui.c这个文件里面是手机各按键对应的按键值,这样写入之后才能正确选择按键
AndroidBoard.mk连接地址到kernel
AndroidProducts.mk让编译工具连接到device_roamer.mk
BoardConfig.mk手持设备机器CPUGPU型号参数配置
device_roamer.mkbuild.prop信息添加,私有库xml文件init文件拷贝按机器设备device来写roamer是N760的设备型号
kernel官方提取,boot.img提取提取可以使用国外高手制作的厨房软件
recovery.fstab手机分区表
system.prop可有可无
从官方rom提取,比如n760boot.img里面提取的init.roamer.rc文件这个也是需要这些文件的.
首先我们写AndroidBoard.mk文件
#这一句的意思的根目录就是roamer目录
AndroidProducts.mk看文件名
PRODUCT_MAKEFILES:
=\
$(LOCAL_DIR)/device_roamer.mk
BoardConfig.mk设备的配置文件
USE_CAMERA_STUB:
=true
#inheritfromtheproprietaryversion
-includevendor/zte/roamer/BoardConfigVendor.mk
TARGET_NO_BOOTLOADER:
=true
TARGET_BOARD_PLATFORM:
=unknown
TARGET_CPU_ABI:
=armeabi
TARGET_BOOTLOADER_BOARD_NAME:
=roamer//此处一版为device
#此处为打包boot.img的信息,可以通过厨房查看到,我模糊的记得用厨房解压boot.img的时候的选项应该是打开厨房,选择0高级,然后选择20,再选择S就能看到下面这三个信息了
#dev:
sizeerasesizename
#mtd0:
0060000000020000"recovery"
#mtd1:
0040000000020000"boot"
#mtd2:
0018000000020000"splash"
#mtd3:
0008000000020000"misc"
#mtd4:
0398000000020000"cache"
#mtd5:
0dc0000000020000"system"
#mtd6:
0a28000000020000"userdata"
#mtd7:
0010000000020000"oem"
#mtd8:
0018000000020000"persist"
BOARD_BOOTIMAGE_PARTITION_SIZE:
=0x00500000
BOARD_RECOVERYIMAGE_PARTITION_SIZE:
=0x00600000
BOARD_SYSTEMIMAGE_PARTITION_SIZE:
=0x0dc00000
BOARD_USERDATAIMAGE_PARTITION_SIZE:
=0x0a280000
BOARD_FLASH_BLOCK_SIZE:
=131072
#内核路径
TARGET_PREBUILT_KERNEL:
=device/zte/roamer/kernel
#一般情况下,手机没有实体返回键,建议选择这一项,有的手机触摸返回键在recovery下面不能使用的,比如小米手机。
BOARD_HAS_NO_SELECT_BUTTON:
=true#编译recovery指定keymap文件,看参数名称就知道了,不懂的可以google翻译
device_roamer.mk这个是编译recovery的时候我写的,有些东西可以不要,以后编译rom的时候需要删除重写的
#语言配置文件
$(callinherit-product,$(SRC_TARGET_DIR)/product/languages_full.mk)
#Thegpsconfigappropriateforthisdevicegps配置文件
$(callinherit-product,device/common/gps/gps_as_supl.mk)
#vendor私有库配置文件
$(callinherit-product-if-exists,vendor/zte/roamer/roamer-vendor.mk)
#有些你需要对应用或者framework进行初始化设定值的地方
DEVICE_PACKAGE_OVERLAYS+=device/zte/roamer/overlay
#kernel路径选择
ifeq($(TARGET_PREBUILT_KERNEL),)
LOCAL_KERNEL:
=device/zte/roamer/kernel
else
LOCAL_KERNEL:
=$(TARGET_PREBUILT_KERNEL)
endif
PRODUCT_COPY_FILES+=\
$(LOCAL_KERNEL):
kernel
$(callinherit-product,build/target/product/full.mk)
PRODUCT_BUILD_PROP_OVERRIDES+=BUILD_UTC_DATE=0
PRODUCT_NAME:
=full_roamer
PRODUCT_DEVICE:
=roamer
recovery.fastab官方recovery.img提取自己想个办法,我用厨房提取的
全部写好之后在源码根目录用终端输入.build/envsetup.sh然后输入lunch选择你的设备
然后输入makerecoveryimage就可以编译了
编译结束之后,到out/target/product/roamer目录下面可以发现recovery.img这个文件
使用fastboot工具到fastboot模式下面刷写,刷写命令为fastbootflashrecoveryrecovery.img
教程到此结束,有关如何进入fastboot模式recovery模式,还有fastboot工具使用,请google或者baidu
谢谢