1.系统选择和安装
我使用的是 ubuntu LTS 10.04 X64
建议使用X64版本,我使用的就是该版本
新手朋友推荐Deepin Linux 基于ubuntu定制的,适合新手使用
http://www.linuxdeepin.com/download
系统安装教程,以下方法通用于UBUNTU官方版本
U盘安装:http://wiki.linuxdeepin.com/index.php/Unetbootin
光盘安装:http://wiki.linuxdeepin.com/index.php/光盘安装
搭建android编译环境:
英文好的请猛击这里:WIKI:http://wiki.cyanogenmod.com/index.php?title=Building_from_source
1.安装JDK
因为ANDROID大部分东西是java写的,所以首先我们需要安装JDK
打开终端按照如下命令输入或者直接复制粘贴:
编译android 2.3 或者更新的版本请使用 jdk 6
$ sudo add-apt-repository "deb
http://archive.canonical.com/ lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk
如果你需要编译的是2.2以下的版本请使用JDK 5,因为现在大家都是使用 Gingerbread 以上的系统,这里就不介绍jdk5如何安装的了,如果有需要请 度娘 或者 google
2.安装各种依赖包
64位环境:依然是终端中输入
$ sudo apt-get install git-core gnupg flex bison gperf build-essential \
zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \
x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \
libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \
libxml2-utils xsltproc
如果这些依赖包依然不能解决你的问题,请参考如下:
http://wiki.cyanogenmod.com/wiki/HTC_Hero_(CDMA):_Compile_CyanogenMod_(Linux)
http://source.android.com/source/initializing.html
3.下载代码
打开终端:
我在我的个人目录下面使用的是android 代替我的工程,用cm7代替 CM7的源码 用CM9代替 CM9的源码
如果你要更新下载CM7的源码
请输入:
mkdir -p ~/bin
mkdir -p ~/android/cm7
个人目录下的 bin目录是为了保存repo 等更新脚本的
依然再终端输入:
curl
https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repochmod a+x ~/bin/repo
可以把 ~/bin/repo 加入到环境变量里面
终端输入 sudo gedit /etc/environment
在PATH=“” 加入 PATH="/home/ivanhuang/bin:"
ivanhuang为我个人目录的名称,也就是我的计算机登录名
更改结束之后 终端输入 source /etc/environment
就能直接在终端中使用repo 命令了。
然后下一步 我们开始同步代码:
依然是打开终端输入
cd android/cm7
repo init -u
git://github.com/CyanogenMod/android.git -b gingerbreadrepo sync -j16
这个是更新CM7的源码 Gingerbread分支的
如果你要更新CM9的源码
请输入
mkdir -p android/cm9
repo sync -j16
今天就到这里,其他按照机器适配等编译命令,请参考 cyanogenmod的wiki 上面已经列出
[CyanogenMOD移植教程]第一章:环境的搭建 补充
Ubuntu 中安装配置JDK首先从SUN网站下载JDK
然后在shell中执行:
代码:
sudo chmod +x jdk-6u17-linux-i586.bin
修 改bin文件权限,使其可执行。
然后执行
代码:
jdk-6u17-linux-i586.bin
将 会出现字幕,持续按回车键,直到屏幕出现需要输入yes/no,此时输入yes/y 回车,将会把JDK解压到文件夹,得到jdk1.6.0_17.此时JDK安装完毕。下面进行配置。
执行
代码:
sudo gedit /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还需要执行如下工作
执行
代码:
sudo update-alternatives --install /usr/bin/java java /home/cy/jdk1.6.0_17/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /home/cy/jdk1.6.0_17/bin/javac 300
通过 这一步将我们安装的JDK加入java选单
然后执行。
代码:
sudo update-alternatives --config java
通 过这一步设置系统默认的JDK
然后在shell中执行
代码:
java -version
此时显示的系统中的java就是刚刚安装的 java
[
本帖最后由 Wince.Android 于 2013-6-4 09:48 编辑 ]
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
[CyanogenMOD移植教程]第二章: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 (各种壁纸程序)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Android Framework功能介绍
android.app :提供高层的程序模型和基本的运行环境。
android.content :包含对各种设备上的数据进行访问和发布。
android.database :通过内容提供者浏览和操作数据库。
android.graphics :底层图形库,包含画布、点、矩形等,可以将其直接绘制到屏幕上。
android.location :定位和相关服务的类。
android.media :提供一些类管理多种音频、视频的媒体接口。
android.net :提供帮助网络访问的类,超过通常的 java.net.* 接口。
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引用。
基本介绍到此,文章参考网络中各种文章,如果有侵权啥行为的,请联系删除。
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
[CyanogenMOD移植教程]第三章:移植第一步 编译recovery
作者:秋叶随风 (ivan)
来源:深度社区
本章介绍并且讲解如何编译一个支持你设备的recovery。
前面已经介绍过CyanogenMod是什么东西,以及环境搭建,android源码的大概框架。地址:http://blog.sina.com.cn/u/1697247850 ,所以这里就不再介绍。
首先你要确定你的设备,是否支持刷第三方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 手持设备 机器CPU GPU 型号参数配置
device_roamer.mk build.prop信息添加,私有库 xml文件 init文件拷贝 按机器设备device来写 roamer是N760的设备型号
kernel 官方提取,boot.img提取 提取可以使用国外高手制作的厨房软件
recovery.fstab 手机分区表
system.prop 可有可无
从官方rom提取,比如 n760 boot.img 里面提取的 init.roamer.rc 文件 这个也是需要这些文件的.
首先我们写 AndroidBoard.mk 文件
# 这一句的意思的 根目录就是 roamer 目录
AndroidProducts.mk 看文件名
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/device_roamer.mk
BoardConfig.mk 设备的配置文件USE_CAMERA_STUB := true
# inherit from the proprietary version
-include vendor/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: size erasesize name
# mtd0: 00600000 00020000 "recovery"
# mtd1: 00400000 00020000 "boot"
# mtd2: 00180000 00020000 "splash"
# mtd3: 00080000 00020000 "misc"
# mtd4: 03980000 00020000 "cache"
# mtd5: 0dc00000 00020000 "system"
# mtd6: 0a280000 00020000 "userdata"
# mtd7: 00100000 00020000 "oem"
# mtd8: 00180000 00020000 "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的时候需要删除重写的
#语言配置文件
$(call inherit-product, $(SRC_TARGET_DIR)/product/languages_full.mk)
# The gps config appropriate for this device gps配置文件
$(call inherit-product, device/common/gps/gps_as_supl.mk)
# vendor 私有库配置文件
$(call inherit-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
$(call inherit-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 选择你的设备
然后输入 make recoveryimage 就可以编译了
编译结束之后,到out/target/product/roamer目录下面可以发现 recovery.img 这个文件
使用fastboot 工具到fastboot 模式下面刷写,刷写命令为 fastboot flash recovery recovery.img
教程到此结束,有关如何进入fastboot模式 recovery模式,还有fastboot工具使用,请google 或者 baidu
谢谢
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
摘要: 其实移植并不难,主要看你有没有耐心。比如我拿MOTO XT701来举例 这里以目前CM7系列2.3.7版本系统爲基础,其他系统略有不同。 要移植,就要了解系统的结构和打包解包: 打包很容易,只需要制作成ZIP格式的压缩包就行 ...
其实移植并不难,主要看你有没有耐心。比如我拿MOTO XT701来举例
这里以目前CM7系列2.3.7版本系统爲基础,其他系统略有不同。
要移植,就要了解系统的结构和打包解包:
打包很容易,只需要制作成ZIP格式的压缩包就行了,里面包含2个文件夹和1个boot.img文件,boot.img是内核,没有内核的系统是不能运行的,另外两个文件夹一个是system,也就是Android系统所在地,另一个是META-INF,这里一般存放是刷机脚本,我们移植一般需要改的就是system文件夹里的内容。
解包就是解压缩。
首先说结构,system下有:
App文件夹(存放内置软件的地方,每个软件都有自己的名字标注着,很容易识别,在移植上除USB.apk必须用咱们自己的版本以外,其他可以用同分辨率机型的APP直接替换)
Bin文件夹(本文件夹一般存放的是开机运行的脚本和一些系统必备代码,一般移植出了问题不能开机就是这里的问题,一般我们用702的或者720的ROM里的,注意除了NETD需要用701的外,其他也可以直接用702或者720ROM的,不过一般系统升级不会修改这里,在移植的时候,要删除2nd-init以及所有.sh脚本文件,这些对701是没有效果的,如果电池显示?,那么可以通过替换battd文件来修複)
Etc文件夹(本文件夹里存放着这种配置文件,包括WIFI,蓝牙和基带{\etc\motorola\bp_nvm_default}配置文件,A-GPS的文件和Hosts文件也在这里,media_profiles.xml可以控制录像质量,cameraCalFileDef5M.bin与cameraCalFileDef8M.bin是照相的数据库文件,都可以修改,子文件夹init.d文件夹下可以写入自己的开机脚本,来实现一些程序或者脚本开机啓动,如果想要执行某模块,可以添加一个文件,不要有后缀名,格式爲00aaa 00是执行序号,系统开机时会按顺序执行,aaa是爲了区别每个脚本的名称,可以随便写)
Font文件夹(字体文件夹,没什么好解释的,你可以替换爲你喜欢的字体)
Framework文件夹(系统框架结构文件目录,这个目录下是系统服务和系统界面的所在地,一般不可以单独替换,要移植的话必须全部替换,不然会卡M,framework-res.apk文件就是系统语言,界面的所在文件,修改他就可以直接修改系统界面,framework-res.apk必须与app文件夹中systemui.apk配套,不然开机会出现状态栏FC,不同版本不可以乱用,比如CM7.1.0.5不能用CM7.1.0.4的文件)
Lib文件夹(本文件夹是系统所需要用到的驱动,库文件的所在,如果某程序FC或者无法正常运转,可能是这里的问题,我把我知道的一些文件的用途说一下:
***Lib/dsp文件夹 DSP驱动所在,一般不需要改
***lib/egl 显示芯片驱动,一般不需要改
***libaudio.so 话筒及音频驱动 必须用701的
***libaudioflinger.so 音频附属驱动 必须用701的
***libbridge.so 相机方面
***libbattd.so 电池驱动
***libcamera.so 相机驱动 必须用701的
***libcameraservice.so 相机服务驱动
***libfmradio.so FM驱动
***libHPImgApi.so 图片接口驱动 必须用701的
***libLCML.so 未知驱动 必须用701的
***liboemcamera.so 相机驱动 必须用701的
***libOMX.TI.JPEG.Encoder.so 照片编码器 必须用701的 否则照片黑
***libOMX.TI.AAC.decode.so 此类型的都是编码器和解码器驱动(多媒体)
除上述红色文件必须用701外,其他文件可以直接用702或者720的。
Media文件夹(铃声及开机动画)
TTS文件夹(文字转语音文件夹)
Usr文件夹(键盘文件与各类数据库)
Xbin文件夹(系统工具文件夹)
Build.prop文件(系统参数文件,修改这里可以调节系统部分参数与性能)
如:默认虚拟机大小,铃声延迟,系统版本等
一般来说只要遵循规律,由少至多移植,不会出现什么问题,出现问题就从头开始,多积累经验,慢慢就会了。
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
本教 程主要内容有:Android系统文件夹 结构解析、应用软件说明、定制精简、ROM签名把包等内容。刷机有风险,出问题自负。本文有部份内容来自于网络。
速度与华丽,你喜欢那个。是不是想要一个又够速度又华丽的ROM呢?我是一个追求新鲜的人,对于手机的ROM,我又追求稳定、精简、美观、省电。现在Hero ROM有很多,最新的有第三方Android 2.1版本,但这些ROM的制作者都会跟据自已的个人喜欢会增加和增少相应的功能或是界面,但我们往往不喜欢这些ROM的某些小方面,所以随着而来面对的问题就是怎样把这个ROM修改成为一个自已真正需要的ROM呢?以往一直是依靠“大杀器”来解决,但觉得还是过于麻烦,所以寻求办法自己动手修改ROM。于是有了本文。废话少说,进入题。
一、Android系统文件夹结构
一个完整的ROM根目录会有以下几个文件夹及文件:
data
META-IN
system
boot.img
系统目录说明
1. 应用程序安装目录
1) 系统应用程序所在目录
/system/app/*.apk
2)用户安装应用程序所在目录
/data/app/*.apk
3) 注意:
a)在模拟器中,每重启一次,/system/app/下的应用都会被还原,有时/data/app下也会被清除
b)若在/system/app和/data/app下有重名的应用,不一定会启动哪一个,尤其是在adb install杀死正在运行的程序时,有时旧的就会被启动
2.用户数据所在目录
/data/data/应用包名/shared_prefs 配置文件
/data/data/应用包名/databases/* 库文件所在目录
3. SD卡对应目录
/sdcard/
而我们需要处理的只是两个文件夹里面的内容:
data/app –该文本夹里的文件可以全删,也可以自由添加自已所需安装的应用软件,刷机安装后可以自由删除。
system/app –在这个文件夹下的程序为系统默认的组件,可以看到都是以APK格式结尾的文件,但有些自制的ROM里面还有和APK文件名对应的odex文件。我们主要是针对该文件夹里的文件进行精简,如果有odex文件的,删除APK文件名时同时也删除与其对应的odex文件。
虽然一般定制时只是对以上两个文件夹里的文件做相应的增减,但我们还是一起来了解system相应目录相应文件的用途吧。(rom版本不同里面的APK也会不一样)
\system\app
\system\app\AlarmClock.apk 闹钟
\system\app\Browser.apk 浏览器
\system\app\Bugreport.apk Bug报告
\system\app\Calculator.apk 计算器
\system\app\Calendar.apk 日历
\system\app\CalendarProvider.apk 日历提供
\system\app\Camera.apk 照相机
\system\app\com.amazon.mp3.apk 亚马逊音乐
\system\app\Contacts.apk 联系人
\system\app\DownloadProvider.apk 下载提供
\system\app\DrmProvider.apk DRM数字版权提供
\system\app\Email.apk 电子邮件客户端
\system\app\FieldTest.apk 测试程序
\system\app\GDataFeedsProvider.apk GoogleData提供
\system\app\Gmail.apk Gmail电子邮件
\system\app\GmailProvider.apk Gmail提供
\system\app\GoogleApps.apk 谷歌程序包
\system\app\GoogleSearch.apk 搜索工具
\system\app\gtalkservice.apk GTalk服务
\system\app\HTMLViewer.apk HTML查看器
\system\app\HtcTwitter.apk 集成Twitter客户端PEEP
\system\app\IM.apk 即使通讯组件包含MSN、yahoo通
\system\app\ImCredentialProvider.apk
\system\app\ImProvider.apk
\system\app\Launcher.apk 启动加载器
\system\app\HtcNaviPanel.apk 导航软件
\system\app\Maps.apk 电子地图
\system\app\MediaProvider.apk 多媒体播放提供
\system\app\Mms.apk 短信、彩信
\system\app\Music.apk 音乐播放器
\system\app\MyFaves.apk T-Mobile MyFaves程序
\system\app\NewsReader.apk 新闻阅读器
\system\app\PackageInstaller.apk apk安装程序
\system\app\Phone.apk 电话拨号器
\system\app\Settings.apk 系统设置
\system\app\SettingsProvider.apk 设置提供
\system\app\SetupWizard.apk 设置向导
\system\app\SoundRecorder.apk 录音工具
\system\app\Street.apk 街景地图
\system\app\Sync.apk 同步程序
\system\app\Talk.apk 语音程序
\system\app\TelephonyProvider.apk 电话提供
\system\app\Updater.apk 更新程序
\system\app\科学上网Services.apk 科学上网服务
\system\app\Vending.apk 制造商信息
\system\app\VoiceDialer.apk 语音拨号器
\system\app\VoiceSearch.apk 语音搜索
\system\app\YouTube.apk Youtube视频
\system\bin
这个目录下的文件都是系统的本地程序,从bin文件夹名称可以看出是binary二进制的程序,里面主要是Linux系统自带的组件,Android手机网就主要文件做下简单的分析介绍:
\system\bin\akmd
\system\bin\am
\system\bin\app_process 系统进程
\system\bin\dalvikvm Dalvik虚拟机宿主
\system\bin\dbus-daemon 系统BUS总线监控
\system\bin\debuggerd 调试器
\system\bin\debug_tool 调试工具
\system\bin\dexopt DEX选项
\system\bin\dhcpcd DHCP服务器
\system\bin\dumpstate 状态抓取器
\system\bin\dumpsys 系统抓取器
\system\bin\dvz
\system\bin\fillup
\system\bin\flash_image 闪存映像
\system\bin\hciattach
\system\bin\hcid HCID内核
\system\bin\hostapd
\system\bin\hostapd_cli
\system\bin\htclogkernel
\system\bin\input
\system\bin\installd
\system\bin\itr
\system\bin\linker
\system\bin\logcat Logcat日志打印
\system\bin\logwrapper
\system\bin\mediaserver
\system\bin\monkey
\system\bin\mountd 存储挂载器
\system\bin\netcfg 网络设置
\system\bin\ping Ping程序
\system\bin\playmp3 MP3播放器
\system\bin\pm 包管理器
\system\bin\qemud QEMU虚拟机
\system\bin\radiooptions 无线选项
\system\bin\rild RIL组件
\system\bin\sdptool
\system\bin\sdutil
\system\bin\service
\system\bin\servicemanager 服务管理器
\system\bin\sh
\system\bin\ssltest SSL测试
\system\bin\surfaceflinger 触摸感应驱动
\system\bin\svc 服务
\system\bin\system_server
\system\bin\telnetd Telnet组件
\system\bin\toolbox
\system\bin\wlan_loader
\system\bin\wpa_cli
\system\bin\wpa_supplicant
\system\etc
从文件夹名称来看保存的都是系统的配置文件,比如APN接入点设置等核心配置。
\system\etc\apns-conf.xml APN接入点配置文件
\system\etc\AudioFilter.csv 音频过滤器配置文件
\system\etc\AudioPara4.csv
\system\etc\bookmarks.xml 书签数据库
\system\etc\dbus.conf 总线监视配置文件
\system\etc\dhcpcd
\system\etc\event-log-tags
\system\etc\favorites.xml 收藏夹
\system\etc\firmware 固件信息
\system\etc\gps.conf GPS设置文件
\system\etc\hcid.conf内核HCID配置文件
\system\etc\hosts 网络DNS缓存
\system\etc\init.goldfish.sh
\system\etc\location 定位相关
\system\etc\mountd.conf 存储挂载配置文件
\system\etc\NOTICE.html 提示网页
\system\etc\permissions.xml 权限许可
\system\etc\pvplayer.conf
\system\etc\security
\system\etc\wifi WLAN相关组件
\system\etc\dhcpcd\dhcpcd-hooks
\system\etc\dhcpcd\dhcpcd-run-hooks
\system\etc\dhcpcd\dhcpcd.conf
\system\etc\dhcpcd\dhcpcd-hooks\01-test
\system\etc\dhcpcd\dhcpcd-hooks\20-dns.conf
\system\etc\dhcpcd\dhcpcd-hooks\95-configured
\system\etc\firmware\brf6300.bin
\system\etc\location\gps
\system\etc\location\gps\location 定位相关
\system\etc\location\gps\nmea GPS数据解析
\system\etc\location\gps\properties
\system\etc\security\cacerts.bks
\system\etc\security\otacerts.zip OTA下载验证
\system\etc\wifi\Fw1251r1c.bin
\system\etc\wifi\tiwlan.ini
\system\etc\wifi\wpa_supplicant.conf WPA验证组件
\system\fonts
字体文件夹,除了标准字体和粗体、斜体外可以看到文件体积最大的可能是中文字库,或一些unicode字库,从T- Mobile G1上可以清楚的看到显示简体中文正常,其中DroidSansFallback.ttf文件大小
\system\fonts\DroidSans-Bold.ttf
\system\fonts\DroidSans.ttf
\system\fonts\DroidSansFallback.ttf
\system\fonts\DroidSansMono.ttf
\system\fonts\DroidSerif-Bold.ttf
\system\fonts\DroidSerif-BoldItalic.ttf
\system\fonts\DroidSerif-Italic.ttf
\system\fonts\DroidSerif-Regular.ttf
\system\framework
framework主要是一些核心的文件,从后缀名为jar可以看出是是系统平台框架。
\system\framework\am.jar
\system\framework\am.odex
\system\framework\android.awt.jar AWT库
\system\framework\android.awt.odex
\system\framework\android.policy.jar
\system\framework\android.policy.odex
\system\framework\android.test.runner.jar
\system\framework\android.test.runner.odex
\system\framework\com.google.android.gtalkservice.jar GTalk服务
\system\framework\com.google.android.gtalkservice.odex
\system\framework\com.google.android.maps.jar 电子地图库
\system\framework\com.google.android.maps.odex
\system\framework\core.jar 核心库,启动桌面时首先加载这个
\system\framework\core.odex
\system\framework\ext.jar
\system\framework\ext.odex
\system\framework\framework-res.apk
\system\framework\framework-tests.jar
\system\framework\framework-tests.odex
\system\framework\framework.jar
\system\framework\framework.odex
\system\framework\input.jar 输入库
\system\framework\input.odex
\system\framework\itr.jar
\system\framework\itr.odex
\system\framework\monkey.jar
\system\framework\monkey.odex
\system\framework\pm.jar 包管理库
\system\framework\pm.odex
\system\framework\services.jar
\system\framework\services.odex
\system\framework\ssltest.jar
\system\framework\ssltest.odex
\system\framework\svc.jar 系统服务
\system\framework\svc.odex
\system\lib
lib目录中存放的主要是系统底层库,如平台运行时库。
\system\lib\libaes.so
\system\lib\libagl.so
\system\lib\libandroid_runtime.so Android运行时库
\system\lib\libandroid_servers.so 系统服务组件
\system\lib\libaudio.so 音频处理
\system\lib\libaudioeq.so EQ均衡器
\system\lib\libaudioflinger.so 音频过滤器
\system\lib\libbluetooth.so 蓝牙组件
\system\lib\libc.so
\system\lib\libcamera.so 超相机组件
\system\lib\libcameraservice.so
\system\lib\libcorecg.so
\system\lib\libcrypto.so 加密组件
\system\lib\libctest.so
\system\lib\libcutils.so
\system\lib\libdbus.so
\system\lib\libdl.so
\system\lib\libdrm1.so DRM解析库
\system\lib\libdrm1_jni.so
\system\lib\libdvm.so
\system\lib\libexif.so
\system\lib\libexpat.so
\system\lib\libFFTEm.so
\system\lib\libGLES_CM.so
\system\lib\libgps.so
\system\lib\libhardware.so
\system\lib\libhgl.so
\system\lib\libhtc_ril.so
\system\lib\libicudata.so
\system\lib\libicui18n.so
\system\lib\libicuuc.so
\system\lib\liblog.so
\system\lib\libm.so
\system\lib\libmedia.so
\system\lib\libmediaplayerservice.so
\system\lib\libmedia_jni.so
\system\lib\libnativehelper.so
\system\lib\libnetutils.so
\system\lib\libOmxCore.so
\system\lib\libOmxH264Dec.so
\system\lib\libpixelflinger.so
\system\lib\libpvasf.so
\system\lib\libpvasfreg.so
\system\lib\libpvauthor.so
\system\lib\libpvcommon.so
\system\lib\libpvdownload.so
\system\lib\libpvdownloadreg.so
\system\lib\libpvmp4.so
\system\lib\libpvmp4reg.so
\system\lib\libpvnet_support.so
\system\lib\libpvplayer.so
\system\lib\libpvrtsp.so
\system\lib\libpvrtspreg.so
\system\lib\libqcamera.so
\system\lib\libreference-ril.so
\system\lib\libril.so
\system\lib\librpc.so
\system\lib\libsgl.so
\system\lib\libsonivox.so
\system\lib\libsoundpool.so
\system\lib\libsqlite.so
\system\lib\libssl.so
\system\lib\libstdc++.so
\system\lib\libsurfaceflinger.so
\system\lib\libsystem_server.so
\system\lib\libthread_db.so
\system\lib\libUAPI_jni.so
\system\lib\libui.so
\system\lib\libutils.so
\system\lib\libvorbisidec.so
\system\lib\libwbxml.so
\system\lib\libwbxml_jni.so
\system\lib\libwebcore.so
\system\lib\libwpa_client.so
\system\lib\libxml2wbxml.so
\system\lib\libz.so
\system\lib\modules
\system\lib\modules\wlan.ko
\system\media
铃声音乐文件夹,除了常规的铃声外还有一些系统提示事件音
\system\media\audio
\system\media\audio\alarms 闹铃音
\system\media\audio\notifications 提示音
\system\media\audio\ringtones 铃声
\system\media\audio\ui 界面操作事件音
\system\media\audio\alarms\Alarm_Beep_01.ogg
\system\media\audio\alarms\Alarm_Beep_02.ogg
\system\media\audio\alarms\Alarm_Beep_03.ogg
\system\media\audio\alarms\Alarm_Buzzer.ogg
\system\media\audio\alarms\Alarm_Classic.ogg
\system\media\audio\alarms\Alarm_Rooster_02.ogg
\system\media\audio\notifications\Beat_Box_Android.ogg
\system\media\audio\notifications\CaffeineSnake.ogg
\system\media\audio\notifications\DearDeer.ogg
\system\media\audio\notifications\DontPanic.ogg
\system\media\audio\notifications\F1_MissedCall.ogg
\system\media\audio\notifications\F1_New_MMS.ogg
\system\media\audio\notifications\F1_New_SMS.ogg
\system\media\audio\notifications\Heaven.ogg
\system\media\audio\notifications\Highwire.ogg
\system\media\audio\notifications\KzurbSonar.ogg
\system\media\audio\notifications\OnTheHunt.ogg
\system\media\audio\notifications\TaDa.ogg
\system\media\audio\notifications\Tinkerbell.ogg
\system\media\audio\notifications\Voila.ogg
\system\media\audio\ringtones\BeatPlucker.ogg
\system\media\audio\ringtones\BentleyDubs.ogg
\system\media\audio\ringtones\BirdLoop.ogg
\system\media\audio\ringtones\CaribbeanIce.ogg
\system\media\audio\ringtones\CrazyDream.ogg
\system\media\audio\ringtones\CurveBall.ogg
\system\media\audio\ringtones\DreamTheme.ogg
\system\media\audio\ringtones\EtherShake.ogg
\system\media\audio\ringtones\FriendlyGhost.ogg
\system\media\audio\ringtones\GameOverGuitar.ogg
\system\media\audio\ringtones\Growl.ogg
\system\media\audio\ringtones\InsertCoin.ogg
\system\media\audio\ringtones\LoopyLounge.ogg
\system\media\audio\ringtones\LoveFlute.ogg
\system\media\audio\ringtones\MidEvilJaunt.ogg
\system\media\audio\ringtones\MildlyAlarming.ogg
\system\media\audio\ringtones\NewPlayer.ogg
\system\media\audio\ringtones\Noises1.ogg
\system\media\audio\ringtones\Noises2.ogg
\system\media\audio\ringtones\Noises3.ogg
\system\media\audio\ringtones\OrganDub.ogg
\system\media\audio\ringtones\Ring_Classic_02.ogg
\system\media\audio\ringtones\Ring_Digital_02.ogg
\system\media\audio\ringtones\Ring_Synth_02.ogg
\system\media\audio\ringtones\Ring_Synth_04.ogg
\system\media\audio\ringtones\RomancingTheTone.ogg
\system\media\audio\ringtones\SitarVsSitar.ogg
\system\media\audio\ringtones\SpringyJalopy.ogg
\system\media\audio\ringtones\T-Jingle.ogg
\system\media\audio\ringtones\Terminated.ogg
\system\media\audio\ringtones\TwirlAway.ogg
\system\media\audio\ringtones\VeryAlarmed.ogg
\system\media\audio\ringtones\World.ogg
\system\media\audio\ui\Effect_Tick.ogg
\system\sounds
默认的音乐测试文件,仅有一个test.mid文件,用于播放测试的文件。
\system\sounds\test.mid
\system\usr
用户文件夹,包含共享、键盘布局、时间区域文件等。
\system\usr\keychars
\system\usr\keylayout
\system\usr\share
\system\usr\srec
\system\usr\keychars\qwerty.kcm.bin
\system\usr\keychars\qwerty2.kcm.bin
\system\usr\keychars\trout-keypad-qwertz.kcm.bin
\system\usr\keychars\trout-keypad-v2.kcm.bin
\system\usr\keychars\trout-keypad-v3.kcm.bin
\system\usr\keychars\trout-keypad.kcm.bin
\system\usr\keylayout\h2w_headset.kl
\system\usr\keylayout\qwerty.kl
\system\usr\keylayout\trout-keypad-qwertz.kl
\system\usr\keylayout\trout-keypad-v2.kl
\system\usr\keylayout\trout-keypad-v3.kl
\system\usr\keylayout\trout-keypad.kl
\system\usr\share\bsk
\system\usr\share\zoneinfo
\system\usr\share\bsk\V_FD_speed_101.bsk
\system\usr\share\bsk\V_FD_std_101.bsk
\system\usr\share\zoneinfo\zoneinfo.dat
\system\usr\share\zoneinfo\zoneinfo.idx
\system\usr\srec\config
\system\usr\srec\config\en.us
\system\usr\srec\config\en.us\baseline.par
\system\usr\srec\config\en.us\baseline11k.par
\system\usr\srec\config\en.us\baseline8k.par
\system\usr\srec\config\en.us\dictionary
\system\usr\srec\config\en.us\g2p
\system\usr\srec\config\en.us\grammars
\system\usr\srec\config\en.us\models
\system\usr\srec\config\en.us\dictionary\basic.ok
\system\usr\srec\config\en.us\dictionary\cmu6plus.ok.zip
\system\usr\srec\config\en.us\dictionary\enroll.ok
\system\usr\srec\config\en.us\g2p\en-US-ttp.data
\system\usr\srec\config\en.us\grammars\VoiceDialer.g2g
\system\usr\srec\config\en.us\models\generic.swiarb
\system\usr\srec\config\en.us\models\generic11.lda
\system\usr\srec\config\en.us\models\generic11_f.swimdl
\system\usr\srec\config\en.us\models\generic11_m.swimdl
\system\usr\srec\config\en.us\models\generic8.lda
\system\usr\srec\config\en.us\models\generic8_f.swimdl
\system\usr\srec\config\en.us\models\generic8_m.swimdl
OK,了解Android系统文件夹结构和相应文件的作用后,我们进行下一步真正定制工作。
二、定制简单流程:
1、下载相应的ROM
2、下载签名工具,并且解压。,下载请到这:apktool打包签名.rar
3、把ROM内的所有文件用WinZip或是WinRAR解压到某一文件夹,为教程容易明白,我将这文件夹在这里起名为“NewsROM”,你自已喜欢怎样起名都无所谓。
4、进入NewsROM文件夹,再进入dataapp目录,看这里是否有你所需的程序,不需要的请删除。你还可以添加你需要的默认安装软件。如:搜狗输入法,只需要把SogouIme.apk文件直接拖放到压缩包dataapp目录内即可。
5、进入NewsROM文件夹,再进入systemapp删除你不想要的组件、或是添加你需要的组件。由于有一些组件与其它组件是有依赖的,所以删除时请注意。但也不要怕,如果你删除的组件不对,刷机时最多是无法进入系统,你用完整ROM重新刷一次既可。一般不会变成砖的。
6、删除、添加软件完毕,然后把 ROM 文件夹(NewsROM)拖动到APKMake/APKMake.bat 即可(重新打包、自动签名)。在APKMake目录里打包签名完成后自动会生成NewsROM.zip(刚才文件夹起名不同,这里生成文件名也不同),这个就是我们已精简的ROM了。
三、刷ROM
请如果 Recovery 已经准备好。请按严格安装以下步骤操作刷入 ROM:
1. 把 ROM 文件复制到 SD 卡。
2. 关机,然后按住 Home(小房子)启动手机,进入 Recovery 模式。
3. WIPE。
4. 在 Recovery 中选择正确的 ROM 文件(ZIP)刷入。
4. 重新启动即可。
四、定制注意事项
1、细心、细心、细心
2、为安全起见,建议只对data/app和system/app这两个文件夹内的文件做删除、添加。
3、不知或是不太清楚要删除的文件是干啥的,那请保留不要删除。
4、本文中的Android系统文件夹结构可能比较旧,如果碰到不知该文件是干什么的,建议搜索一下找答案。
4、按照本教程来定制ROM,如果在定制过程自已失误删除相应的软件,那造成的后果最多也是无法进入系统,重新刷一个完整的ROM一般解决问题。
还是那句话:刷机有风险,出问题自负特效文件名称.xml
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
再来一个重磅教程 来源
http://bbs.gfan.com/forum.php?mod=viewthread&tid=3781954&extra=&page=2 该作者实在些的太强大,比出书的还写得好,佩服!通俗易懂!
教程大纲
1. 系统框架
2. 移植的主要工作
3. Linux内核与驱动程序介绍
4. 编译环境的搭建
5. 中间件关键技术详解
6. WIFI模块分析
7. 启动流程分析
8. 文件系统介绍
9. 编译语法简析
10. 系统移植
11. 调试技巧
话说这帖子是我在网上找的资料
有不懂的
找度娘
1: 系统框架介绍
1.1 整体框架介绍
1.2 linux 内核及驱动
1.3 本地框架,虚拟机及Android运行库
1.4 应用程序框架
1.5 应用程序
1.2 linux 内核及驱动
Android内核基于标准的Linux 2.6内核
Android 的核心系统服务依赖于内核,如电源管理,文件系统,内存管理,进程管理,网络协议栈和驱动模型等
Linux 内核也同时作为硬件和软件之间的抽象层
1.3 本地框架,虚拟机及Android运行库
Bionic:一个从BSD 继承来的标准C 系统函数库( libc ),专门为基embedded linux 的设备定制
WebCore :一个最新的web浏览器引擎用,支持Android浏览器
Surface flinger:将2D或3D的内容显示到屏幕上
OpenCore:作为基础多媒体框架, 该库支持多种常用的音频、视频格式回放和录制(新的版本使用stagefright)
Skia:为核心2D图形引擎
3D libraries : 基于OpenGL ES 1.0 APIs实现;该库可以使用硬件3D加速(如果可用)或者使用高度优化的3D软加速
SQLite :一个对于所有应用程序可用,功能强劲的轻型关系型数据库引
虚拟机
Dalvik虚拟机器可以有多个实例,每个Android应用程序都用一个自已的Dalvik虚拟机器来执行,让系统在执行程序时可达到优化。
Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK
中的"dx" 工具转化成.dex格式由虚拟机执行。
Android运行库
也称Java运行时,Android运行时,由Java核心库和Dalvik虚拟机
Java核心库提供了JAVA编程语言核心库的大多数功能Java程序都必须加载到Android运行库运行
1.4 应用程序框架
视图管理器,用来建应用程序,包括列表,网格,文本框,按钮,甚至包括一个可嵌入的web浏览器
内容管理器,使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享它们自己的数据
资源管理器,提供非代码资源的管理,如本地字符串,图形,和分层文件( layout files )
通知管理器,使应用程序可以在状态栏中显示客户通知信息
活动类管理器,用来管理应用程序生命周期并提供常用的导航回退功能
1.5 应用程序
Android 的四大组件
Activity,一个可视化的用户界面,占据当前的窗口,响应所有窗口事件,具备有控件,菜单等界面元素
Service,运行在后台,等待上层的连接,然后接受上层指令,完成相关事务的模块
Broadcast Receiver,可以响应一种或若干种Intent作为触发事件
content provider,访问其它应用程序的一些私有数据,这是Android提供的一种标享数据的机制`
在Android每个版本发布源码时,都会自带一些google开发的应用程序,包括电话,邮件客户端,日历,闹钟,浏览器,系统设定,图片浏览器,音乐播放器等
ApiDemo,Android源码中自带了这个应用,是Android应用开发入门很好的实例
Dev tool,测试机器很好的实例程序,也是开发人员开发测试程序很好的例子
2 移植的主要工作
2.1 主要工作介绍
2.2 驱动移植
2.3 硬件抽象层移植
2.4 Android 目标文件系统移植
2.5 系统优化
2 移植的主要工作
目的:使特定的硬件运行Android系统
方法:首先要熟悉硬件抽象层的接口,其次要集成和复用已有的驱动程序
主要的工作:驱动,硬件抽象层的移植。为了更好地理解和调试系统,也应该适当地了解上层对硬件抽象层的调用情况。
2.2 驱动移植
在具有了特定的硬件系统之后,需要实现各个设
备的驱动程序,这些驱动程序通常是Linux的标准
驱动程序,在Android平台和其他Linux平台基本上
是相同的。
2.3 硬件抽象层移植
Android 系统移植,主要的实现方面是Android系统中的硬件抽象层(Hardware Abstract Layer)
硬件抽象层对下调用Linux中的驱动程序,对上提供接口,以供Android系统的其他部分(通常为Android本地框架层)调用。
2.4 Android 目标文件系统移植
移植文件系统存储介质:NAND,NOR,INAND等驱动
移植文件系统策略
移植文件系统格式
2.5 系统优化
缩减系统启动时间
裁减目标设备中不需要模块
修正bug
移植文件系统的更新(烧写)方式
[
本帖最后由 Wince.Android 于 2013-6-4 10:35 编辑 ]
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
3 Linux内核与驱动程序介绍
3.1 Linux 内核与驱动
3.2 Android 专用驱动
3.1 Linux 内核与驱动
Android 使用的Linux驱动
3.1.1 输入设备驱动
3. 1.2 Framebuffer,显示设备驱动
3. 1.3 V4L2,摄像头驱动框架
3. 1.4 音频驱动
3. 1.5 MTD驱动
3.1.6 MMC 驱动
3. 1.7 WIFI驱动
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
来源
http://bbs.gfan.com/forum.php?mod=viewthread&tid=3781954&extra=&page=2 该作者实在些的太强大,比出书的还写得好,佩服!通俗易懂!
4 编译环境的搭建
4.1 ubuntu安装
4.2 安装依赖包
4.3 Java环境搭建
4.4 Android 源代码目录结构分析
4.5 编译Android源代码
4.6 编译结果描述
4.1 ubuntu安装
Ubuntu 光盘(推荐)
制作ubuntu USB启动盘(推荐)
WUBI (高级)
ISO+grub(高级)
4.2 安装依赖包
$sudo apt-get install build-essential
$sudo apt-get install libncurses5-dev
$sudo apt-get install x11proto-core-dev
$sudo apt-get install zlib1g-dev
$sudo apt-get install libx11-dev
$sudo apt-get install gperf
$sudo apt-get install bison
$sudo apt-get install flex
4.3 Java环境搭建
安装JDK
从网上下载jdk(JDK_1_5.BIN,android2.2及以前版本要使用JDK1.5版本,2.3以后要用JDK1.6版本),执行命令
$sudo mkdir /usr/java
$sudo mv JDK_1_5.BIN /usr/java
$sudo chmod +x JDK_1_5.BIN
$sudo ./ JDK_1_5.BIN
出来license文件,按q,然后根据提示输入yes即可开始安装
配置java 环境
方法一:$sudo gedit ~/.bashrc ,在最后面加上
export JAVA_HOME=/usr/java/你的jdk目录
export PATH=$ JAVA_HOME /bin:path
export ANDROID_JAVA_HOME=$
JAVA_HOME
方法二:将前面的三个export语句做成一个脚本,在编译之前,执行这脚本
4.4 Android 源代码目录结构分析
Google提供的Android包含了原始Android的目标机代码,主机编译工具、仿真环
境,代码包经过解压缩后,第一级别的目录和文件如下所示:
|-- bionic (Bionic含义为仿生,这里面是一些基础的库的源代码)
|-- bootable (引导加载器uboot/grub, recovery)
|-- build (编译和配置所需要的脚本和工具)
|-- cts (Android API兼容性测试程序)
|-- dalvik (JAVA虚拟机)
|-- development (程序开发所需要的模板和工具)
|-- external (第三方提供使用的一些库)
|-- frameworks (应用程序与Android的框架层)
|-- hardware (硬件抽象层)
|-- Makefile (全局的Makefile)
|-- out (编译结果)
|-- packages (Android自带的各种应用程序)
|-- prebuilt (Android在各种平台下编译的预置工具)
|-- sdk (编译SDK相关)
|-- system (Android的底层的一些库)
|-- vendor (与目标相关的选项,库等)
4.5 编译Android源代码
进入android源码目录,执行命令:
$. ./build/envsetup.sh (注意:前面有一个”.”和一个空格)
$choosecombo (选择编译选项)
Build for the simulator or the device? (设备或者模拟器)
Build type choices are: (调试或者发布)
Which product would you like? [generic](板子的名称)
Which would you like? (用途eng/user/user debug)
编译:
$make –j4
4.6 编译结果描述
|-- host 主机
| |-- common 平台无关
| |-- linux-x86
| |-- bin 可执行程序
| |-- cts_dalviktests
| |-- framework
| |-- lib
| `-- obj
|-- target 板端
| |-- common
| | |-- cts 测试
| | |-- docs SDK离线文档相关
| | |-- obj 中间文件
| | `-- R
| `-- product
| |-- generic 产品1
| `-- fs100 产品2
|-- data 产生userdata.img
|-- obj 中间文件
|-- ramdisk.img 根文件系统镜像
|-- root 根文件系统
|-- symbols
|-- system 系统目录
|-- system.img
`-- userdata.img
[
本帖最后由 Wince.Android 于 2013-6-4 10:34 编辑 ]
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
5 中间件关键技术详解
5.1 中间件技术介绍
5.2 HAL移植
5.3 JNI调用
5.4 AIDL服务
5.5 中间件实例--LED模块
5.2 HAL移植
5.2.1 Android HAL知识简介
5.2.2 两种HAL 结构的比较
5.2.3 HAL模块开发步骤
5.2.4 如何调用HAL模块
5.2.1 Android HAL知识简介
知识简介
HAL: Hardware Abstract Layer,硬件抽象层,
出现的原因:为了保护一些硬件提供商的知识产权而提出的,是为了避开linux的GPL束缚。而Android是基于Aparch的license,因此硬件厂商可以只提供二进制代码。
作用
向下与linux kernel设备驱程序沟通
向上提供统一的接口,即屏蔽硬件差异性。相当于一个适配器,对于同一类的不同设备,提供给上层使用的接口是一致的
5.2.2 两种HAL 结构的比较
5.2.3 HAL模块开发步骤
设计模块数据结构
每一种硬件模块数据结构的第一个成员必须是hw_module_t类型
模块包含两种设备数据结构,一种是控制类型的,一种是数据类型的
设计设备数据结构
每一种设备数据结构的第一个成员必须是hw_device_t类型
另外还包含了该设备的方法与属性通过向
声明并填充HAL_MODULE_INFO_SYM模块数据结构
成员hw_module_t中的id为模块名称,成员method为模块方法
实现模块或者设备的方法
设备数据结构体中的方法
模块数据结构体中hw_module_t的method
注意:编译模块后生成的库名有命名规范,必须是.<产品名>或者是.,否则HAL系统找不到对应的模块
5.2.4 如何调用HAL模块
通过hw_get_module(“MODULE ID”)获得已经注册HAL系统里的HAL模块指针
通过该HAL模块的指针调用模块的回调函函数
5.3 JNI调用
5.3.1 Android JNI知识简介
5.3.2 载入.SO中的JNI函数的方法
5.3.3 如何使用JNI函数
5.3.1 Android JNI知识简介
JNI知识简介
Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。
JNI 是本地编程接口,在Java 虚拟机(VM) 内部运行的Java代码能够与用其它编程语言(如C、C++ 和汇编语言)编写的应用程序和库进行交互操作
JNI 在android 的作用
弥补java不能直接调用驱动的方法的缺点
实现java调用C/C++或者反向调用,在android起着承上启下的作用
5.3.2 载入.SO中的JNI函数的方法
JAVA应用程序必须靠Dalvik虚拟机来执行,在执行过程中,在Java类需要调用JNI函数前,VM必须先载入JNI函数所在的库(*.so)
载入库的两种方法(时机)
需要调用JNI函数时,在java中通过System.loadLibrary(库名)调用相应库函数JNI_OnLoad()
在android系统启动过程中, 执行JNI_OnLoad()函数注册
5.3.3 如何使用JNI函数
C/C++
JNI函数的声明(JNINativeMethod)
在JNI_OnLoad() 函数中,通过jniRegisterNativeMethods(.., “java 类名”, …)注册到java runtime中
Java中声明JNI函数为native 函数
private/public/protected native 返回值函数名()
使用方法与一般函数一致
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
5.4 AIDL服务
5.4.1 AIDL知识简介
5.4.2 AIDL与binder
5.4.3 AIDL接口的实现步骤
5.4.1 AIDL知识简介
AIDL: Android Interface Definition Language, Android 接口定义语言。
在Android中,一个进程不能直接访问另一个进程的内存。因此传递对象时,只能将对象拆分成操作系统能理解的简单形式,以达到跨界对象访问的目的。
采用AIDL服务的方式,通过预先定义的接口达到两个进程内部通信进程的目的。如果需要在一个Activity中,访问另一个Service中的某个对象,需要先将对象转化成AIDL可识别的参数,然后使用AIDL来传递这些参数,在消息的接收端使用这些参数组装成自己需要的对象。
AIDL在Android的作用
连接两个java进程的桥梁,使本地程序可以与远程服务通信。
使C/C++的JNI库可以被更多的java程序调用,即代码利用性、商业效益更加高。
5.4.2 AIDL与binder
5.4.3 AIDL接口的实现步骤
定义IService.aidl文件
设计并实现一个service继承IService.Stub
通过ServiceManager.addService(“服务名”)启动service
定义Manager, 调用ServiceManager.getService(“服务名”)获得service,并通过IService.Stub.asInterface(“服务名”)获得service的proxy类,即Manager
通过proxy调用service函数
※Service必须先启动,才可以为他人服务
5.5 中间件实例--LED模块
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
7 启动流程分析
7.1 系统引导bootloader
7.2 Linux 内核
7.3 文件系统及init进程
7.4 重要的后台运行程序zygote
7.5 系统服务SystemService
7.6 桌面Launcher
7.7 屏幕解锁
7.1 系统引导bootloader
源码:bootable/bootoader/
上电后,CPU IROM的程序会将bootloader装载到内存执行
启动模式
Camera + Power 启动到Fastboot,工厂模式,SD卡烧写模式(USB, 网络)
Home + Power启动recovery模式
按Power,正常开机模式
7.2 Linux 内核
源码:kernel/
Bootloader在启动结束时,将CPU执行权交与kernel
Kernel 自解压,初始化内核,所有需要启动的驱动后,启动文件系统的init进程
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
1、android文件系统的结构
android源码编译后得到system.img,ramdisk.img,userdata.img映像文件。其中, ramdisk.img是emulator的文件系统,system.img包括了主要的包、库等文件,userdata.img包括了一些用户数 据,emulator加载这3个映像文件后,会把 system和 userdata分别加载到 ramdisk文件系统中的system和 userdata目录下。因此,我们可以把ramdisk.img里的所有文件复制出来,system.img和userdata.img分别解压到 ramdisk文件系统中的system和 userdata目录下。
2、分离android文件系统出来
system.img,ramdisk.img,userdata.img映像文件是采用cpio打包、gzip压缩的,可以通过file命令验 证:
file ramdisk.img,输出:
ramdisk.img: gzip compressed data, from Unix, last modified: Wed Mar 18 17:16:10 2009
Android源码编译后除了生成system.img,userdata.img之外还生成system和 userdata文件夹,因此不需要解压它们。Android源码编译后还生成root文件夹,其实root下的文件与 ramdisk.img 里的文件是一样的,不过这里还是介绍怎样把 ramdisk.img解压出来:
将ramdisk.img复制一份到任何其他目录下,将其名称改为ramdisk.img.gz,并使用命令
gunzip ramdisk.img.gz
然后新建一个文件夹,叫ramdisk吧,进入,输入命令
cpio -i -F ../ramdisk.img
这下,你就能看见并操作ramdisk里面的内容了。
然后把Android源码编译后生成的system和 userdata里的文件复制到 ramdisk/system和 ramdisk/userdata下。这样就得到一个文件系统了。
3、使用网络文件系统方式挂载android文件系统
因此,我们需要建立/nfsroot目录,再建立/nfsroot/androidfs目录,把刚才的android文件系统改名为 androidfs,并链接到/nfsroot/androidfs
4、android内核引导文件系统
android内核挂载/nfsroot/androidfs之后,根据init.rc,init.goldfish.rc来初始化并装载系统 库、程序等直到开机完成。init.rc脚本包括了文件系统初始化、装载的许多过程。init.rc的工作主要是:
1)设置一些环境变量
2)创建system、sdcard、data、cache等目录
3)把一些文件系统mount到一些目录去,如,mount tmpfs tmpfs /sqlite_stmt_journals
4)设置一些文件的用户群组、权限
5)设置一些线程参数
6)设置TCP缓存大小
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
翻译官方CyanogenMOD移植教程
前言:什么是CyanogenMOD借鉴百度百科的介绍:http://baike.baidu.com/view/5079569.htm
CyanogenMod(发音:sigh-AN-oh-jen-mod。简称cm):
Cyanogen团队是目前全球最大的Android第三方编译团队,其发布的Android 2.1内核CM5系列ROM被广泛使用,促进了用户从Android 1.6到Android 2.1版本的第三方升级。
这个小组曾经先于google公司为很多手机率先定制出稳定的1.6ROM。
CyanogenMod目前系列有
CM4(android1.6)、
CM5(android2.1)、
CM6(android2.2)、
CM7(android2.3)、
CM8(android3.*【用于平板电脑,所以不被关注】)、
CM9(android4.*)
CyanogenMod自我简介
What is CyanogenMod?CyanogenMod is an aftermarket firmware for a number of cell phones based on the open-source Android operating system. It offers features not found in the official Android based firmwares of vendors of these cell phones.
系统
CyanogenMod是一个基于开源Android系统,供某些手机使用的二级市场固件。它提供一些在官方Android系统或手机厂商没有提供的功能,例如:支持Free Lossless Audio Codec- FLAC (无损音频压缩编码)音频格式的音乐,多点触控, 从SD外置存储器运行程序,压缩缓存,大量APN的名单,重新启动功能,Wi-Fi无线网络支持,蓝牙,USB网络分享等。CyanogenMod也是第一个使用BFS作任务管理器的操作系统。CyanogenMod声称提供比官方固件版本更高性能和更可靠。
2008年9月HTC Dream电话发布后, 一种由Android社区发现其中一个可以在Android的Linux的子系统得到特权控制 "rooting"(也称为 "root access")的方法. 这个发现, 结合了Android开源的性质, 让手机的固件可以随意进行修改和重新安装到手机。某些手机并不需要进行修改, 如Android开发手机和Nexus One, 这些用作开发用途的手机上。
现时,CyanogenMod固件是基于Android2.3,也有大量由CyanogenMod的代码被加入了。CyanogenMod的自定部分本来是由Cyanogen (Steve Kondik)编写,不过加入了由xda-developers社区编写的代码(如已强化的主画面, 已强化的调用程序和已强化的网页浏览器)和其他的程序(如busybox)。
一个叫CyanogenMod Updater的程序提醒CyanogenMod用户有新版本的CyanogenMod及安装到他们的电话。用户可以在Android Market下载该程序。
特点
高度优化的内核,带有很多额外模块改进的RAM,
使用智能启动和优化安装选项
包含E2FSProgs可检查并转换Ext文件系统
自动安装Apps2SD
多个个分屏幕
自动适用方向
关机和重启依然具有干净的文件系统
不需要危险的SPL操作
包含大量APN列表
CPU工作频率
设置程序的大量改进
包括额外的分区
由cytown改进电话应用
还有很多
第一章:环境的搭建1.系统选择和安装
我使用的是 ubuntu LTS 10.04 X64
建议使用X64版本,我使用的就是该版本
新手朋友推荐Deepin Linux 基于ubuntu定制的,适合新手使用
http://www.linuxdeepin.com/download
系统安装教程,以下方法通用于UBUNTU官方版本
U盘安装:http://wiki.linuxdeepin.com/index.php/Unetbootin
光盘安装:http://wiki.linuxdeepin.com/index.php/光盘安装
搭建android编译环境:
英文好的请猛击这里:WIKI:http://wiki.cyanogenmod.com/index.php?title=Building_from_source
1.安装JDK
因为ANDROID大部分东西是java写的,所以首先我们需要安装JDK
打开终端按照如下命令输入或者直接复制粘贴:
编译android 2.3 或者更新的版本请使用 jdk 6
$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner" $ sudo apt-get update $ sudo apt-get install sun-java6-jdk 如果你需要编译的是2.2以下的版本请使用JDK 5,因为现在大家都是使用 Gingerbread 以上的系统,这里就不介绍jdk5如何安装的了,如果有需要请 度娘 或者 google
2.安装各种依赖包
64位环境:依然是终端中输入
$ sudo apt-get install git-core gnupg flex bison gperf build-essential \ zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \ x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \ libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \ libxml2-utils xsltproc 如果这些依赖包依然不能解决你的问题,请参考如下:http://wiki.cyanogenmod.com/wiki/HTC_Hero_(CDMA):_Compile_CyanogenMod_(Linux) http://source.android.com/source/initializing.html 3.下载代码 打开终端:我在我的个人目录下面使用的是android 代替我的工程,用cm7代替 CM7的源码 用CM9代替 CM9的源码如果你要更新下载CM7的源码请输入:mkdir -p ~/binmkdir -p ~/android/cm7 个人目录下的 bin目录是为了保存repo 等更新脚本的 依然再终端输入: curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repochmod a+x ~/bin/repo可以把 ~/bin/repo 加入到环境变量里面
终端输入 sudo gedit /etc/environment
在PATH=“” 加入 PATH="/home/ivanhuang/bin:"
ivanhuang为我个人目录的名称,也就是我的计算机登录名
更改结束之后 终端输入 source /etc/environment
就能直接在终端中使用repo 命令了。
然后下一步 我们开始同步代码:
依然是打开终端输入
cd android/cm7
repo init -u git://github.com/CyanogenMod/android.git -b gingerbreadrepo sync -j16这个是更新CM7的源码 Gingerbread分支的
如果你要更新CM9的源码
请输入
mkdir -p android/cm9
repo init -u git://github.com/CyanogenMod/android.git -b ics
repo sync -j16 今天就到这里,其他按照机器适配等编译命令,请参考 cyanogenmod的wiki 上面已经列出
第一章:环境的搭建 补充Ubuntu 中安装配置JDK首先从SUN网站下载JDK
然后在shell中执行:
代码:
sudo chmod +x jdk-6u17-linux-i586.bin
修 改bin文件权限,使其可执行。
然后执行
代码:
jdk-6u17-linux-i586.bin
将 会出现字幕,持续按回车键,直到屏幕出现需要输入yes/no,此时输入yes/y 回车,将会把JDK解压到文件夹,得到jdk1.6.0_17.此时JDK安装完毕。下面进行配置。
执行
代码:
sudo gedit /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还需要执行如下工作
执行
代码:
sudo update-alternatives --install /usr/bin/java java /home/cy/jdk1.6.0_17/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /home/cy/jdk1.6.0_17/bin/javac 300
通过 这一步将我们安装的JDK加入java选单
然后执行。
代码:
sudo update-alternatives --config java
通 过这一步设置系统默认的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 (各种壁纸程序)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Android Framework功能介绍
android.app :提供高层的程序模型和基本的运行环境。
android.content :包含对各种设备上的数据进行访问和发布。
android.database :通过内容提供者浏览和操作数据库。
android.graphics :底层图形库,包含画布、点、矩形等,可以将其直接绘制到屏幕上。
android.location :定位和相关服务的类。
android.media :提供一些类管理多种音频、视频的媒体接口。
android.net :提供帮助网络访问的类,超过通常的 java.net.* 接口。
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
本章介绍并且讲解如何编译一个支持你设备的recovery。
前面已经介绍过CyanogenMod是什么东西,以及环境搭建,android源码的大概框架。地址:http://blog.sina.com.cn/u/1697247850 ,所以这里就不再介绍。
首先你要确定你的设备,是否支持刷第三方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 手持设备机器CPU GPU 型号参数配置
device_roamer.mk build.prop信息添加,私有库 xml文件 init文件拷贝 按机器设备device来写 roamer是N760的设备型号
kernel 官方提取,boot.img提取提取可以使用国外高手制作的厨房软件
recovery.fstab 手机分区表
system.prop 可有可无
从官方rom提取,比如 n760 boot.img 里面提取的 init.roamer.rc 文件 这个也是需要这些文件的.
首先我们写 AndroidBoard.mk 文件
# 这一句的意思的 根目录就是 roamer 目录
AndroidProducts.mk 看文件名
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/device_roamer.mk
BoardConfig.mk 设备的配置文件USE_CAMERA_STUB := true
# inherit from the proprietary version
-include vendor/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: size erasesize name
# mtd0: 00600000 00020000 "recovery"
# mtd1: 00400000 00020000 "boot"
# mtd2: 00180000 00020000 "splash"
# mtd3: 00080000 00020000 "misc"
# mtd4: 03980000 00020000 "cache"
# mtd5: 0dc00000 00020000 "system"
# mtd6: 0a280000 00020000 "userdata"
# mtd7: 00100000 00020000 "oem"
# mtd8: 00180000 00020000 "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的时候需要删除重写的
#语言配置文件
$(call inherit-product, $(SRC_TARGET_DIR)/product/languages_full.mk)
# The gps config appropriate for this device gps配置文件
$(call inherit-product, device/common/gps/gps_as_supl.mk)
# vendor 私有库配置文件
$(call inherit-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
$(call inherit-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 选择你的设备
然后输入 make recoveryimage 就可以编译了
编译结束之后,到out/target/product/roamer目录下面可以发现 recovery.img 这个文件
使用fastboot 工具到fastboot 模式下面刷写,刷写命令为 fastboot flash recovery recovery.img
教程到此结束,有关如何进入fastboot模式 recovery模式,还有fastboot工具使用,请google 或者 baidu
谢谢
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
在CMWiKi上面读到了这篇文章,虽然会用Linux,但是毕竟手太生,就想找找能不能用Windows。结果看到了这篇,感谢楼主汉化,英语能看懂但毕竟是累哈哈