Submitted by admin on 2011, July 28, 6:39 PM
使用的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
android | 评论:0
| Trackbacks:0
| 阅读:1002
Submitted by admin on 2011, July 28, 12:58 PM
反编译(绝好!)
注意点:
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 | 评论:0
| Trackbacks:0
| 阅读:944
Submitted by admin on 2011, July 28, 10:31 AM
关于android中的ramdisk.img及uImage无法包含驱动模块(*.ko)的问题
这几天一起在整理freescale的imx53的android源码,今天在编译android kernel的时候发现make menuconfig中配置成<M>模式的驱动模块没有加入编译
之前一直是按照原厂的资料运行下面命令编译内核的:
通过查看kernel的makefile发些了一些蛛丝马迹,现在将工作笔记记录如下:
在imx_kernel下运行终端,输入如下命令查看kernel编译相关的一些信息
将会看到如下和编译相关的命令和信息
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目录下!
android | 评论:0
| Trackbacks:0
| 阅读:1004
Submitted by admin on 2011, July 20, 9:32 AM
据国外媒体报道,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/
android | 评论:0
| Trackbacks:0
| 阅读:845
Submitted by admin on 2011, July 19, 5:16 PM
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:其他分区
android | 评论:0
| Trackbacks:0
| 阅读:1042
Submitted by admin on 2011, July 19, 11:51 AM
本文只是叙述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就大功告成了。
-----------------------
android | 评论:0
| Trackbacks:0
| 阅读:966
Submitted by admin on 2011, July 19, 11:47 AM
原文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 | 评论:0
| Trackbacks:0
| 阅读:794
Submitted by admin on 2011, July 19, 11:43 AM
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全屏内容
转
android | 评论:0
| Trackbacks:0
| 阅读:788