10137|2

854

帖子

0

TA的资源

五彩晶圆(中级)

楼主
 

【转载】如何把CyanogenMod 移植到到自己的android设备上 [复制链接]

前言

            今年已经到了四月,不少工作任务与Android相关,于是准备开始开题学习Android。Android已经火热了几年,现在开始看,网上的文章汗牛充栋,想必是乏新可陈。我错过Android总是有缘因的,3年前开始,从moblin、Maemo、到MeeGo,误入Linux终端的领域,还没有来得及感叹一下自己的“新事业”,MeeGo于Nokia犹如被斩下的断臂,和被放弃保帅的车马,只留下特立独行的绝版神机诺基亚N9,在风中做“不跟随(N9的广告语)”的姿态。作为世间的饮食男女,MeeGo可以“不跟随”,我却不能不跟随,当年从事MeeGo的人大多转到了Android平台,我也赶紧爬上Android的大船,并祈祷这艘大船从此顺风顺水一路平安。然一份工作,若无足够钱物驱使,必要做得有趣(俗人本无所求,无非名利),对本人来说,只好看看怎么把事情做成有趣一些开心一些。


工欲善其事,必先利其器

1、基础环境

使用的环境:ubuntu 11.04环境,测试的Android机器 华为:C8500。

官方参考文档:http://source.android.com/source/initializing.html

官方文档列出开发需要下列的软件包以及下载来源:

Python 2.5 -- 2.7,  python.org.
GNU Make 3.81 -- 3.82,  gnu.org
JDK 6 if you wish to build Gingerbread or newer; JDK 5 for Froyo or older. You can download both from java.sun.com.这里安装的是JDK6
Git 1.7 or newer.  git-scm.com.

官方文档说11.10的运行以下的安装命令如下:

$ sudo apt-get install git-core gnupg flex bison gperf build-essential \
  zip curl zlib1g-dev libc6-dev libncurses5-dev x11proto-core-dev \
  libx11-dev libreadline6-dev libgl1-mesa-dev tofrodos python-markdown \
  libxml2-utils xsltproc

网上有一安装的指引给出另一个安装命令
$sudo apt-get install git-core gnupg flex bison gperf libsdl1.2-dev libesd0-dev libwxgtk2.6-dev squashfs-tools build-essential zip curl libncurses5-dev zlib1g-dev sun-java6-jdk pngcrush schedtool  

由于懒得逐个包去甄别,上述两条命令我都运行和安装了。

注意:sun-java6-jdk是无法安装的,可以自己下载,请参考:https://help.ubuntu.com/community/Java

2、关于 USB 访问权限
Android的开发和调试使用的最主要连接设备的命令 adb和fastboot都需要使用USB连接,从文档上知道,Ubuntu下面USB的访问权限可能会出问题,解决的方法文档也列明了。

我的经验是如果访问不了连接的USB设备了,再查阅资料处理。为了以备以后查阅,记录下来如下:
针对摩托罗拉的设备,使用root文件创建/lib/udev/rules.d/11-android.rules,生成下列的配置到文件中。#号为注释符号,下列配置,第一行针对一种设备,第二行针对所有摩托罗拉设备。

#SUBSYSTEM=="usb", ATTRS{idVendor}=="22b8", ATTRS{idProduct}=="41db",MODE="0666,OWNER="shallon"
SUBSYSTEM=="usb", ATTRS{idVendor}=="22b8", MODE="0666", OWNER="shallon"  #All Motorola

其中的idVendor和idProduct的值怎么来呢?用USB线连接设备,然后运行lsusb可以看到设备的这两个值,例如,下文显示摩托罗拉的ME811的相关配置值就是22b8和41db。
Bus 001 Device 082: ID 22b8:41db Motorola PCS Droid/Milestone (Debug mode)
Bus 001 Device 083: ID 046d:c018 Logitech, Inc. Optical Wheel Mouse



3、安装repo

repo是一种更好的用git的一种工具环境。下面命令中repo安装到用户home目录的bin目录下。

$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
$ chmod a+x ~/bin/repo


4、下载安装Android 源码

如果不打算编译Android源码,可以跳过。在WORKING_DIRECTORY上下载源代码,使用repo init命令指定下载源代码的版本,-b 参数指定版本号,如果不指定,则是最近的一个版本。
repo sync则是下载/同步代码的命令。


$ mkdir WORKING_DIRECTORY
$ cd WORKING_DIRECTORY
$ repo init -u https://android.googlesource.com/platform/manifest
$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
$ repo sync


4.a、下载 cyanogenmod 的源码可以生成自定义的 Android Rom

CyanogenMod 致力于生成第三方的非官方的 Android 的 Rom ,目前比较火爆的小米手机的MIUI就是CyanogenMod的衍生产品。下面的命令获取 gingerbread 的版本的源代码。如果不打算尝试这些工作可以跳过此步。


$ mkdir -p ~/cyanogenmod
$ repo init -u git://github.com/CyanogenMod/android.git -b gingerbread  
$ repo sync -j16  

n这里是16,表示同时打开的网络链接数,开启多个网络连接来下载,用以提升的下载的速度。

5、下载开发编译用的Android SDK
参考的官方文档:http://developer.android.com/sdk/installing.html


5.1下载eclipse开发环境,推荐安装“Eclipse Classic”版本,介质下载的地址:http://www.eclipse.org/downloads/ 不用eclipse者可以略过
5.2下载Android SDK,介质安装的地址:http://developer.android.com/sdk/index.html
5.3下载安装eclipse 的ADT plug-in,ADT是 Android Development Tools的缩写。
详细的安装方法http://developer.android.com/sdk/eclipse-adt.html#installing
5.4安装相关的工具包开发包。
安装的方法,可以从eclipse的IDE界面启动Android SDK Manager, Window > Android SDK Manager,或者在Android SDK的根目录运行android命令。
下列的开发包必须要安装:“SDK Tools”,“SDK Platform-tools”,“Android platforms(选择一个或者多个)”


6、测试Android SDK的主要开发工具
6.1 adb
使用USB线连接一台测试的Android设备,运行adb 的两个命令
~/android/sdk/android-sdk-linux/platform-tools$ ./adb devices
List of devices attached
0A3AABB70502A00A device

以及
~/android/sdk/android-sdk-linux/platform-tools$ ./adb shell 连接上设备,能够看到设备上的文件系统,证明adb的工具运作正常。


adb的工具很重要,主要用来调测设备。如果设备被“root”(系统被破解,开放了设备的管理员权限),连接上设备之后,能进行安装、删除软件,远程上传/下载文件,以及查看系统的日志等操作。如果设备没有“root”,则可以用的操作少很多。


6.2 fastboot
fastboot则是用来刷机的,主要用到的操作如下:
    fastboot flash userdata userdata.img
    fastboot flash system system.img
    fastboot flash boot boot.img
    fastboot reboot

6.3 SDK上的Android模拟器
~/android/sdk/android-sdk-linux/tools$ ./emulator ,显示命令存在,但是报错了,不要紧,这里运行一下只是看看是否正常安装了。


这三个工具的用法,请听下回分解



原文博客地址 http://blog.csdn.net/shallon_luo/article/details/7430794
点赞 关注
个人签名如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460

回复
举报

854

帖子

0

TA的资源

五彩晶圆(中级)

沙发
 

如何编译cyanogenmod

什么是cyanogenmod


CyanogenMod是一个Android第三方固件发布和维护的组织,基于官方的Android开源代码衍生出自己的版本。其中,CyanogenMod 6基于Android 2.2(Froyo),CyanogenMod 7基于Android 2.3(Gingerbread)以及CyanogenMod的定制代码,CyanogenMod 8基于Android 3.x(Honeycomb),CyanogenMod 9则基于Android 4.x( Ice Cream Sandwich)。国内有许多的智能手机民间的Android ROM定制社区,以及官方发布的深度定制OS大多是基于CyanogenMod衍生而来,其中著名的有小米的MIUI、盛大的乐众Rom等。这里使用CyanogenMod 7来进行研究。


此处,编译CyanogenMod的OS,只编译操作系统的主要部分,并不编译修改操作系统内核,使用现成的操作系统内核进行打包。关于cyanogenmod的源码目录怎么下载以及android的开发调试环境如何安装的问题,请参见我之前的文章。


CyanogenMod 7的源码目录中,用device目录下面列出了许多的厂商的各种机型。如果目标设备在其中,则可以直接进行编译。例如,华为的u8150设备在cyanogenmod 7上可以看到设备相关的目录“~/cyanogenmod/device/huawei/u8150”。这里可以推荐一个步骤一步一步执行即可(添加链接)。如果目标设备不在CyanogenMod支持的列表中,则需要生成设备相关的文件。


如何向CyanogenMod添加一种新的设备


基本上,这个很难,需要比较专业的人士才能做。基本的原理是,利用现成的的一个运作良好的设备,例如,买了一台智能手机后,将该智能手机破解(ROOT),权限打开后,将设备相关的文件逐个拷贝出来,这些设备相关的文件都是SO的文件(运行时链接的文件),这些文件在Cyanogenmod编译完成后直接进行打包。为何不直接编译生成SO文件呢?原因是这些文件直接和特定的设备相关,设备厂商并不开放这部分源代码(Android的License允许),主要是Android操作系统中HAL层的文件(关于Android的HAL结构,是导致设备相关的驱动逻辑没有放在内核,而是放在用户空间的原因,可以查资料了解一下)。



设备相关的文件如何获取呢?如何知道要从现成的机器抓取什么文件下来呢?这个对普通的CyanogenMod编译者来说,直接去网上看看有没有大牛的共享好了。例如,本人的C8500,不是cyanogenmod 7支持的设备类型,我只好在互联网上痛苦的寻找编译所缺失的文件,相关下载链接为试验的时候所用,不能保证该链接长久有效。(实际上,我已经发现部分链接无效了,瀑布汗)


C8500设备的编译准备工作


CyanogenMod源码下载请参见前文:http://blog.csdn.net/shallon_luo/article/details/7430794 中的“下载 cyanogenmod 的源码可以生成自定义的 Android Rom” 部分


1.生成~/cyanogenmod/device/huawei的c8500设备目录
1.1下载设备描述文件:ioz9-android_device_huawei_c8500-1-856dd9b.zip(下载链接:
链接已隐藏,如需查看请登录或者注册
)

1.2解开后将根目录改名为c8500


2.添加~/cyanogenmod/device/common/gps目录下c8500相关文件,解决编译找不到文件的问题
2.1.下载ShunYea-android_device_common_gps-b7f9c29.zip文件(下载链接:
链接已隐藏,如需查看请登录或者注册

2.2.解开获取gps.conf_CN_SUPL文件和gps_cn_supl.mk文件拷贝到目录下


以下步骤主要为了向编译系统支持多一种设备的编译。
3.添加~/cyanogenmod/vendor/cyanogen/products目录下的cyanogen_c8500.mk文件
3.1下载ShunYea-android_vendor_cyanogen_products-7c7703d.zip文件(下载链接:
链接已隐藏,如需查看请登录或者注册

3.2解开获取cyanogen_c8500.mk文件拷贝到目录下


4.~/cyanogenmod/vendor/cyanogen$ vi vendorsetup.sh
添加一行
add_lunch_combo cyanogen_c8500-eng


添加一行
5.~/cyanogenmod$ vi ./vendor/cyanogen/products/AndroidProducts.mk
添加一行
$(LOCAL_DIR)/cyanogen_c8500.mk \


运行~/cyanogenmod/device/huawei/c8500$ ./setup-makefiles.sh


C8500设备的编译过程

1.获得设备相关的文件,将USB线连接一台ROOT之后的C8500设备,打开C8500设备的开发调试选项,并设置环境变量,使adb命令能被当前用户执行。请参见http://blog.csdn.net/shallon_luo/article/details/7453608关于adb命令的部分。



cd ~/cyanogenmod/device/huawei/c8500
./extract-files.sh


实际上这个脚本就是调用adb pull命令将设备上的文件逐个抓下来,放到vender/huawei目录下。如果手上没有这样的一台设备,则可以去网上找一找,看看有没有人把目标设备的proprietary包共享出来,例如,C8500的设备,我找到了一个:


下载ioz9-proprietary_vendor_huawei-1d161c3.zip(下载链接:
链接已隐藏,如需查看请登录或者注册

解开获取其中的c8500目录整个目录拷贝到~/cyanogenmod/vendor/huawei目录下


2.编译命令


cp ~/cyanogenmod/vendor/cyanogen/products/cyanogen_c8500.mk  ~/cyanogenmod/buildspec.mk
cd ~/cyanogenmod/
. build/envsetup.sh
lunch
make -j4


lunch之后出现了设备列表,选择cyanogen_c8500-eng。eng是工程调试版本的意思。“make -j4”中的4可以修改,根据CPU的个数选择或者CPU个数的两倍来选择,用以加快编译速度。


3.经过漫长的编译过程之后


~/cyanogenmod/out/target/product/c8500目录下可以看到编译结果,主要有用的是:
userdata.img、system.img、boot.img、recovery.img等等。
使用fastboot命令将boot.img 、system.img、userdata.img刷入C8500,然后使用fastboot命令重启设备,详细参见http://blog.csdn.net/shallon_luo/article/details/7453608的fastboot部分。

静待C8500启动,查看效果。

4. 附录:userdata.img、system.img、boot.img、recovery.img的解包和重新打包工具。

在~/cyanogenmod/out/host/linux-x86/bin/目录下,可以找到下列执行命令。


解开boot.img userdata.img system.img
~/cyanogenmod/out/host/linux-x86/bin/unpackbootimg -i boot.img
BOARD_KERNEL_CMDLINE mem=211M console=ttyMSM2,115200n8 androidboot.hardware=c8500
BOARD_KERNEL_BASE 00200000
BOARD_PAGE_SIZE 4096
shallon@shallon-Joybook-R48:~/cyanogenmod/out/target/product/c8500/test$ ls -al
total 6056
drwxr-xr-x  2 shallon shallon    4096 2012-04-20 14:22 .
drwxrwxr-x 10 shallon shallon    4096 2012-04-20 09:14 ..
-rw-r--r--  1 shallon shallon 3092480 2012-04-20 14:22 boot.img
-rw-rw-r--  1 shallon shallon       9 2012-04-20 14:22 boot.img-base
-rw-rw-r--  1 shallon shallon      61 2012-04-20 14:22 boot.img-cmdline
-rw-rw-r--  1 shallon shallon       5 2012-04-20 14:22 boot.img-pagesize
-rw-rw-r--  1 shallon shallon  153345 2012-04-20 14:22 boot.img-ramdisk.gz
-rw-rw-r--  1 shallon shallon 2930688 2012-04-20 14:22 boot.img-zImage

解开获得2个重要的文件,一个是操作系统的内核文件boot.img-zImage,一个是根文件系统ramdisk文件,boot.img-ramdisk.gz

~/cyanogenmod/out/host/linux-x86/bin/unyaffs userdata.img

解开可以看到userdata.img里面只有一个/data目录

~/cyanogenmod/out/host/linux-x86/bin/unyaffs system.img

解开可以看到原本位于system目录下的子目录。

将data目录生成文件userdata.img

out/host/linux-x86/bin/mkyaffs2image -f out/target/product/c8500/data out/target/product/c8500/userdata.img

生成boot.img
使用unpackbootimg再次打包生成新的myboot.img文件。该文件和原来的boot.img一样大小。
~/cyanogenmod/out/host/linux-x86/bin/mkbootimg --kernel boot.img-zImage --cmdline mem=211M console=ttyMSM2,115200n8 androidboot.hardware=c8500 --base 0x00200000 --pagesize 4096 --ramdisk boot.img-ramdisk.gz --output myboot.img

生成system.img文件

~/cyanogenmod/out/host/linux-x86/bin/mkyaffs2image -f  out/target/product/c8500/system out/target/product/c8500/obj/PACKAGING/systemimage_intermediates/system.img

 
个人签名如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
 

回复

854

帖子

0

TA的资源

五彩晶圆(中级)

板凳
 

    昨天写了Android的开发如何初始化环境配置,今天继续说说Android开发调试的几大工具,主要是adb fastboot 和emulator。一般使用eclipse进行开发的Android开发者也许完全不需要用到这几个命令,但是,若要了解到系统内部,工具无疑就是解剖Android的手术刀。


Android的NAND结构与Root的过程       Android的刷机、Root、开发调试过程中不可避免的涉及到Android的NAND(翻译做闪存?)。耳熟能详的主要几大分区有boot、system、userdata、和recovery。


        system、userdata分区在Android文件系统中被挂载为/system和/data目录,这两个目录在使用调试工具adb的时候可以看得到,/data允许进行读写,主要存放用户自安装的程序以及使用设备产生的用户个人数据,system目录存放系统的文件以及预装的重要的系统应用,挂载到文件系统中不允许读写(除非设备被Root)。boot分区则存放操作系统的内核和initrd。recovery分区包含了一套后备的系统,主要在设备升级、备份、维护的时候使用,简单的说,要刷ROM需要进入recovery模式。


        在设备的正常工作状态(即是设备没有被Root的时候)下,只有userdata和cache分区是可读写的,其他分区则一般处在只读状态。这种设计的本意是保护系统以及系统的重要程序不被恶意纂改,保证系统的安全性,但是,当recovery分区上的recovery.img被覆盖成另一个版本(例如ClockWorkMod recovery image),recovery分区上的NAND保护机制被破坏了,NAND的分区就完全失去了保护,可以自由的更新system.img和boot.img,此时,可以说设备被Root了,或者说Nand处在"解锁(unlocked)"状态。因此,Android智能手机用户自己动手Root手机设备以及使用网上下载的手机文件来更新Nand(刷机),这是危险的举动。

fastboot的用法        fastboot是Android SDK的用来读写NAND的工具,位于android-sdk-linux/platform-tools目录下,下面介绍fastboot的主要用法。


        1、手机首先要进入fastboot状态/recovery模式下,有些设备必须确保设备处在S-OFF (security off)状态。 下面以华为的C8500设备来说明。


        a:首先关机
        b:按住“音量减键”不放开,按住红色“挂断键”不放开(请一直不要放开按住的“音量减键”),按住“电源键”不放开(请一直不要放开按住的“音量减键”与红色“挂断键”)
        c:持续按住大约五秒钟(三键同时按住),手机显示停顿在华为Logo画面(手机主界面并没有继续启动,即一直停顿在华为Logo开机画面),即表示手机进入fastboot模式


2、下面这几个命令刷写NAND的主要分区,并重启。
fastboot flash userdata data.imgfastboot flash system system.imgfastboot flash boot boot.imgfastboot reboot3、刷写recovery分区并重启
fastboot flash recovery /path/to/.imgfastboot reboot4、擦除分区
fastboot erase bootfastboot erase recovery

ADB的用法

        刷机完成后,在日常开发调试过程中,最重要的工具是adb(Android Debug Bridge),这个工具位于android-sdk-linux/platform-tools目录下。豌豆夹之类的软件是基于adb的底层机制做成的应用(由于这种应用和adb一样需要设备工作在开发调试模式下,相信Android官方其实不想鼓励这种应用)。
        ADB的用法说明:
[url]http://developer.android.com/guide/developing/tools/adb.html[/url]


        1、使用USB连接线连接ubuntu和智能手机设备,并在设备上打开调试模式。设置->应用程序->开发->USB调试选项打勾。
        2、adb devices能够看到设备的状态,adb shell能够连接上去设备看到一个linux的系统,使用ls还能看到文件目录
        ~/android/sdk/android-sdk-linux/platform-tools$ ./adb devices
        List of devices attached
        0A3AABB70502A00Adevice



        ~/android/sdk/android-sdk-linux/platform-tools$ ./adb shell

       # ls
       acct                 init                 sd-ext
       cache                init.c8500.rc        sdcard
       config               init.goldfish.rc     sys
       d                    init.rc              system
       data                 mnt                  ueventd.goldfish.rc
       default.prop         proc                 ueventd.huawei.rc
       dev                  root                 ueventd.rc

       etc                  sbin                 vendor



3、上传下载文件
        adb pull
        adb push

4、查看日志
        ~/android/sdk/android-sdk-linux/platform-tools$ ./adb shell


        #logcat ActivityManager:I *:S

04-12 16:01:03.255  1262  1272 I ActivityManager: Start proc com.tencent.mm for broadcast com.tencent.mm/.booter.NotifyReceiver: pid=25676       uid=10188 gids={1006, 3003, 1015}
04-12 16:01:03.482  1262  1290 I ActivityManager: Displayed activity com.android.settings/.ApplicationSettings: 323 ms (total 323 ms)

......


4、运行系统上的命令,进入adb shell,可以查看到/system/bin有可运行的系统命令使用,此处以sqlite3为例,获取应用的用户数据(被Root的机器,好危险呀)。

        $ adb -s emulator-5554 shell
        # sqlite3 /data/data/com.example.google.rss.rssexample/databases/rssitems.db
        SQLite version 3.3.12
        Enter ".help" for instructions
        .... enter commands, then quit...
        sqlite> .exit



emulator的用法


        emulator一般的Android开发人员也许不会了解到,原因是万能的eclipse IDE配置好了之后,开发人员就直接写应用,然后在IDE上运行调试去了。这无疑很大程度的降低了开发人员的技术门槛。emulator位于android-sdk-linux/tools目录下,相关的官方文档:
[url]http://developer.android.com/guide/developing/tools/emulator.html[/url]
[url]http://developer.android.com/guide/developing/devices/emulator.html[/url]。
        emulator的工作原理很简单,创建开发机器上的虚拟硬件设备,在虚拟硬件设备上面运行系统。如果使用eclipse IDE,在第一次运行程序的时候会自动提醒建立虚拟硬件设备(图形界面,直接点击即可)。手工使用命令行创建虚拟硬件设备也可以,参考http://developer.android.com/guide/developing/devices/managing-avds-cmdline.html


        命令行下创建虚拟硬件设备:
        ~/android/sdk/android-sdk-linux/tools$ ./android create avd -n my_android2.3 -t 3

        Auto-selecting single ABI armeabi
        Android 2.3.3 is a basic Android platform.
        Do you wish to create a custom hardware profile [no]
        Created AVD 'my_android2.3' based on Android 2.3.3, ARM (armeabi) processor,
        with the following hardware config:
        hw.lcd.density=240
        vm.heapSize=24
        hw.ramSize=256



        命令行下运行模拟器,可以看到一个基于qemu虚拟机上运行的android模拟设备的运行界面:
        ~/android/sdk/android-sdk-linux/tools$ ./emulator -avd my_android2.3



        用模拟器加载非系统缺省的调试NAND文件,创建好虚拟硬件设备后,使用emulator的参数指定第三方NAND分区文件。例如,下面的命令指定了自编译出来的各种文件:

        ./emulator -avd my_emulator_avd -system ~/cyanogenmod/out/target/product/c8500/system.img -data ~/cyanogenmod/out/target/product/c8500/userdata.img -kernel ~/cyanogenmod/out/target/product/c8500/kernel -ramdisk ~/cyanogenmod/out/target/product/c8500/ramdisk.img -debug all



        遗憾的是,上述命令我并没有调试成功,模拟器上面显示出黑屏,上述命令仅仅供参考吧。
 
个人签名如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表