开始编译Android。

先参考网上的文章拿到Android源代码。下载Android源码需要用到Git和Repo。Git是一个开源的分布式版本控制软件,它非常适合管理很大的项目,项目文件可以分布储存在多个Git repositories(仓库), 这样可以很方便地创建分支,进行版本比较等,所以Android也用它来进行源码管理。 Repo是基于Git的工具,它可以让我们更方便地管理Git repositories.

接下来我们要在Ubuntu上面安装这两个工具, 在安装之前要先安装一些必要的Linux Packages: JDK 5.0(Java 6不支持因为@Override的不兼容), lex, bison, gperf, libsdl-dev, libesd0-dev, libwxgtk2.6-dev (optional), build-essential, zip, curl.

在Ubuntu的Terminal运行以下命令: $ sudo apt-get install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev

这里需要注意的是sun-java5-jdk的源在Ubuntu9.10后就没有了, 所以安装sun-java5-jdk 要切换Sources.list才能安装,具体可以参考这篇Blog.

Git(上面的git-core)装完了,接下来装Repo, 在home目录创建bin目录,然后获取Repo并授于它执行的权限:

$ cd ~
$ mkdir bin
$ curl http://android.git.kernel.org/repo >~/bin/repo
$ chmod a+x ~/bin/repo

接下来把bin目录加入$PATH:

$ export PATH=$HOME/bin:$PATH

再接着在home目录创建mydroid目录用来存放Android源码

$ mkdir mydroid
$ cd mydroid

最后下载Android源码,如果要拿最新的主分支源代码用:

$ repo init -u git://android.git.kernel.org/platform/manifest.git

要下载某个分支的代码使用-b选项,比如我要下载android-1.5的代码使用如下命令:

$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-1.5

接下来:
$ repo sync

接下来要经过很长时间的下载,然后开始编译。

编译Android需要注意的就是编译环境的配置,如果使用JDK1.6则必须用64位的libstdc++.so,因为Android有四个makefile对此做了强制,在使用JDK1.6的时候加了-m64的编译链接选项。另外,使用JDK1.6编译的时候会出现javadoc无法生成导致编译失败,因此我编译的时候改为使用JDK1.5,这样也不用安装64位的库了。Android编译需要大量临时空间,编译前先给虚拟机分配1G以上内存,否则编译经常会卡死在”target Dex: core“;同时需6G多的硬盘空间,注意预留。

然后就可以进入android,

source build/envsetup.mak,

export ANDROID_JAVA_HOME=$JAVA_HOME

然后make,大概要4、5个小时左右编译完成,可以看到新生成了一个out目录。其中

out/target/product/generic/有三个.img文件ramdisk.img、system.img、userdata.img,那是给模拟器使用的映像文件,如果要在真机上跑,可将out/system目录和out/data目录拷贝到out/root目录下,该目录就是android的根文件系统。然后让android内核通过NFS挂载到out/root目录下,会发现一条打印,告知/initlogo.rle不存在,这是android内核要加载开机画面。

到网上搜索了一下找到了android logo制作方法:

首先下载advanced batch converter,将图片转换成raw格式,然后使用android生成的out/host/linux-x86/bin/rgb2565命令将raw格式图片转成rle格式,命令如下:

rgb2565 -rle initlogo.raw initlogo.rle

将生成的initlogo.rle拷贝到android根文件系统根目录下。

修改init.rc文件,去掉除mount tmpfs tmpfs /sqlite_stmt_journals size=4m之外所有的mount命令,
重新启动内核,可以看到logo显示出来了。

文件系统启动后打印信息如下:

[ 10.220104] CSM CN100 eth0: MII transceiver 1 status 0x786d advertising 01e1.
[ 10.260488] eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
[ 11.300202] IP-Config: Complete:
[ 11.310030] device=eth0, addr=192.168.127.161, mask=255.255.255.0, gw=255.255.255.255,
[ 11.350141] host=192.168.127.161, domain=, nis-domain=(none),
[ 11.360028] bootserver=192.168.127.160, rootserver=192.168.127.160, rootpath=
[ 11.400104] Looking up port of RPC 100003/2 on 192.168.127.160
[ 11.501515] Looking up port of RPC 100005/1 on 192.168.127.160
[ 11.760442] VFS: Mounted root (nfs filesystem).
[ 11.780526] Freeing init memory: 120K
[ 11.830169] Warning: unable to open an initial console.
[ 24.310431] init: cannot find '/system/bin/playmp3', disabling 'bootsound'
sh: can't access tty; job control turned off
# [ 38.570283] warning: `rild' uses 32-bit capabilities (legacy support in use)

<3>[ 22.620480] init: Unable to open persistent property directory /data/property errno: 2
[ 24.780245] init: cannot find '/system/bin/playmp3', disabling 'bootsound'
sh: can't access tty; job control turned off
# <6>[ 39.420487] warning: `rild' uses 32-bit capabilities (legacy support in use)

其中init: Unable to open persistent property directory /data/property errno: 2

是因为init.rc中将nfs挂在为只读了:

mount rootfs rootfs / ro remount

改成mount rootfs rootfs / rw remount即可

android启动不久就出现了如下错误:

[ 658.980000] System halted.
[ 873.940484] binder: release 650:650 transaction 1074 in, still active
[ 873.960000] binder: send failed reply for transaction 1074 to 718:728
[ 873.970070] binder: release 650:654 transaction 1068 in, still active
[ 873.980156] binder: send failed reply for transaction 1068 to 729:736
[ 878.600229] init: untracked pid 687 exited
[ 878.610222] init: untracked pid 691 exited
[ 878.620226] init: untracked pid 729 exited
[ 878.640219] init: untracked pid 740 exited
[ 878.650153] init: untracked pid 749 exited
[ 1365.641527] binder: 635:684 transaction failed 29189, size 168-0
[ 1389.770177] System halted.
[ 1884.971653] binder: 635:684 transaction failed 29189, size 168-0
[ 1927.680044] System halted.
[ 2271.570282] binder: release 812:883 transaction 2707 in, still active
[ 2271.580173] binder: send failed reply for transaction 2707 to 872:920
[ 2275.040108] init: untracked pid 848 exited
[ 2275.050236] init: untracked pid 852 exited
[ 2275.070146] init: untracked pid 891 exited
[ 2275.090154] init: untracked pid 898 exited
[ 2275.100231] init: untracked pid 911 exited

出现android Power off画面,有一个圆圈在转动。

这是因为android-1.5的framework检测不到battery level(电池电量),认为电量为0,自动把系统挂起了。

The reason may be that no battery and power soruce can be detected by
system.
(battery level =0 and unknown charging status)
So ShutdownThread is invoked by KeyguardUpdateMonitor to power off the
system.

Please comment line 300 of "frameworks/policies/base/phone/com/android/
internal/policy/impl/KeyguardUpdateMonitor"
and make again to get the new rootfs.
Then the battery check can be avoided when booting.
按照上面的说明注释掉frameworks/policies/base/phone/com/android/internal/policy/impl/KeyguardUpdateMonitor.java文件中的
// ShutdownThread.shutdownAfterDisablingRadio(mContext, false);

详细出处参考:http://www.itqun.net/content-detail/143864.html

重新编译制作android rootfs,启动,android桌面出来了,但是仍然有一个“Please connect charger”

的提示框。

下一步就是要想办法让android能接收和处理遥控按键。

android使用标准linux输入设备获取按键键值并处理,而芯晟内核已经把遥控驱动设计成标准输入设备的形式,所以只要修改android的键盘映射即可。android默认使用系统的 /system/usr/keylayout/qwerty.kl作为键值映射文件。修改此文件并重新编译、安装根文件系统。修改后的qwerty.kl文件内容如下:

key 399 GRAVE
key 0 1
key 7 2
key 6 3
key 4 4
key 11 5
key 10 6
key 8 7
key 15 8
key 14 9
key 13 0
key 91 BACK WAKE_DROPPED
key 230 SOFT_RIGHT WAKE
key 60 SOFT_RIGHT WAKE
key 107 ENDCALL WAKE_DROPPED
key 62 ENDCALL WAKE_DROPPED
key 78 MENU WAKE_DROPPED
key 139 MENU WAKE_DROPPED
key 59 MENU WAKE_DROPPED
key 127 SEARCH WAKE_DROPPED
key 217 SEARCH WAKE_DROPPED
key 228 POUND
key 227 STAR
key 231 CALL WAKE_DROPPED
key 61 CALL WAKE_DROPPED
key 232 DPAD_CENTER WAKE_DROPPED
key 23 DPAD_DOWN WAKE_DROPPED
key 103 DPAD_UP WAKE_DROPPED
key 102 HOME WAKE
key 66 DPAD_LEFT WAKE_DROPPED
key 65 DPAD_RIGHT WAKE_DROPPED
key 115 VOLUME_UP
key 114 VOLUME_DOWN
key 1 POWER WAKE
key 212 CAMERA

key 16 Q
key 17 W
key 18 E
key 19 R
key 20 T
key 21 Y
key 22 U
key 28 I
key 24 O
key 25 P
key 26 LEFT_BRACKET
key 27 RIGHT_BRACKET
key 43 BACKSLASH

key 30 A
key 31 S
key 32 D
key 33 F
key 34 G
key 35 H
key 36 J
key 37 K
key 38 L
key 39 SEMICOLON
key 40 APOSTROPHE
key 63 DEL

key 44 Z
key 45 X
key 46 C
key 47 V
key 48 B
key 49 N
key 50 M
key 51 COMMA
key 52 PERIOD
key 53 SLASH
key 21 ENTER

key 56 ALT_LEFT
key 100 ALT_RIGHT
key 42 SHIFT_LEFT
key 54 SHIFT_RIGHT
key 41 TAB
key 57 SPACE
key 150 EXPLORER
key 155 ENVELOPE

key 12 MINUS
key 67 EQUALS
key 215 AT

至此终于可以通过遥控器操作android了!

更多相关文章

  1. Android(安卓)开发者 | 应用兼容性注意事项
  2. Android编译环境(1) - 编译Native C的helloworld模块
  3. Android中使用pull解析器操作xml文件的解决办法
  4. Android中关于颜色的使用
  5. [读书笔记]布局的屏幕适配常用方法
  6. [Android] 将Android工程做成jar包和资源文件
  7. 箭头函数的基础使用
  8. NPM 和webpack 的基础使用
  9. Python list sort方法的具体使用

随机推荐

  1. Android修改文件和文件夹权限
  2. [Android]屏幕自适应布局
  3. cocos2.2.3 HelloCpp TestCpp android 环
  4. Android中的内存溢出和内存泄漏问题
  5. 分享45个android实例源码
  6. Android官方技术文档翻译——Application
  7. 实现Android的图片画廊控件ScrollGallery
  8. Android 隔一段时间重复执行某代码
  9. Android CTS测试Fail项修改总结(四)
  10. Android:数据库增删改查、SQLite、SQLiteO