工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.wdlinux.cn 注册 | 登陆
浏览模式: 标准 | 列表分类:android

更改Android网络路由

使用的i909手机的免费流量是2G,不过如果要用手机看美剧,这个流量就有点不足。但是,当前我所被覆盖的无线网,上网需要手动设置上网路由。Android里面我还没有找到现成的能够设置路由的软件,不过经摸索,却找出了通过终端使用超级用户模式手工设置路由的办法。

首先确保机器已经root了,还安装了busybox和Emulator。

启动Emulator,然后输入命令:

# ip route show
172.18.0.0/16 dev eth0 src 172.18.3.80
default via 172.18.1.170 dev eth0

有井号的行是命令,没有的是输出结果。上述命令用于显示手机当前的路由。下面的命令删除手机的默认路由。如果出错,说明可能没有安装好busybox。

查看路由只需要普通权限,删除、添加、修改路由都需要超级用户权限。

# su ip route del default

然后,添加默认路由和一条通往内网另一个网段的路由

# su route add default gw 172.18.1.252
# su route add -net 192.30.1.0 netmask 255.255.255.0 gw 172.18.1.170

最后查看新的路由设置,下面的结果表示设置成功了。

#ip route show
192.30.1.0/24 via 172.18.1.170 dev eth0
172.18.0.0/16 dev eth0 src 172.18.3.80
default via 172.18.1.252 dev eth0

当前我使用的busybox有个问题就是命令返回出错结果,它也不会提示任何信息。此外,使用手机键盘输入实在麻烦,解决的一个办法是使用SSH,通过电脑来控制手机。

注意:不同版本的emulator, busybox, 命令稍微有差异,例如最近升级后,su命令需要而且只要首次单独执行一次,此后都不用su, 其次,route add 命令的格式也与电脑版本Linux更接近,需要用route add -net 此类的语法了。

近期升级后,我手机上修改路由的语句变成了:
su
ip route del default
route add -net 0.0.0.0 netmask 0.0.0.0 gw 172.18.1.252
route add -net 192.30.1.0 netmask 255.255.255.0 gw 172.18.1.170

发一份反编译的东东。感觉还不错

反编译(绝好!)
注意点:
1、需要软件
AXMLPrinter2.jar
baksmali.jar
smali.jar
2、用 AXMLPrinter2.jar查看apk中的布局xml文件
过程:
(1)将AXMLprinter2.jar放入某一文件夹中,建议放入SDK中的Tools中,(能不能放入到其它地方倒没试过!)
(2)然后在CMD中启动此文件,格式为:
D:\\android-sdk_r05-windows\\android-sdk-windows\\tools>
java -jar AXMLprinter2.jar   main.xml >main.txt
解释:将当前路径下的main.xml输出至当前下main.txt中。(输出之前,main.xml是乱码,输出后是个文件文件,所有东东全在里面,太TMD强了!)
3、用baksmali.jar反编译classes.dex:
(1)将baksmali.jar放入某一文件夹中,建议放入SDK中的Tools中,(能不能放入到其它地方倒没试过!)
(2)然后在CMD中启动此文件,格式为:
D:\\android-sdk_r05-windows\\android-sdk-windows\\tools>java -jar baksmali-1.2.5.jar -o classout/ classes.dex
(3)此时会在当前目录下生成一个classout文件夹,好东东全在里面了。

4、用smali.jar编译classout成classes.dex:
上一步已经将classes.dex反编译成了.smali文件,好了,我们看看smali文件看够了,在偿试把它编译成classes.dex吧,
输入如下命令:java -jar smali.jar classout/ -o classes.dex.
可以将新生成的classes.dex塞入ApkInstaller.apk里覆盖原来的classes.dex文件,这样我们的apk还是一样能用的哦~
5、特别注意:
反编译可将APK中的各种资源直接利用,例如图标等,特别好用。

关于android中的ramdisk.img及uImage无法包含驱动模块(*.ko)的问题

关于android中的ramdisk.img及uImage无法包含驱动模块(*.ko)的问题

这几天一起在整理freescale的imx53的android源码,今天在编译android kernel的时候发现make menuconfig中配置成<M>模式的驱动模块没有加入编译

之前一直是按照原厂的资料运行下面命令编译内核的:

make uImage

通过查看kernel的makefile发些了一些蛛丝马迹,现在将工作笔记记录如下:

在imx_kernel下运行终端,输入如下命令查看kernel编译相关的一些信息

make help

将会看到如下和编译相关的命令和信息

Cleaning targets:
  clean		  - Remove most generated files but keep the config and
                    enough build support to build external modules
  mrproper	  - Remove all generated files + config + various backup files
  distclean	  - mrproper + remove editor backup and patch files

Configuration targets:
  config	  - Update current config utilising a line-oriented program
  nconfig         - Update current config utilising a ncurses menu based program
  menuconfig	  - Update current config utilising a menu based program
  xconfig	  - Update current config utilising a QT based front-end
  gconfig	  - Update current config utilising a GTK based front-end
  oldconfig	  - Update current config utilising a provided .config as base
  localmodconfig  - Update current config disabling modules not loaded
  localyesconfig  - Update current config converting local mods to core
  silentoldconfig - Same as oldconfig, but quietly, additionally update deps
  randconfig	  - New config with random answer to all options
  defconfig	  - New config with default answer to all options
  allmodconfig	  - New config selecting modules when possible
  allyesconfig	  - New config where all options are accepted with yes
  allnoconfig	  - New config where all options are answered with no

Other generic targets:
  all		  - Build all targets marked with [*]
* vmlinux	  - Build the bare kernel
* modules	  - Build all modules
  modules_install - Install all modules to INSTALL_MOD_PATH (default: /)
  firmware_install- Install all firmware to INSTALL_FW_PATH
                    (default: $(INSTALL_MOD_PATH)/lib/firmware)
  dir/            - Build all files in dir and below
  dir/file.[oisS] - Build specified target only
  dir/file.lst    - Build specified mixed source/assembly target only
                    (requires a recent binutils and recent build (System.map))
  dir/file.ko     - Build module including final link
  modules_prepare - Set up for building external modules
  tags/TAGS	  - Generate tags file for editors
  cscope	  - Generate cscope index
  kernelrelease	  - Output the release version string
  kernelversion	  - Output the version stored in Makefile
  headers_install - Install sanitised kernel headers to INSTALL_HDR_PATH
                    (default: /data/EN3/freescale/i.MX536/i.MX53-QSB-Android-Release3.3/src/kernel_imx/usr)

Static analysers
  checkstack      - Generate a list of stack hogs
  namespacecheck  - Name space analysis on compiled kernel
  versioncheck    - Sanity check on version.h usage
  includecheck    - Check for duplicate included header files
  export_report   - List the usages of all exported symbols
  headers_check   - Sanity check on exported headers
  headerdep       - Detect inclusion cycles in headers

Kernel packaging:
  rpm-pkg         - Build both source and binary RPM kernel packages
  binrpm-pkg      - Build only the binary kernel package
  deb-pkg         - Build the kernel as an deb package
  tar-pkg         - Build the kernel as an uncompressed tarball
  targz-pkg       - Build the kernel as a gzip compressed tarball
  tarbz2-pkg      - Build the kernel as a bzip2 compressed tarball

Documentation targets:
 Linux kernel internal documentation in different formats:
  htmldocs        - HTML
  pdfdocs         - PDF
  psdocs          - Postscript
  xmldocs         - XML DocBook
  mandocs         - man pages
  installmandocs  - install man pages generated by mandocs
  cleandocs       - clean all generated DocBook files

Architecture specific targets (arm):
* zImage        - Compressed kernel image (arch/arm/boot/zImage)
  Image         - Uncompressed kernel image (arch/arm/boot/Image)
* xipImage      - XIP kernel image, if configured (arch/arm/boot/xipImage)
  uImage        - U-Boot wrapped zImage
  bootpImage    - Combined zImage and initial RAM disk
                  (supply initrd image via make variable INITRD=<path>)
  install       - Install uncompressed kernel
  zinstall      - Install compressed kernel
                  Install using (your) ~/bin/installkernel or
                  (distribution) /sbin/installkernel or
                  install to $(INSTALL_PATH) and run lilo

ellip;… ………………

 

可以看到很多编译相关的命令,如:make, make all, make clean, make uImage等等

经过测试发现运行make命令之后,在make menuconfig中配置成<M>的驱动模块都可以加入编译,但是再make uImage生成uImage文件烧到板子上的时候,在目标板上的文件系统里怎么也找不到那些*.ko文件,看了一上午android filesystem相关的资料,总算是找到了解决办法,就是通过修改android生成的ramdisk.img,用脚本把这些*.ko文件导入到android的filesystem中,下面代码就是实现整个过程的脚本:

#!/bin/sh
MAKE_KERNEL=$1

#root dir
KERNEL_DIR=$(pwd)

#out dir
OUT_DIR=${KERNEL_DIR}/../../out

#modules install path
RAMDISK_DIR=ramdisk
INSTALL_MOD_PATH=${OUT_DIR}/tmp/${RAMDISK_DIR}

#echo "make kernel?(y,n)";read MAKE_KERNEL

echo    "******************************"
echo    "*        Make Kernel         *"
echo    "******************************"
if [ "$MAKE_KERNEL"x = "n"x ]; then
	echo "*** skip ***"
else
	make -j4
	make uImage -j4
	cp arch/arm/boot/uImage ${OUT_DIR}
fi


echo    "******************************"
echo    "*    Install modules         *"
echo    "******************************"
	cd ${OUT_DIR}
	[ -e "tmp" ] || { echo "mkdir tmp"; mkdir tmp; }
	cp ./ramdisk.img ./tmp
	
#上一次退出状态: 判断ramdisk.img是否存在
case "$?" in
	"0")
		cd tmp
		mv ramdisk.img ramdisk.img.gz
		cd ./${RAMDISK_DIR}
		gunzip ramdisk.img.gz
		[ -e "${RAMDISK_DIR}" ] || { echo "mkdir ${RAMDISK_DIR}"; mkdir ${RAMDISK_DIR}; }
		cd ${RAMDISK_DIR}
		cpio -i -F ../ramdisk.img
		cd ${KERNEL_DIR}
		make modules_install             #重点在这里,在kernel目录下运行此命令时,会把相关的*.ko文件install到由INSTALL_MOD_PATH指定的目录下!!
		cd ${INSTALL_MOD_PATH}
		find . | cpio -o -H newc | gzip > ../ramdisk.img
		cd ..

		echo    "******************************"
		echo    "*    Make uramdisk.img       *"
		echo    "******************************"
		mkimage -A arm -O linux -T ramdisk -C none -a 0x70308000 -n "Android Root Filesystem" -d ./ramdisk.img ./uramdisk.img	
		mv uramdisk.img ./..
		cd ..
		rm -rf ./tmp
		cd ${KERNEL_DIR}
		echo "***OKAY***"
		;;

	"1")
		echo "ramdisk.img文件不存在!!!!!!"
		rm -rf ./tmp
		cd ${KERNEL_DIR}
		;;
esac

经过这样的处理就可以向android源码生成的ramdisk.img中install任何我们自己的东西了,把uImage和uramdisk.img一起烧到板子上,通过串口查看,得到了我想要的东西,如下:

lrwxrwxrwx radio    radio             2011-07-06 08:58 build -> /data/EN3/freescale/i.MX536/i.MX53-QSB-Android-Release3.3/src/kernel_imx
-rw-r--r-- radio    radio          81 2011-07-06 08:58 modules.isapnpmap
-rw-r--r-- radio    radio          74 2011-07-06 08:58 modules.ofmap
-rw-r--r-- radio    radio          43 2011-07-06 08:58 modules.seriomap
-rw-r--r-- radio    radio        2908 2011-07-06 08:58 modules.dep.bin
-rw-r--r-- radio    radio        1671 2011-07-06 08:58 modules.symbols.bin
lrwxrwxrwx radio    radio             2011-07-06 08:58 source -> /data/EN3/freescale/i.MX536/i.MX53-QSB-Android-Release3.3/src/kernel_imx
-rw-r--r-- radio    radio         141 2011-07-06 08:58 modules.inputmap
-rw-r--r-- radio    radio       11595 2011-07-06 08:58 modules.builtin
-rw-r--r-- radio    radio          99 2011-07-06 08:58 modules.pcimap
-rw-r--r-- radio    radio        1072 2011-07-06 08:58 modules.symbols
drwxr-xr-x radio    radio             2011-07-06 08:58 kernel
-rw-r--r-- radio    radio       13189 2011-07-06 08:58 modules.builtin.bin
-rw-r--r-- radio    radio        3795 2011-07-06 08:58 modules.alias.bin
-rw-r--r-- radio    radio         189 2011-07-06 08:58 modules.usbmap
-rw-r--r-- radio    radio        1189 2011-07-06 08:58 modules.dep
-rw-r--r-- radio    radio        4404 2011-07-06 08:58 modules.alias
-rw-r--r-- radio    radio        1042 2011-07-06 08:58 modules.order
-rw-r--r-- radio    radio          69 2011-07-06 08:58 modules.ccwmap
-rw-r--r-- radio    radio          73 2011-07-06 08:58 modules.ieee1394map

相关的*.ko驱动模块就在kernel目录下!

HTC 发布 Desire Z 和 Flyer 源代码

据国外媒体报道,HTC近日发布了其部分最受欢迎的Android智能手机和新发布的Flyer平板电脑的源代码。公司在自己的开发者页面上贴出了 HTC Desire Z、Incredible S和Flyer平板电脑的2.6.35内核源代码,开发者们可以籍此将Android操作系统输出到其 它HTC设备上,或者创建自定义内核。

此举主要是应消费者要求,之前有消费者在HTC的Facebook页面上抱怨没有提供相关设备,如Evo 4G的源代码共享。用户 Gregory Marton写道,“我很失望HTc违背了GNU公共许可,没有公布Evo 4G操作系统源代码的更改部分。作为一家公司,不能说等它完 备了再发布出来,这就违背了你们签订的协议。既然在我的手机上发布了二进制代码,就需要公开其所有源代码,我们希望能看到改动的部分。”

该协议要求任何修改代码的一方都需要将其公开。HTC在用户发帖之初并未作出回应,而对应产品Desire Z于11月在英国发布,Flyer则在5月发布。

Google支持的Android项目已经遵循GNU的公开协议GPL公布了手机OS的代码。

同时在5月,HTC还许诺对启动加载程序进行解锁,以便开发者在自己的手机上安装非官方的软件等。然而,截止到7月11日“要安装新的软件仍然需要进行大 量测试,面临很多挑战。”据悉,HTC Sensation 4G和EVO 3D上使用的启动加载程序,将于8月在美国成为首款获解锁的程序。

进入 HTC 开发者页面: http://developer.htc.com/

updater-script语法说明及文件系统说明【更新命令和常识】

update-script脚本语法说明(根据android源代码中的recovery.c进行的定义):

1.copy_dir

语法:copy_dir <src-dir> <dst-dir> [<timestamp>]

<src-dir>表示原文件夹,<dst-dir>表示目的文件夹,[<timestamp>]表示时间戳

作用:将<src-dir>文件夹中的内容复制到<dst-dir>文件夹中。<dst-dir>文件夹中的原始内容将会保存不变,除非<src-dir>文件夹中有相同的内容,这样<dst-dir>中的内容将被覆盖

举例:copy_dir PACKAGE:system SYSTEM:(将升级包中的system文件夹复制到手机中)

 

2.format

语法:format <root>

<root>表示要格式化的分区

作用:格式化一个分区

举例:format SYSTEM:(将手机/system分区完全格式化)

注意:格式化之后的数据是不可以恢复的

 

3.delete

语法:delete <file1> [... <fileN>]

<file1> [... <fileN>]表示要格式化的文件,可以是多个文件用空格隔开

作用:删除文件1,2到n

举例:delete SYSTEM:app/Calculator.apk(删除手机systen文件夹中app中的Calculator.apk文件)

 

4.delete_recursive

语法:delete_recursive <file-or-dir1> [... <file-or-dirN>]

<file-or-dir1> [... <file-or-dirN>]表示要删除的文件或文件夹,可以使多个,中间用空格隔开

作用:删除文件或者目录,删除目录时会将目录中的所有内容全部删除

举例:delete_recursive DATA:dalvik-cache(删除/data/dalvik-cache文件夹下的所有内容)

 

5.run_program

语法:run_program <program-file> [<args> ...]

<program-file>表示要运行的程序,[<args> ...]表示运行程序所加的参数

作用:运行终端程序

举例:run_program PACKAGE:install_busybox.sh(执行升级包中的install_busybox.sh脚本)

 

6.set_perm

语法:set_perm <uid> <gid> <mode> <path> [... <pathN>]

<uid>表示用户名称,<gid>表示用户组名称,<mode>,表示权限模式,<path> [... <pathN>]表示文件路径,可以使多个,用空格隔开

作用:设置单个文件或目录的所有者和权限,像linux中的chmod、chown或chgrp命令一样,只是集中在了一个命令当中

举例:set_perm 0 2000 0550 SYSTEM:etc/init.goldfish.sh(设置手机system中的etc/init.goldfish.sh的用户为root,用户组为shell,所有者以及所属用户组成员可以进行读取和执行操作,其他用户无操作权限)

 

7.set_perm_recursive

语法:set_perm_recursive <uid> <gid> <dir-mode> <file-mode> <path> [... <pathN>]

<uid>表示用户,<gid>表示用户组,<dir-mode>表示文件夹的权限,<file-mode>表示文件的权限,<path> [... <pathN>]表示文件夹的路径,可以多个,用空格分开

作用:设置文件夹及文件夹中的文件的所有者和用户组

举例:set_perm_recursive 0 0 0755 0644 SYSTEM:app(设置手机system/app文件夹及其中文件的用户为root,用户组为root,app文件夹权限为所有者可以进行读、写、执行操作,其他用户可以进行读取和执行操作,其中的文件的权限为所有者可以进行读写操作,其他用户可以进行读取操作

 

8.show_progress

语法:show_progress <fraction> <duration>

<表示一个小部分> <表示一个小部分的持续时间>

作用:为下面进行的程序操作显示进度条,进度条会根据<duration>进行前进,当操作时间是确定的时候会更快

举例:show_progress 0.1 0(显示进度条当操作完成后前进10%)

 

9.symlink

语法:symlink <link-target> <link-path>

<link-target>表示链接到的目标,<link-path>表示快捷方式的路径

作用:相当于linux中的ln命令,将<link-target>在<link-path>处创建一个软链接,<link-target>的格式应为绝对路径(或许相对路径也可以),<link-path>为“根目录:路径”的形式

举例:symlink /system/bin/su SYSTEM:xbin/su(在手机中system中的xbin中建立一个/system/bin/su的快捷方式)




android文件系统和分区的定义方式(根据android的源代码的root.c获得):

根目录 Linux块设备 挂载点 文件系统 大小 描述
BOOT: /dev/mtdblock[?] / RAM RAW 内核,内存,系统启动引导信息
DATA: /dev/mtdblock5 /data yaffs2 91904kb 用户,系统设置,程序设置和应用程序,不包括app2sd
CACHE /dev/mtdblock4 /cache yaffs2 30720kb OTA方式下载的缓存,恢复和升级时的设置以及临时文件
MISC /dev/mtdblock[?] 未知 RAW 暂时未知
PACKAGE 相对于升级包而存在 相对于升级包存在的文件系统 不确定 升级包
RECOVERY /dev/mtdblock[?] / RAM RAW 恢复模式和系统升级所需要的内核和内存部分,与BOOT分区类似
SDCARD /dev/mmcblk0(p1) /sdcard fat32 32MB-32GB 内存卡,update.zip升级包通常放在这里
SYSTEM /dev/mtdblock3 /system yaffs2 92160kb 系统分区,静态并且只读的
TMP /tmp RAM   标准的Linux缓存文件系统



更新部分update-script命令:

1.assert <boolexpr>

作用:此命令用来判断表达式boolexpr的正确与否,当表达式错误时程序终止执行

※此作用有待验证

 

2.write_radio_image <src-image>

作用:将基带部分的镜像写入手机,<src-image>表示镜像文件

举例:write_radio_image PACKAGE:radio.img


3.write_hboot_image <src-image>

作用:将系统bootloader镜像写入手机,<src-image>表示镜像位置,此命令在直到在所有的程序安装结束之后才会起作用

举例:write_hboot_image PACKAGE:hboot.img


4.write_raw_image <src-image> <dest-root>

作用:将boot.img写入手机,里面包含了内核和ram盘

举例:write_raw_image PACKAGE:boot.img BOOT:



更新手机常识理解:

system:系统分区.我们刷机器一般就是刷的这个分区.

userdata:数据分区.

cache:缓存分区

recovery:Recovery分区,相当于建立在hboot与android系统间的一个中间层,如名字一般,主要用于系统调试和恢复。.

boot:存放内核和ramdisk的分区.

hboot:这个是SPL所在的分区,即 bootloader

splash1:这个就是开机第一屏幕了.

radio:这个是无线所在的分区.

misc:其他分区

Ubuntu10.0.4下CyanogenMod编译环境的搭建和可刷机文件的编译及打包(For HTC Dream)【转】

本文只是叙述Ubuntu下编译环境的搭建和ROM的编译过程,过程中可能会需要一些Ubuntu的常规操作技巧,在本文里就不详细介绍了,Ubuntu的新手可以通过谷歌学习一下,笔者也是新手,刚用没多久,谷歌一下并不难,另外由于源码和编译后生成的文件都比较大,如果想要折腾起来的话,Ubuntu的分区最好能有30G,20G的话一会就用完了,笔者之前也是分了20G,但不一会就空间不足了,故最后格掉分区,重新分了100G给Ubuntu。

 

 

编译环境的搭建

JDK安装
a) JDK是Ubuntu下使用Android SDK,编译源代码等必备的软件包,首先我们现来装这个

b) 从sun官方网站下载最新版的JDK,一般是个.bin的文件,笔者下载的是jdk-6u20-linux-i586.bin(根据文件不同,命令的也会有所变化,大家在使用的时候要注意,主要是文件名和路径的变化)。

c) 由于JDK运行时会在当前目录下安装,所以在安装前,先把它移动到你想要安装的目录,比如笔者将其安装在/usr/lib/jvm/java目录下,如果你也想安装在相同目录,可以照着我下面的命令来做

代码:

sudo –i

cd /usr/lib

mkdir jvm

cd jvm

mkdir java

cd java

cp “jdk-6u20-linux-i586.bin所在目录“/jdk-6u20-linux-i586.bin /usr/lib/jvm/java

chmod u+x jdk-6u20-linux-i586.bin

jdk-6u20-linux-i586.bin

此时会出现JDK的安装提示说明,按着回车不放,提示说明会持续滚动,www.linuxidc.com直到屏幕提示需要输入Yes/NO,输入YES后,即开始安装,安装完成后提示按回车继续,按完回车后,安装即告成功

d) 与Windows不同,Ubuntu是没有注册表的,故安装完成后,我们需要把我们安装JDK的目录告诉系统,故在刚才的终端里执行如下命令(如果是新开的终端,没有执行过“sudo -i”,则需要在命令前+“sudo”获得权限)

代码:

gedit /etc/environment

此时在会弹出一个文本编辑器,里面显示

代码:

PATH=”……”

其中省略号部分是其默认的路径,这里我们不要动它,我们需要对这个进行一些修改,将我们的JDK安装路径写进去,告诉系统我们的JDK装在哪里,去哪里调用,故做如下修改:

i. 在原有的 PATH=”……” 的省略号里面添加:

代码:

PATH=”……:/usr/lib/jvm/java/jdk1.6.0_20/bin”

ii. 添加两行,输入如下内容:

代码:

CLASSPATH=.:/usr/lib/jvm/java/jdk1.6.0_20/lib

JAVA_HOME=/usr/lib/jvm/java/jdk1.6.0_20

最后生成如下形式:

代码:

PATH=”……:/usr/lib/jvm/java/jdk1.6.0_20/bin”

CLASSPATH=.:/usr/lib/jvm/java/jdk1.6.0_20/lib

JAVA_HOME=/usr/lib/jvm/java/jdk1.6.0_20

其中,省略号部分是文件原有内容,我们在后面新加了一部分内容和两个新行。修改完成后保存退出。

e) Ubuntu有可能会自带JDK或者安装多个JDK,此时需要将我们安装的这个设置为默认

i. 首先,将我们的JDK安装目录加入到JDK的选择菜单,执行如下代码:

代码:

update-alternatives –install /usr/bin/java java /usr/lib/jvm/java/jdk1.6.0_12/bin/java 300

update-alternatives –install /usr/bin/javac javac /usr/lib/jvm/java/jdk1.6.0_12/bin/javac 300

ii. 其次,通过命令来选择默认的JDK,执行如下代码:

代码:

update-alternatives –config java

iii. 最后,再来检查一下系统当前的JDK版本,输入以下代码查看:

代码:

java -version

f) 至此,JDK即告安装成功。

Android SDK安装
a) 既然是做rom,那肯定需要调试和测试的工具,Android的官方SDK同样提供官方版本,我们直接下载安装即可。

b) 去谷歌的官网下载最新的SDK版本,前几天刚跟新了支持2.2的r6,不过SDK的官方网站在墙后,我们只能FQ过去下载,这点比较无奈。官方提供Windows,Mac OS X,Linux三个版本,毫无疑问,我们需要下载Linux的版本。

c) SDK不需要安装,直接解压就可以使用。建议放在主目录下,方便调用。

d) 为了方便adb命令的使用,我们同样需要将adb命令所在的目录添加到系统环境变量中去,这样,在任何目录下都能直接调用adb,不需要现cd到SDK目录,这样会比较方便,实现方法如下:

代码:

sudo gedit ~/.bashrc

用文本编辑器打开.bashrc文件,然后在最后添加一行:

代码:

export PATH=${PATH}:<你sdk的目录>/tools

这里的需要将你sdk的安装目录添写进去,保存后即可。

e) 把手机连上usb,然后在终端中输入:

代码:

adb devices

会列出所有连接在电脑上的Android设备,如果看到一串数字和字母的序列号的显示的话,即表示SDK安装成功。

 

 

软件安装
a) 配置源,更新源之类的问题就不再说了,直接说我们需要的软件,从同步源码到编译rom我们总计需要用到以下几个软件,有部分软件在我们更新过程中可能已经自动安装了,但这不影响我们工作,我把所有需要用到的程序列了出来:

? git-core

? gnupg

? flex

? bison

 

? gperf

 

 

? libsdl-dev

? libesd0-dev

? libwxgtk2.6-dev

? build-essential

? zip

? curl

? libncurses5-dev

? zlib1g-dev

? valgrind

? libreadline5-dev

b) 以上这些程序均通过apt-get命令来安装,比如要安装git-core软件,我们通过输入如下命令来实现:

代码:

sudo apt-get install git-core

c) 其它软件的安装过程类似,替换掉最后的软件名称即可。

d) 安装完所有软件后,编译CyanogenMod所需要的所有环境均搭建完成了。

 

源码同步
repo的安装
a) CyanogenMod的源码地址是http://github.com/cyanogen/android,你可以通过网址右上角的Download Source来下载源码。不过我们并不推荐这种方式下载,因为源码的变化较为频繁,每次一旦源码有变化,我们就需要重新下载完整的源码包,既费时又费力,效率也很低,故推荐通过repo同步的方式来做,在同步过程中,仅会同步源码的变化部分,效率较高。

b) Repo的安装

i. repo的安装比较方便,之需要下载一个文件,并设置成可执行权限,并添加到系统环境中去即可,具体命令如下:

代码:

cd ~

mkdir bin

在你的home根目录下创建名为bin的文件夹。

代码:

sudo gedit ~./bashrc

打开你的环境变量配置文件,在最后加一行:

代码:

export PATH=$PATH:~/bin

修改后保存文件退出,关闭终端,重新打开一个终端,输入如下命令验证路径是否成功添加到环境变量中去了:

代码:

echo $PATH

确认完后,开始安装repo,执行如下命令:

代码:

curl http://Android.git.kernel.org/repo > ~/bin/repo
chmod a+x ~/bin/repo

通过curl命令将repo下载到bin中,并将其权限修改为可执行文件,至此repo的安装结束。

Repo的配置和同步
i. 在主目录下新建一个文件夹,作为源码的存放目录

代码:

cd ~

mkdir cyanogenmod

cd cyanogenmod

ii. 在cyanogenmod目录执行repo命令,设定需要同步的源码内容:

代码:

repo init -u git://github.com/cyanogen/Android.git -b eclair

网址即为cyanogenmod的地址,-b表示我们选择需要同步的分支,cyanogenmod有不少分支,比如dount,eclair,以后还会有froyo,我们目前需要编译的是2.1,即eclair,则通过-b eclair来选择2.1的分支。

iii. 在配置过程中,会让你选择名字和邮箱,这个会显示在你最后编译出来的rom的基础信息里,可以选择你喜欢的来写

iv. 配置完成后,就可以开始同步源码了:

代码:

repo sync

同步的过程会比较长,建议在晚上睡觉前开始同步,一般早上起来就能好了。

编译环境的设置
编译环境的建立
a) 同步玩源码后,首先需要建立编译环境,CM的源码把这些命令都写成了脚本,我们只需运行相应的脚本即可,首先,先cd到源码的根目录,然后执行如下命令:

代码:

./build/envsetup.sh

执行后,屏幕上会显示:

代码:

including vendor/cyanogen/vendorsetup.sh

此时,编译环境设置成功。

 

 

 

专属文件的提取
a) 虽然Android系统是开源的,但有部分Dream的专属文件是不开源的,所以并不包含在源码树中。但如果希望rom能在Dream真机上运行,又需要这些文件,所以需要将这些文件提取出来,在CM中,这个操作比较简单,Steve已经给我们做好脚本了。

b) 首先你要确保安装成功了上述所有软件,然后,将Dream通过usb连接到电脑上。

c) cd到源码的/vendor/htc/dream_sapphire目录,然后执行脚本:

 

 

代码:

./extract-files.sh

d) 这个操作会调用adb命令,从你的手机里pull所需要的专属文件到vendor目录。

编译文件的修改
a) 默认的编译过程包含了所有的语言和程序,但其实我们并不需要这些,可以通过编译文件的修改来定义需要输出的语言和软件

b) 打开/vendor/cyanogen/products 目录下的cyanogen.mk文件,里面定义了要输出的软件和语言,对于不需要的软件,可以直接删除。但不建议在这里修改,可以从最后的输出目录里删除不需要的,直接在这里改容易出错

c) 在文件的最后,有一行”PRODUCT_LOCALES”,这里就包含了rom支持的语言类型,默认有几十种,编译出来后,软件会比较大,一般我们只需要保留其中的常用语言即可,笔者选择保留了en_US,zh_CN和zh_TW这三种语言,编译出来的软件就小了很多。

Kernel编译
1. kernel是Android的核心,也是最重要的部分,虽然CM源码中自带了编译完成的kernel,但既然是自主编译,那你肯定想改改kernel的信息吧,比如kernel的名字,比如打上BFS补丁、超频补丁等等,那你就需要自己来编译kernel了。

2. 编译kernel也非常简单,首先你需要一个kernel的配置文件,CM提供了现成的,直接去/kernel-msm/arch/arm/configs 目录里找,有个配置文件叫cyanogen_msm_defconfig,这个就是我们需要的配额之文件了(如果是给Nexus编译kernel的话,需要选择cyanogen_mahimahi_defconfig)。将它复制到/kernel-msm 的根目录,然后重命名为 .config

3. 用文本编辑器打开.config,其中有一条参数为CONFIG_LOCALVERSION=”-cyanogenmod”,这里即为kernel编译完成后显示的名字,可以把cyanogenmod改成任意你喜欢的名字。

4. 设置完成后,就可以开始编译了。先cd到/kernel-msm目录,然后执行如下命令

代码:

export ARCH=arm

export CROSS_COMPILE=arm-eabi-

export PATH=$PATH:~/cyanogenmod/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin

这些命令定义了编译kernel时所需要用到的环境和设置。注意第三条命令在输入的时候,路径要和自己实际安放源码的路径一致,另外,每次编译kernel前,都需要重新输入这三个命令。

5. 命令输入完后,就可以开始make了:

代码:

make -j3

make就是开始编译的命令,后面的参数-j3表示用于编译的cpu核心数量,一般是cpu核心数量+1,比如双核cpu,就用-j3这个参数。

6. 编译过程根据配置不同而有所不同,笔者笔记本用的T6400是双核2G的,一般编译kernel的时间在10分钟内。编译后的kernel生成在/kernel-msm/arch/arm/boot/目录下,名字叫zImage

CyanogenMod编译
1. 编译完kernel后,就可以开始编译主菜CM了。编译前需要先生成一个buildspec.mk文件,来定义需要编译的rom的基本信息。先cd到源码的根目录,新建一个空文件,名字叫buildspec.mk,并用记事本打开,输入如下信息:

代码:

TARGET_PRODUCT:=cyanogen_dream_sapphire

TARGET_BUILD_VARIANT:=eng

TARGET_BUILD_TYPE:=release

TARGET_PREBUILT_KERNEL:=kernel/arch/arm/boot/zImage

a) 第一条命令表示需要编译的rom的选择,我们现在编译的是G1的rom,故选择cyanogen_dream_sapphire;

b) 第二条命令表示编译的rom的种类,有eng和userdebug两个类型可选,我们当然选在eng;

c) 第三个命令表示编译的rom的类型,我们选择release

d) 第四个命令表示基于哪个kernel来编译rom,如果不设这个命令,则会基于自带的kernel来编译,既然我们自己编译了kernel,那当然用我们自己的,故设置了已经编译好的kernel的目录,供make过程调用。

2. buildspec.mk文件建立好后,就可以开始编译rom了,cd到源码根目录,然后使用命令:

代码:

make -j3

开始编译源码,源码的编译过程会比较长,试配置不同,需要的时间也不一样,笔者的T6400编译完整的CM差不多需要2个小时。

3. 编译完成后,我们的成品就在/out/target/product目录中,里面包含了system.img,recovery.img,boot.img和system文件夹等,到这里,有点制作rom经验的朋友就不需要我再多说了吧。可以在fastboot里直接刷system.img,和boot.img;也可以将system文件夹和boot.img打包成zip包,添加更新脚本并签名,通过recovery刷到机器里,至此,我们自己编译的CyanogenMod for HTC Dream就大功告成了。

-----------------------

1.  查看Android源码的各个版本分支,首先下载 android.git.kernel.org/platform/manifest.git ,得到清单文件后执行git branch -a 即可,该命令执行后会查看清单中的packed-refs。
 
$ repo sync -j 10
多线程同步下载
 
-----------------------------
Android带给我们的不仅仅是优秀的触控,漂亮的界面,快速的事件处理,让我们爱不释手!最重要的,它是开源的,任何android的爱好者都可以在它许可的权限范围内对android的源码做修改,移植,定制,以满足自己的需求。由此,目前非官方的第三方ROM受到了众多手机玩家以及android开发者的热爱,他们或者厌倦了原有的桌面程序,想换换口味,或者是为了优化手机处理能力,去掉一些厂家自带的应用程序。而本文,将引领大家尝试亲自手动编译android的源代码,并且将它移植到自己心爱的手机上。

      本文以CyanogenMod团队优化过的基于android2.1的源代码讲述如何将它移植到htc legend(g6)手机上。

   个人认为CyanogenMod团队是目前非官方ROM开发中非常优秀的,它们制作的android源代码不仅仅可以移植到htc dream,margic,legend,hero,还可以移植到moto xt701,xt702等手机上,实属不容易。

   成功将android2.1移植到手机上,需经过以下几个步骤:

   一,准备好android2.1源码编译环境以及手机USB调试环境。

   二,将手机上硬件驱动程序以及相关的配置文件通过ADB命令保存好。

   三,针对不同的手机机型,制作相应的vendor配置文件。

   四,编译源码。

   五,通过手机提供的bootloader刷机或者直接以recovery的方式更新ROM。

   在以上五个步骤中,其中最难处理的便是第2个步骤,这个步骤需要熟悉每个手机机型的硬件参数,并且能够在手机上找到相关的驱动程序以及了解他们如何配置。而CyanogenMod团队公布的源码当中,己经将相关的工作做好了,编译源码之前仅仅需要执行相应的shell命令,便可顺利的下载相应的手机驱动程序以及配置文件。

下面是移植步骤,供参考:

   一,首先需要下载CyanogenMod 5.0.8的源码:

   $ mkdir android-cm5

   $ cd android-cm5

   $ repo init -u git://github.com/CyanogenMod/android.git -b eclair

   $ repo sync

  二,下载CyanogenMod需要的一些共同文件,如果想最终版本中不需要这些APK,也可以通过配置/vendor/cyanogen/cyanogen.mk文件将这些需要的APK COPY命令注释掉。

  $ cd vendor/cyanogen/

  $ ./get-rommanager   #下载一个RomManager.apk包,主要是刷ROM用的。我没用过。

  $ ./get-google-files #其它的一些google开发的android apk包,我也没有用过!

  三,下载针对htc legend(g6)的vendor.

  $ cd ../../vendor/htc

  $ git clone git://github.com/aleho/android_vendor_htc_legend.git #下载针对htc legend(g6)手机的vendor,里面包括相关的配置参数,以及从手机上下载驱动程序的SHELL命令。

  $ mv android_vendor_htc_legend/ legend

  $ cd legend

  $ ./extract-files.sh  #确保这个命令执行将你的手机连接好电脑并且开了手机USB调试,adb命令可以连接手机。这个过程主要是下载htc legend(g6)驱动程序以及配置文件。

  四,针对CyanogenMod 5.0.8源码打上htc legend(g6)的补丁包,这个补丁包主要是wifi和触摸屏的,如果不做,触摸屏将无法触摸以及wifi功能无法启动。可参数地址:

   http://forum.xda-developers.com/archive/index.php/t-702776.html

五,好了,根据自己的爱好,定制自己的一些vendor参数。然后make otapackage便可编译recovery方式的htc legend(g6)包。

[转]下载并编译Android 2.3源码

原文http://www.blogjava.net/TiGERTiAN/archive/2011/01/20/343283.html

前几天下载了Android 2.3.1的源代码并在Ubuntu 10.04(32位)上编译通过。这篇文章简要记录了下载、编译的过程。

关于搭建Android开发环境的文章已经有很多,本文只简要介绍一下,做为备忘。

[ 编译前的准备 ]

这一步安装获取源代码以及编译所需要的软件,使用如下命令:

$ sudo aptitude install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
另外,参考别人编译Android 2.3的经验,安装了下列软件包:

$ sudo apt-get install lib64z1-dev libc6-dev-amd64 g++-multilib lib64stdc++6
虽然Android官方网站上讲不支持Java 6,不过我使用Java 6也可以编译通过,所以在这里Easwy安装的是Java 6。首先去掉/etc/apt/sources.list中这两行的注释,使能Java 6源:

deb http://archive.canonical.com/ubuntu lucid partner
deb-src http://archive.canonical.com/ubuntu lucid partner
然后安装Java 6 JDK:

$ sudo aptitude install sun-java6-jdk
接下来下载repo工具,这是Google提供的一个Python脚本,方便管理多个Git版本库:

$ cd ~
$ mkdir bin
$ curl http://android.git.kernel.org/repo >~/bin/repo
$ chmod a+x ~/bin/repo
记得把repo加到你的路径中,方便以后使用。编辑~/.bashrc,加入下面一行:

PATH=$PATH:~/bin
export PATH
然后用命令. ~/.bashrc,以后就可以直接使用repo命令了。

接下来获取Android 2.3.1的源代码:

$ mkdir mydroid
$ cd mydroid
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.3.1_r1
$ repo sync
[ 编译Android ]

接下来开始编译:

$ make -j`grep '^processor' /proc/cpuinfo | wc -l`
上面的命令中,-j参数告诉make启动多个并行任务进行编译,在支持多核的CPU上能加快编译速度。如果你知道你CPU是几核的,可以直接把这部分替换成-j2(双核)。

我在编译的过程中遇到下面的错误:

************************************************************

You are attempting to build on a 32-bit system.

Only 64-bit build environments are supported beyond froyo/2.2.

************************************************************

这是因为在Makefile中检测了CPU的字长。我直接把build/core/main.mk中下面的话注释掉:

#ifneq (64,$(findstring 64,$(build_arch)))
#$(warning ************************************************************)
#$(warning You are attempting to build on a 32-bit system.)
#$(warning Only 64-bit build environments are supported beyond froyo/2.2.)
#$(warning ************************************************************)
#$(error stop)
#endif
接下来又遇到下面的错误:

Docs droiddoc: out/target/common/docs/api-stubs

Could not load ‘clearsilver-jni’

java.library.path = out/host/linux-x86/lib

make: *** [out/target/common/docs/api-stubs-timestamp] Error 45

make: *** Waiting for unfinished jobs….

Could not load ‘clearsilver-jni’

java.library.path = out/host/linux-x86/lib

make: *** [out/target/common/docs/doc-comment-check-timestamp] Error 45

这是由于clearsilver在编译时如果检测到使用Java JDK 6,就使用64位编译。要避开此错误,需要修改下面四个文件:

external/clearsilver/cgi/Android.mk
external/clearsilver/java-jni/Android.mk
external/clearsilver/util/Android.mk
external/clearsilver/cs/Android.mk
把这四个Makefile中的下列语句注掉即可:

# This forces a 64-bit build for Java6
# Comment by Easwy
# LOCAL_CFLAGS += -m64
# LOCAL_LDFLAGS += -m64
然后在external/clearsilver目录中执行一下make clean,然后回到项目根目录,继续make即可。

当编译完成时,生成的image文件放在out/target/product/generic目录中。

Android 应用程序快速启动的秘诀

Android系统框架和上层应用是类java(不是正统的sun java)开发的,实现了自己的java虚拟机dalvik,既然用java虚拟机和java开发,一般都会认为效率低下。其实不然,在基本主流的智能手机的软件平台上,android的执行速度是最快的。



那么android效率为什么这么的高呢?特别是一个应用程序的启动时间很短,本文主要从以下个八方面进行分析:



1、 资源文件的优化读取。


我们知道android在UI开发时有个很大的好处是xml文件来描述UI,这样有个好处是只要修改UI不用修改代码就可以修改界面的布局、显示风格和字体大小等。界面定义变得灵活方便。xml配置UI在qtopia运用也有但是这么强大并且也不广泛,因为xml文件有个不足是解析xml的效率很低。


Android是怎么做的呢?


Android在编译的时候就把xml文件进行了优化,android应用程序在解析时变得非常的高效。我们看到apk文件解压后会有个优化过的资源文件。



2、 安装时进行优化dex文件


Android的应用程序都打包成一个apk文件,实际上就是一个zip文件。系统第一次起来或应用程序第一次安装时,系统就把apk文件解压了,把可执行文件dex优化成odex文件并放在/data/dalvik-cache目录下。优化后的dex文件启动速度会加快。这解释了为什么 android系统第一次启动是比较慢,以后起来很快了。


可能有人会问:为什么不在编译时直接优化呢?第⑤项会回答这个问题。



3、 制作数据库


Android的图形应用是加载整个sd卡内的所有图像的,但是为什么很快呢?其实android提前把数据做成了数据库,所以不用每次扫描整个这个sd卡,大大加快了启动速度。



4、 高效的虚拟机


Android是基于类java虚拟机dalvik,一般的java虚拟机是基于栈的,而dalvik是基于寄存器的。实事求是说我对两者的区别了解不是很深入,不过网上有专门的相关文论进行分析。我的简单理解是栈的实现方式相对容易,相关数据是在内存中的栈里,而操作寄存器里数据的速度明显快与内存里的数据处理。



5、 充分挖掘CPU的性能


Android刚出来的时候虽然支持arm cpu,实际上只支持armv5te的指令集的,因为android系统专门为armv5te 进行了优化,充分利用armv5te的执行流水线来提高执行的效率,这也是在500M的三星2440运行效果不是很好,而在200M的omap cpu上运行比较流畅的原因了,所以在最新的代码中有专门针对x86和armv4的优化部分。



6、 优化和裁剪的libc库


Libc库几乎是所以库和程序的基础,但是android没有直接利用libc库,而是自己开发了一个库:bionic,它实现了libc库的绝大多数的函数并根据平台进行了优化,但是有系统很少用并且消耗资源的少数函数是不支持的。它只有几百k,节省了空间同时也提高了执行效率。实际上体现了 20-80原则,抓住少数重要的适当舍弃不必要的。



7、 充分利用linux系统特性


分析过linux内核的朋友知道,linux fork一个新的进程是非常高效的,利用了COW机制。Android是每个进程是个独立的虚拟机(听说这么设计是为安全考虑,某个时候进程崩溃了不会影响这个系统和其他进程。)android里每个进程都是基于虚拟机的,并且也要加载基本的库,实际上这些都是共享。所以android启动一个新的程序实际上并不消耗很多的内存和cpu资源。


同时android在后台有个empty process运行,实际上就是运行一个虚拟机,当要启动一个应用时就直接在其上继续运行,qtopia也有这个机制。


Android系统在开机流程中:启动虚拟机—》启动system server ?》启动launcher。当初分析代码时疑惑为什么不直接启动system server?(qtopia就是直接启动server),实际上也利用了linux的这个特性。


这个特性说的比较简略,不过要真的把他解释清楚可能需要很大的篇幅。




8、 高效的paint机制


这个特性可能跟启动关系不大,但是也是android高效的特性之一。界面变化时大部分实际上不是全屏内容变化的,只是局部变化,android 会根据变化的内容只是跟新局部的内容,也提高了效率。这个也提醒我们在开发应用程序时,重载paint方法时尽量不要paint全屏内容