Submitted by admin on 2011, July 14, 12:42 PM
经过这几天在网上搜索关于Android文件系统的相关资料,发现已经有很多高手分析了Android的文件系统,这些高手多从不同的方面分析了其文件系统的结构和运行原理。我这里就写一下自己的理解。
首先是Android的文件系统根目录的结构:
# pwd && ls -a -l
/
drwxrwxrwt root root 2009-06-10 09:53 sqlite_stmt_journals
drwxrwx--- system cache 2008-09-06 22:51 cache
d---rwxrwx system system 1970-01-01 08:00 sdcard
lrwxrwxrwx root root 2009-06-09 22:11 etc -> /system/etc
drwxr-xr-x root root 2008-09-06 22:45 system
drwxr-xr-x root root 1970-01-01 08:00 sys
drwxr-x--- root root 1970-01-01 08:00 sbin
-rw-r--r-- root root 117 1970-01-01 08:00 runme.sh
dr-xr-xr-x root root 1970-01-01 08:00 proc
-rwxr-x--- root root 1704 1970-01-01 08:00 init.trout.rc
-rwxr-x--- root root 9329 1970-01-01 08:00 init.rc
-rwxr-x--- root root 1677 1970-01-01 08:00 init.goldfish.rc
-rwxr-x--- root root 106636 1970-01-01 08:00 init
-rw-r--r-- root root 118 1970-01-01 08:00 default.prop
drwxrwx--x system system 2008-09-06 22:51 data
drwx------ root root 2009-06-07 16:29 root
drwxr-xr-x root root 2009-06-09 22:11 dev
sqlite_stmt_journals:一个根目录下的tmpfs文件系统,用于存放临时文件数据。
cache : 是缓存临时文件夹,据说是除了T-mobile的OTA更新外,别无用处。
sdcard:是SD卡中的FAT32文件系统挂载的目录
etc :指向 /system/etc ,众所周知的配置文件存放目录
system :是一个很重要的目录,系统中的大部分东西都在这里了,以下是目录结构:
# ls -a -l /system
drwxr-xr-x root 208 1970-01-01 08:00 xbin
drwxr-xr-x root root 1970-01-01 08:00 modules
drwxr-xr-x root root 2008-08-01 20:00 framework
drwxr-xr-x root root 2008-08-01 20:00 fonts
drwxr-xr-x root root 2008-08-01 20:00 etc
-rw-r--r-- root root 2197 2008-08-01 20:00 build.prop
drwxr-xr-x root root 2008-08-01 20:00 media
drwxr-xr-x root shell 2008-08-01 20:00 bin
drwxr-xr-x root root 2008-08-01 20:00 usr
drwxr-xr-x root root 2008-08-01 20:00 app
drwxr-xr-x root root 2008-09-06 22:45 lost+found
drwxr-xr-x root root 2008-08-01 20:00 lib
drwxr-xr-x root root 2008-08-01 20:00 sd
-rw-r--r-- root root 145 2008-08-01 20:00 init.rc
sys :用于挂载 sysfs文件系统。 在设备模型中,sysfs文件系统用来表示设备的结构.将设备的层次结构形象的反应到用户空间中.用户空间可以修改sysfs中的文件属性来修改设备的属性值
sbin: 只放了一个用于调试的adbd程序。
proc :/proc 文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用。
data :存放用户安装的软件以及各种数据。
root :什么都没有。
dev :不用多说了,设备节点文件的存放地。
下面介绍非目录的文件:
runme.sh用于 SD 卡中 EXT2文件系统的自动挂载动作的脚本。
init.trout.rc,init.rc,init.goldfish.rc 是初始化文件.
init是系统启动到文件系统的时候第一个运行的程序。
从以上的根目录分析来看,Android的根文件系统并非标准的Linux文件系统,所以以后还得仔细分析一下启动过程,才能认识Android系统。
/system目录是在Android文件系统占有及其重要的位置,基本上所有的工具和应用程序都在这个目录下,我看来是一个真正的rootfs。他在Android手机中存放在nand flash的mtd3中,是一个yaffs2文件系统,在启动时被挂载在root的/system目录下,其中包含有:
# pwd && ls -a -l
/system
drwxr-xr-x root 208 1970-01-01 08:00 xbin
drwxr-xr-x root root 1970-01-01 08:00 modules
drwxr-xr-x root root 2008-08-01 20:00 framework
drwxr-xr-x root root 2008-08-01 20:00 fonts
drwxr-xr-x root root 2008-08-01 20:00 etc
-rw-r--r-- root root 2197 2008-08-01 20:00 build.prop
drwxr-xr-x root root 2008-08-01 20:00 media
drwxr-xr-x root shell 2008-08-01 20:00 bin
drwxr-xr-x root root 2008-08-01 20:00 usr
drwxr-xr-x root root 2008-08-01 20:00 app
drwxr-xr-x root root 2008-09-06 22:45 lost+found
drwxr-xr-x root root 2008-08-01 20:00 lib
drwxr-xr-x root root 2008-08-01 20:00 sd
-rw-r--r-- root root 145 2008-08-01 20:00 init.rc
下面逐个分析其中的目录:
xbin :下放了很多系统管理工具,这些工具不是到toolbox的链接,每个都是可执行程序。如果你看到这些命令你会发现他们根本不常用,他们都是为系统管理员准备的,是一些系统管理和配置工具。这个文件夹的作用相当于标准Linux文件系统中的/sbin。我的手机此目录下有busybox,肯定是改过的,应该是破解者加上的。
modules:使用来存放内核模块(主要是fs和net)和模块配置文件的地方。
framework: 是JAVA平台的一些核心文件,属于JAVA平台系统框架文件。里面的文件都是.jar和.odex文件。
备注:什么是odex文件? odex是被优化过的JAVA程序文件,体积通常是.jar的4倍左右。执行效率比.jar高。
fonts :很显然,这是字体库文件的存放目录。
etc :这里存放了系统中几乎所有的配置文件,根目录下的/etc就链结于此。
build.prop :是一个属性文件,在Android系统中.prop文件很重要,记录了系统的设置和改变,类似于/etc中的文件。
media :里面主要是存放了系统的铃声的,分为 notifications(通知)、ui(界面)、alarms(警告)和ringtones(铃声),里面都是.ogg音频文件。
bin :众所周知,是存放用户常用的工具程序的,其中大部分是到toolbox的链接(类似嵌入式Linux中的busybox)。toolbox应该是google简化版的busybox,我还没深入研究过。
usr :用户的配置文件,如键盘布局、共享、时区文件等等。您可以cat 来看看。
app :顾名思义,存放的是Android系统自带的JAVA应用程序。
lost+found :yaffs文件系统固有的,类似回收站的文件夹,只有是yaffs文件系统都会有。
lib :存放几乎所有的共享库(.so)文件。
sd :SD卡中的EXT2分区的挂载目录
init.rc :一个初始化脚本,用于将/system/modules和/system/xbin挂载为cramfs,避免系统被无意破坏。
转
android | 评论:0
| Trackbacks:0
| 阅读:837
Submitted by admin on 2011, July 14, 12:02 PM
我们看没有编译前的项目目录大致的情况如下 :
在树结构中我们可以了解的有如下一些信息分析:
1. getSplashy 项目名称;
2. src 项目程式;
3. com 早期项目接口,这里我们需要删除;
4. com.haseman 早期项目接口,同上需要删除;
5. Android Library Android SDK包中的库集合;
6. assets 这个文件夹不常用,具体解释见下;
7. res 这里放置了项目的资源;
8. drawable 图片文件习惯放这里;
9. layout 存放的外观文件,以XML为主;
10. raw 自定义文件夹,存放音频文件;
11. values 存放string.xml;
12. AndroidManifest.xml 每个项目必备,存放项目描述;
Android 编译完成后,将在根目录中生成一个out文件夹,所有生成的内容均放置在这个文件夹中。
out文件夹如下所示:
out/
-- CaseCheck.txt
-- casecheck.txt
-- host //表示在主机(x86)生成的工具
-- common
-- linux-x86/darwin-x86
-- target(表示目标机,如果编译时候定义TARGET_STRIP_MODULE=false的话,这个目录为debug/target)
-- common
-- product
主要的两个目录为host和target,前者表示在主机(x86)生成的工具,后者表示目标机(默认为ARMv5)运行的内容。
host目录的结构如下所示:
out/host/
-- common
-- obj(JAVA库)
-- linux-x86/darwin-x86
-- bin(二进制程序)
-- framework(JAVA库,*.jar文件)
-- lib(共享库*.so)
-- obj(中间生成的目标文件)
host目录是一些在主机上用的工具,有一些是二进制程序,有一些是JAVA的程序。
target目录的结构如下所示:
out/target/
-- common //表示通用的内容
-- R (资源文件)
-- docs
-- obj (目标文件)
-- product //针对产品的内容
-- generic
其中common目录表示通用的内容,product中则是针对产品的内容。
在common目录的obj中,包含两个重要的目录:
out/target/obj/
--APPS (包含了JAVA应用程序生成的目标,每个应用程序对应其中一个子目录,将结合每个应用程序的原始文件生成Android 应用程序的APK包)
--JAVA_LIBRARIES (包含了JAVA的库,每个库对应其中一个子目录)
在默认的情况下,Android 编译将生成generic目录,如果选定产品还可以生成其他的目录(根据预先设定的产品名命名)。
generic包含了以下内容:
out/target/product/generic/
-- data (存放数据的文件系统)
-- obj(目录中包含了各种JAVA应用,与common/obj/APPS相对应,但是已经打成了APK包)
-- root
-- symbols
-- system(主要的文件系统)
-- Android -info.txt
-- clean_steps.mk
-- ramdisk.img
-- system.img
-- userdata.img
--userdata-qemu.img
obj/SHARED_LIBRARIES中存放所有动态库。
obj/STATIC_LIBRARIES中存放所有静态库。
几个以img为结尾的文件是几个目标映像文件,其中ramdisk是作为内存盘的根文件系统映像,system.img是主要文件系统的映像,这是一个比较大的文件,userdata.img是数据内容映像。userdata-qemu.img是模拟器使用的数据文件,一般不用userdata.img,只有-wipe-data时才用到userdata.img。这几个image文件是运行时真正需要的文件。
android | 评论:0
| Trackbacks:0
| 阅读:810
Submitted by admin on 2011, July 14, 12:01 PM
Google Android代码包(机器代码包),包括主机编译工具、仿真环境。今天我们向大家介绍Google Android源代码包目录结构,Android代码包经过解压缩后,第一级别的目录和文件如下所示:
.
|-- Makefile (全局的Makefile)
|-- bionic (Bionic含义为仿生,这里面是一些基础的库的源代码)
|-- bootloader (引导加载器)
|-- build (build目录中的内容不是目标所用的代码,而是编译和配置所需要的脚本和工具)
|-- dalvik (JAVA虚拟机)
|-- development (程序开发所需要的模板和工具)
|-- external (目标机器使用的一些库)
|-- frameworks (应用程序的框架层)
|-- hardware (与硬件相关的库)
|-- kernel (Linux2.6的源代码)
|-- packages (Android的各种应用程序)
|-- prebuilt (Android在各种平台下编译的预置脚本)
|-- recovery (与目标的恢复功能相关)
`-- system (Android的底层的一些库)
bionic目录展开一个级别的目录如下所示:
bionic/
|-- Android.mk
|-- libc
|-- libdl
|-- libm
|-- libstdc++
|-- libthread_db
`-- linker
bootloader目录展开的两个级别目录:
bootloader/
`-- legacy
|-- Android.mk
|-- README
|-- arch_armv6
|-- arch_msm7k
|-- fastboot_protocol.txt
|-- include
|-- libboot
|-- libc
|-- nandwrite
`-- usbloader
build目录展开的一个级别的目录如下所示:
build/
|-- buildspec.mk.default
|-- cleanspec.mk
|-- core (各种以mk为结尾的文件,它门是编译所需要的Makefile)
|-- envsetup.sh
|-- libs
|-- target (包含board和product两个目录,为目标所需要文件)
`-- tools (编译过程中主机所需要的工具,一些需要经过编译生成)
其中,core中的Makefile是整个Android编译所需要的真正的Makefile,它被顶层目录的Makefile引用。
envsetup.sh是一个在使用仿真器运行的时候,用于设置环境的脚本。
dalvik目录用于提供Android JAVA应用程序运行的基础————JAVA虚拟机。
development目录展开的一个级别的目录如下所示:
development
|-- apps (Android应用程序的模板)
|-- build (编译脚本模板)
|-- cmds
|-- data
|-- docs
|-- emulator (仿真相关)
|-- host (包含windows平台的一些工具)
|-- ide
|-- pdk
|-- samples (一些示例程序)
|-- simulator (大多是目标机器的一些工具)
`-- tools
在emulator目录中qemud是使用QEMU仿真时目标机器运行的后台程序,skins是仿真时手机的界面。
samples中包含了很多Android简单工程,这些工程为开发者学习开发Android程序提供了很大便利,可以作为模板使用。
external目录展开的一个级别的目录如下所示:
external/
|-- aes
|-- apache-http
|-- bluez
|-- clearsilver
|-- dbus
|-- dhcpcd
|-- dropbear
|-- elfcopy
|-- elfutils
|-- emma
|-- esd
|-- expat
|-- fdlibm
|-- freetype
|-- gdata
|-- giflib
|-- googleclient
|-- icu4c
|-- iptables
|-- jdiff
|-- jhead
|-- jpeg
|-- libffi
|-- libpcap
|-- libpng
|-- libxml2
|-- netcat
|-- netperf
|-- neven
|-- opencore
|-- openssl
|-- oprofile
|-- ping
|-- ppp
|-- protobuf
|-- qemu
|-- safe-iop
|-- skia
|-- sonivox
|-- sqlite
|-- srec
|-- strace
|-- tagsoup
|-- tcpdump
|-- tinyxml
|-- tremor
|-- webkit
|-- wpa_supplicant
|-- yaffs2
`-- zlib
在external中,每个目录表示Android目标系统中的一个模块,可能有一个或者若干个库构成。其中:
opencore为PV(PacketVideo),它是Android多媒体框架的核心。
webkit是Android网络浏览器的核心。
sqlite是Android数据库系统的核心。
openssl是Secure Socket Layer,一个网络协议层,用于为数据通讯提供安全支持。
frameworks目录展开的一个级别的目录如下所示:
frameworks/
|-- base
|-- opt
`-- policies
frameworks是Android应用程序的框架。
hardware是一些与硬件相关的库
kernel是Linux2.6的源代码
packages目录展开的两个级别的目录如下所示:
packages/
|-- apps
| |-- AlarmClock
| |-- Browser
| |-- Calculator
| |-- Calendar
| |-- Camera
| |-- Contacts
| |-- Email
| |-- GoogleSearch
| |-- HTMLViewer
| |-- IM
| |-- Launcher
| |-- Mms
| |-- Music
| |-- PackageInstaller
| |-- Phone
| |-- Settings
| |-- SoundRecorder
| |-- Stk
| |-- Sync
| |-- Updater
| `-- VoiceDialer
`-- providers
|-- CalendarProvider
|-- ContactsProvider
|-- DownloadProvider
|-- DrmProvider
|-- GoogleContactsProvider
|-- GoogleSubscribedFeedsProvider
|-- ImProvider
|-- MediaProvider
`-- TelephonyProvider
packages中包含两个目录,其中apps中是Android中的各种应用程序,providers是一些内容提供者(在Android中的一个数据源)。
packages中两个目录的内容大都是使用JAVA编写的程序,各个文件夹的层次结构是类似的。
prebuilt目录展开的一个级别的目录如下所示:
prebuilt/
|-- Android.mk
|-- android-arm
|-- common
|-- darwin-x86
|-- linux-x86
`-- windows
system目录展开的两个级别的目录如下所示:
system/
|-- bluetooth
| |-- bluedroid
| `-- brfpatch
|-- core
| |-- Android.mk
| |-- README
| |-- adb
| |-- cpio
| |-- debuggerd
| |-- fastboot
| |-- include (各个库接口的头文件)
| |-- init
| |-- libctest
| |-- libcutils
| |-- liblog
| |-- libmincrypt
| |-- libnetutils
| |-- libpixelflinger
| |-- libzipfile
| |-- logcat
| |-- logwrapper
| |-- mkbootimg
| |-- mountd
| |-- netcfg
| |-- rootdir
| |-- sh
| `-- toolbox
|-- extras
| |-- Android.mk
| |-- latencytop
| |-- libpagemap
| |-- librank
| |-- procmem
| |-- procrank
| |-- showmap
| |-- showslab
| |-- sound
| |-- su
| |-- tests
| `-- timeinfo
`-- wlan
`-- ti
android | 评论:0
| Trackbacks:0
| 阅读:841
Submitted by admin on 2011, July 13, 7:58 PM
make LDFLAGS="-all-static"
C语言 | 评论:0
| Trackbacks:0
| 阅读:860
Submitted by admin on 2011, July 13, 4:16 PM
应一个在电信做android开发的哥们要求,帮忙把Goole未在sdk中打包的API(即:mms彩信功能),打包到自己编译的sdk里面。偶用了差 不多5天+5夜的时间,虽然没有成功。但对于Ubuntu 10.04环境下载&编译Android-2.2.1 (froyo)源代码这个过程是相当熟悉啦,来来回回,在虚拟机里面做了5遍!其中的辛苦与开心只有自己才有深刻的体会。现在分享给大家,同时也感谢网络 上的筒子们。
1. 前言
本文叙述了如何从零开始搭建基于Google官方Android 2.2.1(froyo)源码的开发环境,包括如何下载源代码、编译源代码,以及在模拟器中运行编译生成的镜像。文中开发机是基于Ubuntu 10.04的,同样适用于其他版本的Ubuntu。现在需要弄清楚一下几点,防止后面出现误操作: 下载源代码是用参数:repo init -u git://android.git.kernel.org/platform/manifest.git -b froyo (下载的是2.2.1版本,编译环境操作系统必须是32位的,jdk1.5版本的—jdk1.5没有64位版本)。如果是没有带参数的下载源代码,将会下载所有的源代码,编译环境要求:操作系统64位,jdk1.6,(偶是2010年10月15日做)但很有可能会出现交叉编译工具错误:“ /bin/bash: prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-gcc: 没有那个文件或目录 ”(实际上是有arm-eabi-gcc这个文件的,偶怀疑是版本问题–32位的,而环境要求是64位的—– 下载全部代码)
2. 下载JDK 1.5 (不建议此下载方式,防止配置环境参数出错。建议用apt-get install方式,请跳转到:第4步)
编译Android源码需要JDK1.5版(主要是需要其中的javadoc),1.6版是 不兼容的。JDK1.5已经停止支持,其最 终的版本是JDK 5.0 Update 22。
可从Sun官网上下载:
http://java.sun.com/javase/downloads/5u22/jdk
选择平台Linux,勾选同意许可协议:
单击Continue,在弹出的页面中一共有两个下载,选第一个jdk-1_5_0_22-linux-i586.bin下载:
3. 部署JDK 1.5
3.1 解压缩JDK
以下命令均在root账户上执行,非root账户执行某些命令可能需要加sudo。
将jdk-1_5_0_22-linux-i586.bin放在root目 录下。进入该目录:
cd ~
然后赋予该bin文件可执行属性:
chmod +x jdk-1_5_0_22-linux-i586.bin
再执行安装(注意前面有./):
./jdk-1_5_0_22-linux-i586.bin
跳过协议阅读。
最后一行:
Do you agree to the above license terms? [yes or no]
键入yes,然后回车,开始解压。默认会解压到当前目录下的jdk1.5.0_22目录下(此处是~/ jdk1.5.0_22)。
3.2 JDK版本切换
如果同时需要使用JDK1.6版做应用开发,则系统中将同时存在JDK1.5和JDK1.6。 因此需要实现能够在不同版本间切换。如果不使用JDK1.6,请做完1.5版 的设置后跳至3.3节。
这里使用update-alternatives命令实现。
首先为JDK1.5版生成可选配置选项:
update-alternatives –install /usr/bin/jdk jdk /root/jdk1.5.22 255
(sudo update-alternatives –install /usr/bin/jdk jdk /home/ynb/jdk1.5.0_22 255)
/usr/bin/jdk是符号链接,它指 向/etc/alternatives/jdk(由第2个参数 给出的),/root/jdk1.5.22(/home/ynb/jdk1.5.0_22)是 实际目的链接,255是优先级(任意整数, 在automatic mode自动模式 时,数字大的优先级较高,被选为默认配置选项)。
然后再为JDK1.6版生成(如果有JDK1.6的话。不使用JDK1.6的请跳至3.3节):
update-alternatives –install /usr/bin/jdk jdk /root/jdk1.6.20 0
这样,默认jdk版本即为1.5版。 需要切换到1.6版时,请使用update-alternatives –config jdk
3.3 配置JDK环境变量
下面开始配置环境变量。
在终端中执行:sudo gedit ~/.bashrc
修改.bashrc文件,添加下面语句:
#set java environment
export JAVA_HOME=/usr/bin/jdk
export JRE_HOME=JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
该段代码最好设置在文件的尾部。
保存文件。在终端中执行source ~/.bashrc
重启系统请使用java –version检查JDK是否 配置正确。
4.用apt-get install方式安装JDK1.5:
Android 要求的 jdk 1.5,而Ubuntu10.4的源里只有JDK1.6. 如果安装了jdk1.6请先卸载:
$sudo apt-get remove remove openjdk-6-jdk
$sudo apt-get remove remove openjdk-6-jre
$sudo apt-get remove remove openjdk-6-jre-headless
安装jdk1.5目前网上解决方法有两种:
解决方法一(建议): 安装JDK1.5
1) 根据官方文档里所说,源代码的编译必须使用JDK5才能编译的了,所以这里偶使用jdk5
2) 需要先更新源,在终端里执行 sudo vim /etc/apt/sources.list
3) 在source.list里把以下2行拷贝到文档最后面:
deb http://us.archive.ubuntu.com/ubuntu/ jaunty multiverse
deb-src http://us.archive.ubuntu.com/ubuntu/ jaunty multiverse
deb http://us.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse
deb-src http://us.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse
保存退出。
4) 执行 sudo apt-get update 更新源.
5) 配置编译环境并下载JDK5:sudo apt-get install sun-java5-jdk
解决方法二: 安装JDK 1.6 , 修改Android源文件。
1) 安装jdk 1.6,修改<src_top/build/core/make.mk>(如果2.0版本源码请修改<src_top/build/core/main.mk>)
在文件中搜索并分别把:
java_version := $(shell java -version 2>&1 | head -n 1 | grep ‘[ "]1.5[. "$$]‘)
javac_version := $(shell javac -version 2>&1 | head -n 1 | grep ‘[ "]1.5[. "$$]‘)
两行改成:
java_version := $(shell java -version 2>&1 | head -n 1 | grep ‘[ "]1.6[. "$$]‘)
javac_version := $(shell javac -version 2>&1 | head -n 1 | grep ‘[ "]1.6[. "$$]‘)
即可。
推荐使用第一种解决方法。
5. 安装其他必备组件
在终端上,使用下面的命令安装:(前面的1、2、3步骤都可以省略啦)
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
因为JDK1.5在前面已经单独安装过了,因此此处apt-get install命令行中没有加入sun-java5-jdk。
6. 下载Android 源代码
6.1 安装repo脚本
首先安装repo。在当前用户:~目 录下新建一个bin目录。在终端中执行:
cd ~
mkdir bin
然后,向PATH中添加bin路 径:
export PATH=$PATH:~/bin
然后执行下面两行指令,下载repo脚本并修改可执行属性:
curl https://android.git.kernel.org/repo >~/bin/repo
chmod a+x ~/bin/repo
6.2 初始化repo
首先建立一个目录用来存放Android源代码:
mkdir mydroid
cd mydroid
然后用最新的列表执行初始化。这里偶下载android 2.2.1(froyo),因此加了参数 –b froyo:(android 2.2.2(froyo)源码下载:2G多
repo init -u git://android.git.kernel.org/platform/manifest.git -b froyo )
(下载2.1_r2源码
repo init -u git://android.git.kernel.org/platform/manifest.git –b android-2.1_r2
下载全部源码:repo init -u git://android.git.kernel.org/platform/manifest.git)
(下载2.0源码:
repo init -u git://android.git.kernel.org/platform/manifest.git –b eclair )
(上面下载2.0时有个莫名其妙的问题:
ynb@ynb-pc:~/bin$ repo init -u git://android.git.kernel.org/platform/manifest.git –b eclair
Usage: repo init -u url [options]
出现上面问题,删除mydroid目录:rmdir mydroid ; mkdir mydroid2.0 ; cd mydroid2.0;
再:repo init -u git://android.git.kernel.org/platform/manifest.git -b eclair 就可以了)
(如果能通过浏览器浏览到android源码的主页,但运行repo init或repo sync的时候,却没法下载源码,形如:
只需要把git开头的地址改为http即可:
[1]
repo init -u http://android.git.kernel.org/platform/manifest.git -b froyo
[2]修改manifest.git里的地址,也是把git://改为http://
vim .repo/manifest.git
如:
<?xml version=”1.0″ encoding=”UTF-8″?>
<manifest>
<remote name=”korg”
fetch=”http://android.git.kernel.org/”
review=”review.source.android.com” />
<default revision=”froyo”
remote=”korg” /> )
这中间会问到你的名字和Email。如果你打算上传代码,Email须是一个Google账户。
repo初始化成功后会看到类似于下面的提 示:
repo initialized in /home/(当前用户名)/mydroid
最后执行$repo sync开始同步代码。过程比较漫长,下载速度取决于你的网速(偶的3-4小时左右),中间有可能遇到断线,重新执行repo sync即可断点续传。
7. 编译Android源代码
7.1 编译生成镜像
$ cd ~/directory
$ source build/envsetup.sh
$ lunch # select 1- generic-eng when the menu popup
$ make -j4 # 4 means the number of concurrent jobs the build can do. This is to speed up the building process
首次编译非常耗时,取决于机器配置,大约需要2-3小时。有可能会出现:“Permission denied (权限拒绝的提示)” 请命令赋予权限:$cd 无权限文件的当前目录 回车; $sudo chmod -R +rwx * 回车; 完成后镜像生成在/root/mydroid/out/target/product/generic下:android源码编译后得到system.img,ramdisk.img,userdata.img映像文件。其中, ramdisk.img是emulator的文件系统,system.img包括了主要的包、库等文件,userdata.img包括了一些用户数据,emulator加载这3个映像文件后,会把 system和 userdata分别加载到 ramdisk文件系统中的system和 userdata目录下。
7.2 编译、配置Android SDK
$sudo make sdk
生成对应于该版本源代码的sdk,此过程用的时间偶的是10多分钟。
$sudo make PRODUCT-sdk-sdk
生成对应于该版本源代码的用于生产环境的sdk,此过程用的时间偶的是1个多小时。
自己编译的SDK位置是:~/mydroid/out/host/linux-x86/sdk/android-sdk_eng.root_linux-x86。
8. 在模拟器中运行编译的镜像
打开终端,执行android脚本:
$android
出现下图所示窗口:
选择左边第一项Virtual Devices,然后在右边选择New,新建一个AVD。
Name:AVD的名称,随便取,但只能包含字母和数字以及点、下划线和连字符, 这里取名test。
Traget:目标SDK版本,这里选自己编译的2.1-r1版Android SDK。
SD Card:SD卡。暂且不填,待需要时再设置。
Skin:皮肤(模拟器屏幕分辨率)。
Hardware:使用默认即可
然后点Create AVD,就创建好了一个AVD。点击Start即 可启动模拟器,其运行的是自己编译的镜像。
若以后要再次启动此AVD,请在终端中运行:
emulator –avd test 或 者emulator @test
android | 评论:0
| Trackbacks:0
| 阅读:799
Submitted by admin on 2011, July 13, 2:58 PM
【操作命令】
1. 查看设备
adb devices
这个命令是查看当前连接的设备, 连接到计算机的android设备或者模拟器将会列出显示
2.安装软件
adb install
adb install <apk文件路径> :这个命令将指定的apk文件安装到设备上
3. 卸载软件
adb uninstall <软件名>
adb uninstall -k <软件名>
如果加 -k 参数,为卸载软件但是保留配置和缓存文件.
4. 进入设备或模拟器的shell:
adb shell
通过上面的命令,就可以进入设备或模拟器的shell环境中,在这个Linux Shell中,你可以执行各种Linux的命令,另外如果只想执行一条shell命令,可以采用以下的方式:
adb shell [command]
如:adb shell dmesg会打印出内核的调试信息。
5. 发布端口
可以设置任意的端口号,做为主机向模拟器或设备的请求端口。如:
adb forward tcp:5555 tcp:8000
6. 从电脑上发送文件到设备
adb push <本地路径> <远程路径>
用push命令可以把本机电脑上的文件或者文件夹复制到设备(手机)
7. 从设备上下载文件到电脑
adb pull <远程路径> <本地路径>
用pull命令可以把设备(手机)上的文件或者文件夹复制到本机电脑
8、查看bug报告
adb bugreport
9、记录无线通讯日志
一般来说,无线通讯的日志非常多,在运行时没必要去记录,但我们还是可以通过命令,设置记录:
adb shell
logcat -b radio
10、获取设备的ID和序列号
adb get-product
adb get-serialno
adb shell
sqlite3
android | 评论:0
| Trackbacks:0
| 阅读:802
Submitted by admin on 2011, July 13, 11:59 AM
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 | 评论:0
| Trackbacks:0
| 阅读:863
Submitted by admin on 2011, July 13, 11:32 AM
说明:NewNetClient是源码目录名称,
当前环境变量设置:jdk,android sdk ,openssl的环境变量。
所需包文件:android.jar,signapk.jar.
C:/apk/hello/gen/android/hello
javac c:/apk/hello/*.java -classpath c:/testapk/android.jar -d c:/apk/classes
@rem主要是重新自动生成R.java文件,比如增加个图片或者字符串或者增加个layout目录xml文件
C:/Users/dell>aapt package -m -J c:/apk/NewNetClient/gen -M c:/apk/NewNetClient/AndroidManifest.xml -S C:/apk/NewNetClient/res -I C:/apk/android.jar
@rem 主要是重新自动生成R.java文件,比如增加个图片或者字符串或者增加个layout目录xml文件
aapt package -m -J src -M C:/apk/NewNetClient/AndroidManifest.xml -S C:/apk/NewNetClient/res -I C:/apk/android.jar
@rem 编译java文件包括R.java 并输出到c:/apk/classes
C:/Users/dell>javac C:/apk/hello/src/android/hello/*.java C:/apk/hello/gen/andro
id/hello/*.java -classpath C:/testapk/android.jar -d c:/apk/classes
@rem 把目录下*.class文件打成jar包,为了后面能够创建apk需要的classes.dex文件(生成的文件在当前目录 *。* 是相对路径)
c:/apk/classes>jar cvf ffff.jar *.*
@rem 把刚才的jar包转换成android手机能够运行的dex文件
c:/apk/classes>dx --dex --output=classes.dex c:/apk/classes/ffff.jar
@rem 如果存在则删除
IF EXIST fffnew3.apk. (
del fffnew3.apk.
echo message ab
) ELSE (
echo fffnew3.apk. missing.
echo message ab c
)
@rem 生成应用程序apk文件ffffqc.apk
c:/apk/classes>aapt package -z -u -f -M C:/apk/hello/AndroidManifest.xml -S C:/apk/hello/res -I C:/testapk/android.jar -F c:/ffffqc.apk
@rem 把前面生成的classes.dex文件压缩到apk文件,最终生成可运行的apk应用程序
c:/apk/classes>aapt add C:/ffffqc.apk classes.dex
@rem 方法一:给生成的apk进行自动签名,无签名的apk是无法安装
c:/testapk>java -jar signapk.jar aimoxiu.x509.pem aimoxiu.pk8 c:/apk/classes/fffnew3.apk fffnew3last.apk
"C:/Program Files/Java/jre6/bin/jarsigner" -verbose -keystore "D:/apksign/MyAnd.keystore" -signedjar %1 %2 "D:/apksign/MyAnd.keystore"
@rem 私钥的生成方式
@rem 产生RSA私钥(private key)
openssl genrsa -3 -out testkey.pem 2048
@rem 产生PKCS#10格式的认证请求。所谓认证请求就是发给认证机构认证的一个请求,它主要包括一个公钥和一些相关信息(如组织名称和联系人邮件地址)。
openssl req -new -x509 -key testkey.pem -out testkey.x509.pem -days 10000 / -subj ‘/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com’
@rem 把私钥的格式转换成PKCS #8(Private-Key Information Syntax Standard.)
openssl pkcs8 -in testkey.pem -topk8 -outform DER -out testkey.pk8 -nocrypt
它的用法如下:
Usage: signapk publickey.x509[.pem] privatekey.pk8 input.jar output.jar
第一个参数是公钥,即前面第二步产生的testkey.x509.pem。
第二个参数是私钥,即前面第三步产生的testkey.pk8。
第三个参数是要签名的文件。
第四个参数是输出的文件(即签名后的文件)。
如:java -jar signapk.jar testkey.x509.pem testkey.pk8 update.zip update-signed.zip
@rem 方法二:keytool生成MyAndf.keystore签名 jarsigner生成签名的apk文件
keytool -genkey -alias MyAndf.keystore -keyalg RSA -validity 20000 -keystore MyAndf.keystore
jarsigner -verbose -keystore MyAndf.keystore -signedjar fffnew3last.apk fffnew3.apk MyAndf.keystore(密码123456 1234567)
开始打包:
javac C:/Users/dell>javac C:/apk/NewNetClient/gen/com/palmdream/NewNetClient/*.java C:/apk/NewNetClient/src/com/palmdream/Core/*.java C:/apk/NewNetClient/src/com/palmdream/ListHolder/*.java C:/apk/NewNetClient/src/com/palmdream/NetEngine/*.java C:/apk/NewNetClient/src/com/palmdream/NewNetClient/*.java C:/apk/NewNetClient/src/com/palmdream/XMLData/*.java C:/apk/NewNetClient/src/org/kxml2/io/*.java C:/apk/NewNetClient/src/org/xmlpull/v1/*.java -classpath c:/apk/android.jar -d c:/apk/classes
echo javac is ok
c:/apk/classes>jar cvf fffnew3.jar com/*.* org/*.*
echo jar cvf is ok
c:/apk/classes>dx --dex --output=c:/apk/classes/classes.dex c:/apk/classes/fffnew3.jar
echo dx --dex ok
c:/apk/classes>aapt package -z -u -f -M C:/apk/NewNetClient/AndroidManifest.xml -S C:/apk/NewNetClient/res -I C:/apk/android.jar -F c:/fffnew3.apk
echo aapt package ok
c:/apk/classes>aapt add C:/fffnew3.apk classes.dex
echo aapt add ok
c:/testapk>java -jar signapk.jar aimoxiu.x509.pem aimoxiu.pk8 fffnew3.apk fffnew3last.apk
echo java last ok
完成
@rem 多线程控制 启动 停止 暂停 启动新的线程 以及联网时header的传递。
@rem 基于android 代码保护
加注释
android | 评论:0
| Trackbacks:0
| 阅读:1409