posts - 33, comments - 0, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

  google的android很多人都希望在gphone没有出来之前,把它移植到相关的硬件平台上去。网上看了不少文章,总的感觉是:在这一步走得最远的就是openmoko的一个大师级别的黑客Ben “Benno” Leslie,他曾经试图把目前google发布的android移植到openmoko的平台上去,并且做了10000多行代码的尝试。最终虽然由于 open moko采用比较老的arm 920t的内核,而android采用较新的arm926-ej-s内核,而且使用了新的内核的一些新特性,导致移植失败,但是anyway,他已经做了足够多的前期工作了,尔后的宣布成功移植android到real target板子上的人,大多是在他提供的patch的基础上继续走下去做出来的。

下面是一些有用的参考,希望有助于对此感兴趣的开发人员:
(1)Ben “Benno” Leslie的关于andorid移植到openmoko的个人博客地址:
http://benno.id.au/blog/

(2)早期宣布成功移植android到zauraus-sl-c760的详细方法描述的链接:
http://euedge.com/blog/2007/12/06/google-android-runs-on-sharp-zaurus-sl-c760/

(3)后续的根据上述先行者们的工作,成功移植android到zauraus-c3000的方法:
http://androidzaurus.seesaa.net/article/74237419.html

(4)本文是参考下面的wiki,接合个人的实践写出来的,对原文的作者表示一下感谢:
http://wiki.droiddocs.net/Compilation_of_Android_kernel

  很羡慕这些人阿!

  不过很可惜,偶的开发板是s3c2410的,恰好是arm920t的核心的。。。估计移植上去戏不是很大,需要重写很多代码,毕竟偶跟benno相差得太远太远了,同样是开发人员,差距咋就那么大呢?!(毕竟google仅仅开放了kernel的源代码而已,他们需要开放的东西还很多。)

  在这里把关于android内核编译方法简单写一下,或许对希望移植内核的朋友能有些帮助:
(看了Benno的移植过程以后,觉得即使你能够编译google开放出来的内核,意义也不是特别大,因为这个内核中加入了为了支持qemu的很多东西,而这些代码似乎对希望移植到真机上的朋友来说,没有任何意义,反而是一种阻碍)。

  1)从CodeSourcery上面载用于交叉编译的工具链:http://www.codesourcery.com/gnu_toolchains/arm/download.html
我在这里选择的是->ARM GNU/Linux,以及IA32-GNU/Linux。有文章说应该选择ARM EABI,我不知道了,没有测试过,反正我选择的这个编译的内核也是可以跑起来的:P

  2)下载google的android linux的内核源代码:http://code.google.com/p/android/downloads/list
主要是这个文件:linux-2.6.23-android-m3-rc20.tar.gz

  3)把下载到的内核和交叉编译工具解压缩,并最好把工具链的路径放到PATH里面去
解压缩内核:
 $ mkdir -p android
 $ cd android
 $ tar xzvf ../linux-2.6.23-android-m3-rc20.tar.gz
 会解压出来一个叫做kernel的目录,google的android的linux内核就在里面了。

解压缩交叉编译工具链:
 $ cd /usr/local/
 $ sudo cp ~/arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 .
 $ sudo tar zxvf arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
此时会解压出来一个叫做arm2007q3的一个目录,这里面就是工具链了。

设置一下环境变量:
 $ export PATH=$PATH:/usr/local/arm2007q3/bin
好了,到此,基本的内核编译环境就搞好了。

  4)现在是要得到android的内核编译参数的配置文件的时候了,该文件需要从已经安装好的android的模拟器
中得到才行。所以安装android的sdk也是必须的,这一步不太明白的朋友可以参考我以前发的android
命令行体验的文章。
首先启动android模拟器,然后通过adb得到模拟器中提供的内核配置文件:
 $emulator &
 $adb pull /proc/config.gz .
这时候adb工具会连接模拟器,并从它里面下载一个叫做config.gz的文件到你的当前目录下。
把它拷贝到你的kernel目录:
 $cd ~/android/kernel
 $cp ~/config.gz .
解压缩该文件,并重命名为.config,这一步做了就可以跳过make menuconfig之类的内核参数设置
动作了。
 $gunzip config.gz
 $mv config .config

  5)修改kernel目录中的Makefile文件,用emacs或vi打开该Makefile

修改CROSS_COMPILE变量为:
CROSS_COMPILE=arm-none-linux-gnueabi-
这个就是刚刚的下载和解压的工具链的前缀了,旨在告诉make,在编译的时候要使用我们的工具链。

在Makefile中注释掉LDFLAGS_BUILD_ID这个变量:
例如将如下定义:
LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\
                  $(call ld-option, -Wl$(comma)--build-id,))
修改为:
LDFLAGS_BUILD_ID=
#LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\
#                  $(call ld-option, -Wl$(comma)--build-id,))
把它注释掉的原因是目前android的内核还不支持这个选项。--build-id选项,主要是用于在生成的elf
可执行文件中加入一个内置的id,这样在core dump,或者debuginfo的时候就可以很快定位这个模块是
哪次build的时候弄出来的。这样就可以避免,每次都把整个文件做一遍效验,然后才能得到该文件的是由
哪次build产生的。对于内核开发者来说,这是很不错的想法,可以节约定位模块版本和其影响的时间。
目前,该功能还出于early stage的状态,未来的android或许会支持,但至少目前的版本是不支持的。
所以,用#注释掉即可,或者害怕不保险的话,就加入LDFLAGS_BUILD_ID=空,这样即使编译的时候用了,
也只是一个空格而已。
对这个--build-id选项感兴趣的朋友,可以访问下面的网址,它的作者已经解释得非常明白了:
http://fedoraproject.org/wiki/Releases/FeatureBuildId

  6)终于可以开始make了。
 $ make
不出意外的话,应该整个过程都会非常顺利,最终会在~/android/kernel/arch/arm/boot目录下面
生成一个zImage,这个就是我们要的内核映像了。

  7)激动人心的时刻终于到来了,我们可以测试一下刚刚编译出来的内核可以不可以用了。
 $emulator -kernel ~/android/kernel/arch/arm/boot/zImage
当看到red eye在晃来晃去,最终显示出来android的界面的时候,一颗悬着的心总算放下了。

android的proc里面的version如下:
# cat version
Linux version 2.6.23 (wayne@wayne) (gcc version 4.2.1 (CodeSourcery Sourcery G++ Lite 2007q3-51)) #1 Sat Jan 19 18:11:44 HKT 2008
从这里就可以看出,这是自己编译的kernel,而不是人家sdk里面自带的kernel-qemu了。

android自带的sdk里面的kernel映像的version应该是:
# cat version
Linux version 2.6.23-gcc3bc3b4 (arve@arvelnx.corp.google.com) (gcc version 4.2.1) #3 Tue Oct 30 16:28:18 PDT 2007
hoho, 这里不会把这个开发者的email暴露出来了吧。。。

android的cpuinfo如下:
Processor       : ARM926EJ-S rev 5 (v5l)
BogoMIPS        : 313.75
Features        : swp half thumb fastmult vfp edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant     : 0x0
CPU part        : 0x926
CPU revision    : 5
Cache type      : write-through
Cache clean     : not required
Cache lockdown  : not supported
Cache format    : Harvard
I size          : 4096
I assoc         : 4
I line length   : 32
I sets          : 32
D size          : 65536
D assoc         : 4
D line length   : 32
D sets          : 512

Hardware        : Goldfish
Revision        : 0000
Serial          : 0000000000000000
不过挺奇怪的,google sdk自带的内核映像的BogoMIPS是3.18的,偶编译出来的是3.13的。

posted @ 2011-08-31 09:25 马航 阅读(462) | 评论 (0)编辑 收藏

环境:

   windows xp+vmware+redhat(ubuntu)

   说明:本篇所述环境也是Android原生(Native)C(JNI)开发的环境

1,先下载个交叉编译工具链版本

  http://www.codesourcery.com/sgpp/lite/arm/portal/subscription3057 选择最新版本进入下载页面后,选择Advanced Packages的IA32 GNU/Linux TAR下载后文件名为arm-2010.09-50-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

2,上传到/usr/local/后解压tar jxvf arm-2010.09-50-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 到一个arm-2010.09

3,测试,进入到/usr/local/arm-2010.09/bin目录下,创建一个main.c文件,

main.c内容

#include <stdio.h>

int main()

{

  int i=0;

  printf("%d\n",i);

  return;

}

执行./arm-none-linux-gnueabi-gcc main.c 

无报错,生成a.out文件

执行 ./arm-none-linux-gnueabi-gcc -v

显示版本信息 4.5.1 

可以啦

修改/etc/profile文件的PATH,将当前目录/usr/local/arm-2010.09-50/bin加入到PATH里去

source /boot/.bashrc 使修改立即生效

实例测试:

进入工作目录 /home/android/jniTest

创建文件main.c,文件内容

#include <stdio.h>
int main()
{
  int i=0;
  printf("hi ym012 %d\n",i);
  return;
}

arm-none-linux-gnueabi-gcc -static main.c -o main
启动Android模拟器,先创建 /dev/sample目录,再将编译好的main上传上去,最后将main改成可执行的。其命令如下

adb shell mkdir /dev/sample                        //在模拟器下创建一个目录
adb push main /dev/sample/main                //将main文件上传到/dev/sample/main

adb shell chmod 777 /dev/sample/main      //修改成可执行文件

 再进入命令行模式,进入Android的模拟器的/dev/sample目录执行hello:

adb shell

#cd /dev/sample

#./hello                          //执行hello

运行结果如下:

hi ym012 0
_______________

总结:成功了!

posted @ 2011-08-31 09:14 马航 阅读(569) | 评论 (0)编辑 收藏

    最近不单只是看android开发与测试相关知识,也在了解这之外相关的信息.毕竟,自己的眼界不能太狭窄.今天我在逛一个android论坛上时候看到一个很老的帖子,转了个关于android被从linux分支树上移除的新闻.
    以为是假新闻来着,后面上网找了找,还真是搜索出一堆结果,发现有些比较大的IT网站上也有.看样子是假不了了.
    原文上说是linux内核开发者Greg Kroah-Hartman认为android"no one seemed to be working on it"
    想着android系统实际上使用了linux内核,而linux讲究的是开源,android虽然开源,确实商用的.中间可能有冲突的地方.难道是其中某些冲突引起了这样的结果?
    最后在维基百科上android词条(http://zh.wikipedia.org/wiki/Android)页面的结尾部分找到了这么一段:
    "
    Android是执行于Linux kernel之上,但并不是GNU/Linux。因为在一般GNU/Linux里支持的功能,Android大都没有支持,包括Cairo、X11、 Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。Android又以bionic取代Glibc、以Skia取代Cairo、再 以opencore取代FFmpeg等等。Android为了达到商业应用,必须移除被GNU GPL授权证所约束的部份,例如Android将驱动程序移到userspace,使得Linux driver与Linux kernel彻底分开。bionic/libc/kernel/ 并非标准的kernel header files。Android的kernel header是利用工具由Linux kernel header所产生的,这样做是为了保留常数、资料结构与宏。
    "
    可见,从最直观上来看,android将linux内核拿过来之后去掉了不少功能,然后通过一些手段绕开了GPL授权.它的linux内核已经和GNU Linux相差的太大了.然而,更具体的情况是什么样的呢?即android被移出linux分支树的更具体的说明.

    终于找到了,摘抄在后面(摘自:http://www.ej38.com/showinfo/linux-199996.html)
-----------------------------------------------------------------------------------------------------------------------------------------------------
    Greg Kroah-Hartman写了一篇详细的文章,解释这个决定。下面就来看看,他是怎么说的,以及Android到底是一个什么样的系统。
    在这之前,你最好知道Greg Kroah-Hartman是谁。他是目前LinuxKernel的核心开发人员,负责stable软件包的发布。就是说,每一个新版本的 LinuxKernel,都是经过他的手流出来的。此外,他还负责硬件驱动的部署。而他的手机就是HTCG1,每天都在使用。所以,他是绝对有资格谈论这 个问题的,他的看法代表了Linux社区对Android的看法。
    首先,他指出Android和其他的Linux发行版不一样:
“Google has taken the Linux kernel, and nothing else from a "traditional" Linux system. Google只用了kernel,别的东西都没用。”
    这就是说,与Ubuntu、Debian、Redhat这样的传统Linux发行版相比,只有系统的底层结构是一样的,其他东西在Android里都不一 样,尤其是程序员的编程接口是完全不同的。因此,Android应用程序都必须重新写过,现存的Linux程序无法移植上去。所以,从严格意义上 说,Android是一种全新的系统,它与Linux的距离,比Mac OS与Linux的距离还要远。
    然后,Greg Kroah-Hartman肯定了Android这样做的积极意义:
“Android also solves the problem that the phone manufacturers hadbeen having for many years: a free version of Java and a unifiedapplication layer that programmers can write to that will work on allphone platforms that integrate it.
它解决了长期令手机制造商头痛不已的问题:业界缺乏一个开源的Java虚拟机,以及统一的应用程序接口。现在,程序员只要写一次程序,就能在各种手机硬件平台之上使用。”
    这段话解释了,为什么Android的应用程序,都必须用Java语言开发。因为不这样做的话,没法让程序做到硬件无关。且慢,这真的是理由吗?传统的 Linux系统,也并不依赖特定的硬件啊!只要把源代码根据不同的平台,分别编译一下,同一个程序不也照样可以在不同的硬件架构、不同的Linux发行版 中使用吗?那么,Android只采用kernel、只允许用java编程的真正原因,到底是什么?
    台湾的科技网志MMDays一语道破真相:“Linux kernel 的版权是 GPL。这下问题来了:如果你是硬件厂商,希望你的硬件能在 Linux kernel 下运作,那么就必须要有驱动程序。如果驱动程序的程序代码公开,等于硬件规格也公开的差不多了。许多厂商不愿意这么做,所以就提供编好的驱动程序,但不提 供原始码。Android 的重点就是商业应用,Google采用了一些手法来绕过这问题。他们把驱动程序移到"userspace",也就是说,把驱动程序变成在 Linux kernel 上头跑,而不是一起跑的东西,这样就可以避过GPL。然后,在kernel 这边开个小门,让本来不能直接控制到硬件的 "userspace" 程序也可以碰得到,这样只要把"开个小门"的程序代码公布就行啦。”看明白了吗?
    这段话的意思是说,Google玩了一个花招,在kernel和应用程序之间,自己做了一个中间层,这样就既不违反GPL许可,又能不让外界看到厂商的硬件驱动和应用程序的源码。
    里面的关键在于,Kernel和Android的许可证不一样,前者是GPL许可证,后者是Apache SoftwareLicense(简称ASL)许可证。GPL许可证规定,对源码的任何修改都必须开源,所以Android开源了,因为它修改了 Kernel。而ASL许可证规定,可以随意使用源码,不必开源,所以建筑在Android之上的硬件驱动和应用程序,都可以保持封闭。为了得到更多厂商 的支持,Google有意选择了这样做,并且特意修改Kernel,使得原本应该包括在kernel中的某些功能,都被转移到了userspace之中, 因此得以避开开源。
    这样做或许有利于推广Android,吸引厂商和软件开发商的加入,但是Google也放弃了构建一个真正开源的手机系统的机会,从而也就不能获得由全世 界程序员提供智慧、分享代码、推动创新的好处。关于许可证问题的深入讨论,请阅读Ryan Paul的文章《Why Google chose the Apache Software License over GPLv2 for Android》。
    Google的这种做法,直接后果就是给Linux Kernel带来了麻烦。Greg Kroah-Hartman清楚地说出了自己的不满。
“...any drivers written for Android hardware platforms, can not getmerged into the main kernel tree because they have dependencies on codethat only lives in Google's kernel tree, causing it to fail to build inthe kernel.orgtree.所有为Android写的硬件驱动,都不能合并入kernel。因为它们只在Google的代码里有效,在kernel里 根本没法用。
    Because of this, Google has now prevented a large chunk of hardwaredrivers and platform code from ever getting merged into the main kerneltree. Effectively creating a kernel branch that a number of differentvendors are now relying on.由于这个原因,Google也从不把大量的硬件驱动程序和平台源码向kernel提交。实际上,它创造出了一个kernel的分支,大量的开发者都 依赖那个分支。”
    这就是Android干的事情:它修改了Kernel,但是又不提供修改的细节,自己搞了一个封闭的系统。说得难听一点,它利用了开源社区,要求开源社区为它做贡献,却又不愿提供回报。
    所以,Linux Kernel就把Android踢出去了,真是再正常不过了。
    人们有权利质疑,Android这样的哲学是否正确?是否符合Google“不作恶”的口号?如果Android继续这样封闭下去,那么开源社区为什么要 为它免费制作软件呢?因为我又不是在为开源社区服务,而是在为Google服务。既然这样的话,那还不如去支持iPhone呢,至少能在软件商店里多卖一 点钱,而且乔布斯看上去也更酷一点。slashdot上有很多关于此事的讨论。有人指出:“Google自己的网站,与微软的网站一样封闭。它开源出来的 东西,都是根据GPL许可证不得不开源的。”
    好吧,姑且不谈Google本身,因为它至少不要求外界提供支持。但是Android不一样,你不能假装成开源系统,骗取社区的支持,然后又干着封闭系统的勾当。
    Google必须做出选择。正如Greg Kroah-Hartman最后的呼吁:
    “I really don't know. Google shows no sign of working to get their code upstream anymore.
我真的不知道未来。Google看上去没有任何改变代码的迹象。
    I do hold out hope that Google does come around and works to fixtheir codebase to get it merged upstream to stop the huge blockage thatthey have now caused in a large number of embedded Linux hardwarecompanies. 我确实希望Google做出改变,把它的代码合并进我们的代码,弥补已经出现的代码分裂。
    I've privately offered in the past to help this work get done, andam doing again here publicly. But I need the help of the Googledevelopers to make it happen, without them, nothing can change. 我私底下已经说过,我愿意帮助完成这项工作,在这里我再次公开这样说。但是如果没有Google程序员的加入,什么也不会发生。”

posted @ 2011-08-29 13:39 马航 阅读(287) | 评论 (0)编辑 收藏

细心的网友可能发现Android的 ROM中有很多odex文件,相对于APK中的dex文件而言这个odex有什么作用呢? Android123提示大家,如果你仔细观察会发现文件名时一一对应的,同时那些对应的apk文件中没有dex文件。这样做可以使其厂商保证一定的反盗 版,因为没有没有dex文件的apk是无法正常安装的,而厂商直接将odex和不完整的apk文件放到手机rom固化到/system/bin中可以让一般用户无法正常导出使用。

  很多网友可能想到的是合并odex和apk变成apk中包含dex文件的,这样合并后最终apk文件安装在/data/中,而rom存放时在 /system/bin中,所以最终导致了用户可装在Android手机中的软件会变少,占用系统空间。

  一、APK生成odex文件方法:

  编译开源GIT上的build/tools/dexpreopt/dexopt-wrapper这个,使用dexopt-wrapper即可,操作步骤

  将dexopt-wrapper放到/data/local目录中,使用adb shell执行linux命令行,使用cd命令进入/data/local目录,

  cd /data/local

  ./dexopt-wrapper android123.apk android123.odex

二、合并odex和 少dex的apk 为完整的apk文件

  1. 下载 http://smali.googlecode.com/files/smali-1.2.2.jarhttp://smali.googlecode.com/files/baksmali-1.2.2.jar,既然是需要盗版,还需要odex所在rom中的一些引用类,一般在 /system/framework 目录中

  2 .  通过odex生成class文件

          java -jar baksmali-1.2.2.jar -x android123.odex

        执行完上面这行命令后,会生成一个out 文件夹里面是android123.odex的class文件。出现问题,根据提示可以从rom的 /system/framework 中的xxx.jar放到pc上的java环境变量中一起生成。

  3. 通过class生成classes.dex 文件。

        java -Xmx512M -jar smali-1.2.2.jar out -o classes.dex

  4. 将classes.dex放到apk文件

        因为apk是zip的mime编码类型,使用winzip或winrar直接拖入到apk改名为zip的压缩包中即可。

  5. 不要忘记了签名,使用jdk中的arsigner和keytool打包重新签名即可。

posted @ 2011-08-28 15:22 马航 阅读(589) | 评论 (0)编辑 收藏

安装步骤(需要自己编译):

A. 获取代码:(没有git的先安装git:sudo apt-get install git-core)

$ git clone git://github.com/tchaikov/scim-googlepinyin.git

$ cd scim-googlepinyin

B. 编译前提:

上面给的链接里面有介绍怎么编译的,但少提了几个必需组件,这里列一下:

* autotools-dev

* libgtk2.0-dev

* libscim-dev

* libtool

* automake

用下面命令看看是不是安装了,如果没有,会自动帮你安装上:

$ aptitude install autotools-dev libgtk2.0-dev libscim-dev libtool automake

C. 编译:

记住系统必须先存在SCIM(没有的话 sudo apt-get install scim 一下)

$ ./autogen.sh

$ make

$ sudo make install

现在重启

OK,去首选项里的“语言支持”的“输入法”选择scim作为默认输入法就OK了。

posted @ 2011-08-25 10:27 马航 阅读(141) | 评论 (0)编辑 收藏

在编译过程中出现错误信息包含以下内容:

usr/share/pc-bios/bios.bin   …………      tools/lib/pc-bios/bios.bin

usr/share/pc-bios/vgabios-cirrus.bin   …………     tools/lib/pc-bios/vgabios-cirrus.bin

说明在路径:~/Android_Src/out/host/linux-x86/usr/share下找不到pc-bios文件夹,并不是在本机系统目录/usr/share……下找不到该文件夹,本机系统这个目录下的确没有的。

解决方法为:

复制:~/Android_Src/prebuilt/common下的pc-bios文件夹到以下目录:~/Android_Src/out/host/linux-x86/usr/share即可解决,命令行输入:

$cp ~/Android_Src/prebuilt/common/pc-bios   ~/Android_Src/out/host/linux-x86/usr/share  (测试未通过)

$cp ~/Android_Src/prebuilt/common/pc-bios   ~/Android_Src/usr/share  (测试OK)

在编译的过程中又出现如下提示:

……………………

Docs droiddoc: out/target/common/docs/online-sdk

htmlDir not a directory: out/target/common/docs/gen

DroidDoc took 105 sec. to write docs to out/target/common/docs/online-sdk

Package SDK: out/host/linux-x86/sdk/android-sdk_eng.neo_linux-x86.zip

sdk/build/tools.atree:134: couldn't locate source file: framework/ddmlib-tests.jar

sdk/build/tools.atree:135: couldn't locate source file: framework/ninepatch-tests.jar

sdk/build/tools.atree:136: couldn't locate source file: framework/common-tests.jar

sdk/build/tools.atree:138: couldn't locate source file: framework/sdkuilib-tests.jar

make: *** [out/host/linux-x86/sdk/android-sdk_eng.root_linux-x86.zip] Error 44

大概的意思在framework目录下找不到ddmlib-tests.jar     ninepath-tests.jar     common-tests.jar     sdkuilib-tests.jar这几个文件,有一点要说明的是这里的framework目录指的是:~/Android_Src/out/host/linux-x86/framework   个目录,你可以在这里找到以下几个文件common.jar     ddmlib.jar     ninepatch.jar     sdkuilib.jar,然后将它们分别复制一份,并重命名,命名的原则很简单,就是在原有的名字后面跟上-tests即可。

接下来继续编译,没有其他错误的话,命令行会出现以下提示:

Docs droiddoc: out/target/common/docs/online-sdk

htmlDir not a directory: out/target/common/docs/gen

DroidDoc took 90 sec. to write docs to out/target/common/docs/online-sdk

Package SDK: out/host/linux-x86/sdk/android-sdk_eng.neo_linux-x86.zip

xxx@xxx:~/Android_Src$ 

这说明sdk编译也已经完成。

posted @ 2011-08-20 10:09 马航 阅读(1101) | 评论 (0)编辑 收藏

前言

本文叙述了如何从零开始搭建基于 Google 官方 Android 2.1-r2 源码的开发环境,包括如何下载源代码、编译源代码,以及在模拟器中运行编译生成的镜像。文中开发机是基于 Ubuntu 10.04 的,同样适用于其他版本的 Ubuntu 。

    2. 下载 JDK 1.5

编译 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

/usr/bin/jdk 是符号链接,它指向 /etc/alternatives/jdk (由第 2 个参数给出的), /root/jdk1.5.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 环境变量

下面开始配置环境变量。

在终端中执行: 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 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 。

        5. 下载 Android 源代码

          5.1 安装 repo 脚本

首先安装 repo 。在 root 目录下新建一个 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

          5.2 初始化 repo

首先建立一个目录用来存放 Android 源代码:

mkdir mydroid

cd mydroid

然后用最新的列表执行初始化。这里我们下载android 2.1-r1,因此加了参数 –b android-2.1_r2:

repo init -u git://android.git.kernel.org/platform/manifest.git –b android-2.1_r2

这中间会问到你的名字和 Email 。如果你打算上传代码, Email 须是一个 Google 账户。

repo 初始化成功后会看到类似于下面的提示:

repo initialized in /root/mydroid

最后执行 repo sync 开始同步代码。过程比较漫长,下载速度取决于你的网速,中间有可能遇到断线,重新执行 repo sync 即可断点续传。

       6. 编译 Android 源代码

         6.1 编译生成镜像

切换到 android 源码根目录下,执行 make 即可。首次编译非常耗时,取决于机器配置,大约需要 3 小时。完成后镜像生成在 /root/mydroid/out/target/product/generic 下。

         6.2 编译、配置 Android SDK

make 编译完成后,执行 make sdk 命令,生成对应于该版本源代码的 sdk 。

Android 官方的 SDK 和我们自己编译 Android 源码时使用 make sdk 编译出的 SDK 有区别,模拟器版本不同,加载的默认镜像也不同(一个是官方的,一个是自己编译的)。下面将展示如何能够自由切换 SDK 版本。

首先是自己编译的 SDK 版本,实际位置是 /root/mydroid/out/host/linux-x86/sdk/android-sdk_eng.root_linux-x86 。

因为它比较常用,我们给它高优先级:

update-alternatives --install /usr/bin/AndroidSDK AndroidSDK /root/mydroid/out/host/linux-x86/sdk/android-sdk_eng.root_linux-x86 255

事先下载的官方 SDK 位置是 /root/android-sdk-linux_86 ,执行:

update-alternatives --install /usr/bin/AndroidSDK AndroidSDK /root/android-sdk-linux_86 0

然后使用 update-alternatives --display AndroidSDK 查看当前配置情况:

如果要切换配置,使用 update-alternatives --config AndroidSDK

配置 AndroidSDK 环境变量。终端中执行 gedit ~/.bashrc

在文件最后添加下面三行:

# set android environment

export ANDROID_SDK_HOME=/usr/bin/ AndroidSDK

export PATH=$ANDROID_SDK_HOME/tools:$PATH

保存文件。在终端中执行 source ~/.bashrc

       7. 在模拟器中运行编译的镜像

打开终端,执行 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 即可启动模拟器,其运行的是自己编译的镜像。

posted @ 2011-08-19 15:30 马航 阅读(264) | 评论 (0)编辑 收藏

Android 2.1

  |-- Makefile

  |-- bionic (bionic C库)

  |-- bootable (启动引导相关代码)

  |-- build (存放系统编译规则及generic等基础开发包配置)

  |-- cts (Android兼容性测试套件标准)

  |-- dalvik (dalvik JAVA虚拟机)

  |-- development (应用程序开发相关)

  |-- external (android使用的一些开源的模组)

  |-- frameworks (核心框架——java及C++语言)

  |-- hardware (主要保护硬解适配层HAL代码)

  |-- out (编译完成后的代码输出与此目录)

  |-- packages (应用程序包)

  |-- prebuilt (x86和arm架构下预编译的一些资源)

  |-- sdk (sdk及模拟器)

  |-- system (文件系统库、应用及组件——C语言)

  `-- vendor (厂商定制代码)

  bionic 目录按照二级展开 tree -d -L 2

  |-- libc (C库)

  | |-- arch-arm (ARM架构,包含系统调用汇编实现)

  | |-- arch-x86 (x86架构,包含系统调用汇编实现)

  | |-- bionic (由C实现的功能,架构无关)

  | |-- docs (文档)

  | |-- include (头文件)

  | |-- inet (?inet相关,具体作用不明)

  | |-- kernel (Linux内核中的一些头文件)

  | |-- netbsd (?nesbsd系统相关,具体作用不明)

  | |-- private (?一些私有的头文件)

  | |-- stdio (stdio实现)

  | |-- stdlib (stdlib实现)

  | |-- string (string函数实现)

  | |-- tools (几个工具)

  | |-- tzcode (时区相关代码)

  | |-- unistd (unistd实现)

  | `-- zoneinfo (时区信息)

  |-- libdl (libdl实现,dl是动态链接,提供访问动态链接库的功能)

  |-- libm (libm数学库的实现,)

  | |-- alpha (apaha架构)

  | |-- amd64 (amd64架构)

  | |-- arm (arm架构)

  | |-- bsdsrc (?bsd的源码)

  | |-- i386 (i386架构)

  | |-- i387 (i387架构?)

  | |-- ia64 (ia64架构)

  | |-- include (头文件)

  | |-- man (数学函数,后缀名为.3,一些为freeBSD的库文件)

| |-- powerpc (powerpc架构)

  | |-- sparc64 (sparc64架构)

  | `-- src (源代码)

  |-- libstdc++ (libstdc++ C++实现库)

  | |-- include (头文件)

  | `-- src (源码)

  |-- libthread_db (多线程程序的调试器库)

  | `-- include (头文件)

  `-- linker (动态链接器)

  `-- arch (支持arm和x86两种架构)

  hardware 目录 (部分厂家开源的硬解适配层HAL代码)

  |-- broadcom (博通公司)

  | `-- wlan (无线网卡)

  |-- libhardware (硬件库)

  | |-- include (头文件)

  | `-- modules (Default (and possibly architecture dependents) HAL modules)

  | |-- gralloc (gralloc显示相关)

  | `-- overlay (Skeleton for the "overlay" HAL module.)

  |-- libhardware_legacy (旧的硬件库)

  | |-- flashlight (背光)

  | |-- gps (GPS)

  | |-- include (头文件)

  | |-- mount (旧的挂载器)

  | |-- power (电源)

  | |-- qemu (模拟器)

  | |-- qemu_tracing (模拟器跟踪)

  | |-- tests (测试)

  | |-- uevent (uevent)

  | |-- vibrator (震动)

  | `-- wifi (无线)

  |-- msm7k (高通7k处理器开源抽象层)

  | |-- boot (启动)

  | |-- libaudio (声音库)

  | |-- libaudio-qsd8k (qsd8k的声音相关库)

  | |-- libcamera (摄像头库)

  | |-- libcopybit (copybit库)

  | |-- libgralloc (gralloc库)

  | |-- libgralloc-qsd8k (qsd8k的gralloc库)

  | |-- liblights (背光库)

  | `-- librpc (RPC库)

  |-- ril (无线电抽象层)

  | |-- include (头文件)

  | |-- libril (库)

  | |-- reference-cdma-sms (cdma短信参考)

  | |-- reference-ril (ril参考)

  | `-- rild (ril后台服务程序)

  `-- ti (ti公司开源HAL)

  |-- omap3 (omap3处理器)

  | |-- dspbridge (DSP桥)

  | |-- libopencorehw (opencore硬件库)

| |-- liboverlay (overlay硬件库)

  | |-- libstagefrighthw (stagefright硬件库)

  | `-- omx (omx组件)

  `-- wlan (无线网卡)

  prebuilt 目录 (x86和arm架构下预编译的一些资源)

  .

  |-- android-arm (arm-android相关)

  | |-- gdbserver (gdb调试器)

  | `-- kernel (模拟的arm内核)

  |-- android-x86 (x86-android相关)

  | `-- kernel (空的)

  |-- common (通用编译好的代码,应该是java的)

  |-- darwin-x86 (drawin x86平台)

  | `-- toolchain (工具链)

  | |-- arm-eabi-4.2.1

  | |-- arm-eabi-4.3.1

  | `-- arm-eabi-4.4.0

  |-- darwin-x86_64 (drawin x86 64bit平台)

  |-- linux-x86 (linux x86平台)

  | `-- toolchain (工具链,我们应该主要用这个)

  | |-- arm-eabi-4.2.1

  | |-- arm-eabi-4.3.1

  | |-- arm-eabi-4.4.0

  | `-- i686-unknown-linux-gnu-4.2.1 (x86版编译器)

  |-- linux-x86_64 (linux x86 64bit平台)

  |-- windows (windows平台)

  `-- windows-x86_64 (64bit windows平台)

  system 目录 (底层文件系统库、应用及组件——C语言)

  .

  |-- Bluetooth (蓝牙相关)

  |-- core (系统核心工具盒接口)

  | |-- adb (adb调试工具)

  | |-- cpio (cpio工具,创建img)

  | |-- debuggerd (调试工具)

  | |-- fastboot (快速启动相关)

  | |-- include (系统接口头文件)

  | |-- init (init程序源代码)

  | |-- libacc (轻量级C编译器)

  | |-- libctest (libc测试相关)

  | |-- libcutils (libc工具)

  | |-- liblog (log库)

  | |-- libmincrypt (加密库)

  | |-- libnetutils (网络工具库)

  | |-- libpixelflinger (图形处理库)

  | |-- libsysutils (系统工具库)

  | |-- libzipfile (zip库)

  | |-- logcat (查看log工具)

  | |-- logwrapper (log封装工具)

  | |-- mkbootimg (制作启动boot.img的工具盒脚本)

 | |-- netcfg (网络配置netcfg源码)

  | |-- nexus (google最新手机的代码)

  | |-- rootdir (rootfs,包含一些etc下的脚本和配置)

  | |-- sh (shell代码)

  | |-- toolbox (toolbox,类似busybox的工具集)

  | `-- vold (SD卡管理器)

  |-- extras (额外工具)

  | |-- latencytop (a tool for software developers ,identifying system latency happen)

  | |-- libpagemap (pagemap库)

  | |-- librank (Java Library Ranking System库)

  | |-- procmem (pagemap相关)

  | |-- procrank (Java Library Ranking System相关)

  | |-- showmap (showmap工具)

  | |-- showslab (showslab工具)

  | |-- sound (声音相关)

  | |-- su (su命令源码)

  | |-- tests (一些测试工具)

  | `-- timeinfo (时区相关)

  `-- wlan (无线相关)

  `-- ti (ti网卡相关工具及库)

posted @ 2011-08-19 15:22 马航 阅读(126) | 评论 (0)编辑 收藏

取得当前屏幕的截图主要使用了Bitmap 类里的方法,首相取得一个bitmap 然后用取得的bitmap 去绘制一张图片然后进行保存。

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.os.Environment;
import android.util.Log;
import android.view.View;
public class ShotScreen {

private static final String TAG="shotscreen";
@SuppressWarnings(
"unused")
private static Bitmap takeScreenShot(Activity activity){
View view
=activity.getWindow().getDecorView();
view.setDrawingCacheEnabled(
true);
view.buildDrawingCache();
Bitmap bitmap
= view.getDrawingCache();
Rect rect
= new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
int statusBarHeight = rect.top;
System.out.println(statusBarHeight);

int width =activity.getWindowManager().getDefaultDisplay().getWidth();
int height =activity.getWindowManager().getDefaultDisplay().getHeight();

Bitmap bitmap2
= Bitmap.createBitmap(bitmap,0,statusBarHeight, width, height - statusBarHeight);
view.destroyDrawingCache();
return bitmap2;
}

@SuppressWarnings(
"unused")
private static void savePic(Bitmap bitmap,String filename){
FileOutputStream fileOutputStream
= null;
try {
fileOutputStream
= new FileOutputStream(filename);
if (fileOutputStream != null) {
bitmap.compress(Bitmap.CompressFormat.PNG,
90, fileOutputStream);
fileOutputStream.flush();
fileOutputStream.close();
}
}
catch (FileNotFoundException e) {
Log.d(TAG,
"Exception:FileNotFoundException");
e.printStackTrace();
}
catch (IOException e) {
Log.d(TAG,
"IOException:IOException");
e.printStackTrace();
}
}


/**
*
*
@param a
*/
public static void shoot(Activity a){
if (android.os.Environment.MEDIA_MOUNTED != "mounted") {
ShotScreen.savePic(ShotScreen.takeScreenShot(a),
"/sdcard/抽样.png");
}
else{
ShotScreen.savePic(ShotScreen.takeScreenShot(a),
"/data/data/"+a.getPackageName()+"/抽样.png");
}
}

posted @ 2011-08-18 17:00 马航 阅读(255) | 评论 (0)编辑 收藏

Canvas是一个画布,你可以建立一个空白的画布,就直接new一个Canvas对象,不需要参数。
也可以先使用BitmapFactory创建一个Bitmap对象,作为新的Canvas对象的参数,也就是说这个画布不是空白的,
如果你想保存图片的话,最好是Bitmap是一个新的,而不是从某个文件中读入进来的,或者是Drawable对象。
 
然后使用Canvas画第一张图上去,在画第二张图上去,最后使用Canvas.save(int flag)的方法进行保存,注意save方法里面的参数可以保存单个图层,
如果是保存全部图层的 话使用 save( Canvas.ALL_SAVE_FLAG )。
 
最后所有的信息都会保存在第一个创建的Bitmap中。代码如下:
Java代码
  1. /** 
  2.     * create the bitmap from a byte array 
  3.     * 
  4.     * @param src the bitmap object you want proecss 
  5.     * @param watermark the water mark above the src 
  6.     * @return return a bitmap object ,if paramter's length is 0,return null 
  7.     */  
  8.    private Bitmap createBitmap( Bitmap src, Bitmap watermark )  
  9.    {  
  10.        String tag = "createBitmap";  
  11.        Log.d( tag, "create a new bitmap" );  
  12.        if( src == null )  
  13.        {  
  14.            return null;  
  15.        }  
  16.   
  17.        int w = src.getWidth();  
  18.        int h = src.getHeight();  
  19.        int ww = watermark.getWidth();  
  20.        int wh = watermark.getHeight();  
  21.        //create the new blank bitmap  
  22.        Bitmap newb = Bitmap.createBitmap( w, h, Config.ARGB_8888 );//创建一个新的和SRC长度宽度一样的位图  
  23.        Canvas cv = new Canvas( newb );  
  24.        //draw src into  
  25.        cv.drawBitmap( src, 00null );//在 0,0坐标开始画入src  
  26.        //draw watermark into  
  27.        cv.drawBitmap( watermark, w - ww + 5, h - wh + 5null );//在src的右下角画入水印  
  28.        //save all clip  
  29.        cv.save( Canvas.ALL_SAVE_FLAG );//保存  
  30.        //store  
  31.        cv.restore();//存储  
  32.        return newb;  
  33.    }  
 
 对图片进行缩小的方法:
Java代码
  1. /** 
  2.     * lessen the bitmap 
  3.     * 
  4.     * @param src bitmap 
  5.     * @param destWidth the dest bitmap width 
  6.     * @param destHeigth 
  7.     * @return new bitmap if successful ,oherwise null 
  8.     */  
  9.    private Bitmap lessenBitmap( Bitmap src, int destWidth, int destHeigth )  
  10.    {  
  11.        String tag = "lessenBitmap";  
  12.        if( src == null )  
  13.        {  
  14.            return null;  
  15.        }  
  16.        int w = src.getWidth();//源文件的大小  
  17.        int h = src.getHeight();  
  18.        // calculate the scale - in this case = 0.4f  
  19.        float scaleWidth = ( ( float ) destWidth ) / w;//宽度缩小比例  
  20.        float scaleHeight = ( ( float ) destHeigth ) / h;//高度缩小比例  
  21.        Log.d( tag, "bitmap width is :" + w );  
  22.        Log.d( tag, "bitmap height is :" + h );  
  23.        Log.d( tag, "new width is :" + destWidth );  
  24.        Log.d( tag, "new height is :" + destHeigth );  
  25.        Log.d( tag, "scale width is  :" + scaleWidth );  
  26.        Log.d( tag, "scale height is  :" + scaleHeight );  
  27.        Matrix m = new Matrix();//矩阵  
  28.        m.postScale( scaleWidth, scaleHeight );//设置矩阵比例  
  29.        Bitmap resizedBitmap = Bitmap.createBitmap( src, 00, w, h, m, true );//直接按照矩阵的比例把源文件画入进行  
  30.        return resizedBitmap;  
  31.    } 

posted @ 2011-08-18 14:44 马航 阅读(1182) | 评论 (0)编辑 收藏

仅列出标题
共4页: 上一页 1 2 3 4 下一页