1、Android C编程技巧 作者: 时间:2008-11-17 来源:IT168 浏览评论 推荐给好友 我有问题 个性化定制 关键词: 运行模拟器 emulator -console * 将文件写入到模拟器的userdata.img文件中 adb push *将一个目录拷贝到模拟器中,包括子目录 adb push * 将一个目录从模拟器中拷出来 adb pull * 使得模拟器可以运行arm代码. 使用GNU/ARM Linux编译器编译你的应用程序就可以了 * 在模拟器里面运行shell,需要
2、先运行模拟器 adb shell *运行模拟器中的一个控制台程序 adb shell *连接模拟器的控制台 telnet localhost 5554/6/8 运行C程序 参考文献 Native C "Hello World" working in emulator ... wse_thread/threa... Native C Applications for Android http://benno.id.au/blog/2007/11/13/android-native-apps 步骤 * 下载GNU/A
3、RM编译工具 * 编写c/c++代码. * 使用GNU/ARM Linux 工具创建一个应用程序,不使用动态链接库 ex. arm-none-linux-gnueabi-g++.exe -static -o hello HelloAndroid.cpp * 启动模拟器 $SDK_ROOT/tools/emulator.exe * 在命令行窗口运行 abd将编译好的hello程序放入模拟器的磁盘 adb push hello /system/sbin/hello * 让hello文件变成可执行程序,不要使用 chmod ugo+x a
4、db shell chmod 777 /system/sbin/hello * 运行hello程序 adb shell cd /system/sbin/ hello EXAMPLE HELLO WORLD CODE // // HelloAndroid.cpp // // #include using std::cin; using std::cout; using std::endl; class MyName { public: void getname( void ); voi
5、d sayhello( void ); private: char name[ 255 ]; }; void MyName::getname( void ) { cout << "What is your name? "; cin >> name; } void MyName::sayhello( void ) { cout << "Welcome " << name << " to the world of Android" << endl; } MyName name; int main( int argc
6、 char *argv[] ) { name.getname(); name.sayhello(); return 0; } 对Android平台Linux部分的初步理解 作者: 时间:2008-11-17 来源:IT168 浏览评论 推荐给好友 我有问题 个性化定制 关键词: Android Linux Android是基于Linux内核的,对于喜欢研究底层的朋友来说,自然不会放过搞明白Linux层面上一些东西的机会。当然,最终目的还是要搞清楚 Linux是如何和上层lib以及虚拟机结合的,但是这得等Goo
7、gle完全开源Android之后了。很多关于Linux运行的细节,都可以通过adb 的shell来看到。 首先用emulator console来启动模拟器并进入shell界面,试一试,发现虽然很多命令不能用,比如find,但是ls之类的基本操作还是可以的。然后echo $PATH观察一下有哪些具体的可用应用程序,发现可用的都集中在/sbin,/system/sbin,/system/bin中。 看看/sbin -rwxr-xr-x root root 228776 1970-01-01 00:00 recovery -rwxr-xr-x root root 1028
8、32 1970-01-01 00:00 adbd adbd不用说,应该是守护程序,用于和你外部的adb通信的,这点从后面对进程的查看也能推测出来。至于recovery,应该是某种修复程序,但是目前还不能确定其具体用法。而且这个目录下的程序,应该都是系统自身根据即时情况调用的,不会让用户亲自调用。 再去/system目录下,发现没有sbin目录,有bin目录,底下有很多应用程序,除了toolbox提供的常用Linux命令行程序外,就是 Google自己的用于Android开发的程序。总的来说,Android自带的toolbox还是比较简陋的,如果你不喜欢这种操作起来束手束脚的感觉,没
9、关系,通过adb push的配合,我们可以把busybox安装到Android平台上,这是后话,这里先不谈这个。 继续,用ps看看进程: root 1 0 252 164 c0082240 0000ab0c S /init root 2 0 0 0 c0048eac 00000000 S kthreadd root 3 2 0 0 c003acf0 00000000 S ksoftirqd/0 root 4 2 0 0 c0045e5c 00000000 S events/0 root 5 2 0 0 c0045e5c 00000000 S khelper
10、 root 8 2 0 0 c0045e5c 00000000 S suspend/0 root 33 2 0 0 c0045e5c 00000000 S kblockd/0 root 36 2 0 0 c0045e5c 00000000 S cqueue/0 root 38 2 0 0 c0150c44 00000000 S kseriod root 74 2 0 0 c005bed0 00000000 S pdflush root 75 2 0 0 c005bed0 00000000 S pdflush root 76 2 0 0 c005f880
11、00000000 S kswapd0 root 77 2 0 0 c0045e5c 00000000 S aio/0 root 199 2 0 0 c014e2f4 00000000 S mtdblockd root 215 2 0 0 c0045e5c 00000000 S kmmcd root 229 2 0 0 c0045e5c 00000000 S rpciod/0 root 446 1 4416 216 ffffffff 0000ceb4 S /sbin/adbd root 447 1 2816 284 ffffffff afe08b9c S /s
12、ystem/bin/usbd root 448 1 636 212 c017c114 afe08e9c S /system/bin/debuggerd root 449 1 12576 580 ffffffff afe08b9c S /system/bin/rild root 450 1 56576 14776 c01dc388 afe083dc S zygote root 451 1 18528 2064 ffffffff afe0861c S /system/bin/runtime bluetooth 452 1 1200 756 c0082240 afe09
13、47c S /system/bin/dbus-daemon root 461 450 107792 19320 ffffffff afe0861c S system_server app_4 502 450 74292 14436 ffffffff afe09604 S com.google.android.home phone 503 450 74832 15044 ffffffff afe09604 S com.google.android.phone app_0 531 450 74620 14400 ffffffff afe09604 S com.google.
14、process.content app_5 608 450 73780 11760 ffffffff afe09604 S lk.test app_7 662 450 82012 13124 ffffffff afe09604 S com.google.android.lunarlander app_0 809 450 74204 15780 ffffffff afe09604 S com.google.android.maps app_6 828 450 76844 14600 ffffffff afe09604 S com.google.android.sample
15、s system 873 450 76464 13028 ffffffff afe09604 S com.google.android.development root 971 446 720 292 c00386a4 afe092ac S /system/bin/sh root 2736 971 928 308 00000000 afe083dc R ps 同样,有各种线程,系统自己调用的程序,以及用户自己的程序进程,比如lk.test和com.google.android.lunarlander是我在工程中运行的,com.google.android.maps,co
16、m.google.android.phone这种就是Android模拟器运行时你看见的那些程序。有意思的是,从进程中有/system/bin/usbd来看,似乎客户端的调试都是通过USB的,当然不是现在拉,现在你只是在用模拟器而已。恩,以后真正配套硬件出来了,USB调试器会很贵么?嘿嘿。 最后看看文件系统,mount一下: rootfs / rootfs rw 0 0 /dev/pts /dev/pts devpts rw 0 0 /proc /proc proc rw 0 0 /sys /sys sysfs rw 0 0 /dev/block/mtdblo
17、ck0 /system yaffs2 rw,nodev,noatime,nodiratime 0 0 /dev/block/mtdblock1 /data yaffs2 rw,nodev,noatime,nodiratime 0 0 没什么有新意的,和台式机比较一下,一个就是没有虚拟内存文件系统,根文件系统直接就是模拟器从SDK安装目录下的/tools/lib/images/ramdisk.img加载的。而系统所用的是yaffs2 文件系统,system和data分别都是64MB大,而且都用了将近一半了。具体系统的映像是SDK安装目录下的tools/lib/image/system
18、img。 从上面的分析看,这个Linux还是比较正常的。还有一个有意思的话题,就是目前安装软件,或者说是Package的方式在developer group上受到不少人的谴责,主要是Google目前对Android的程序安装没有标准的Install程序,也没有一个仓库说明,现在一些小程序,可以通过分析Android的文件变化得到大致的安装方式,但是以后有什么大型工程的话,最好还是定一个比较标准的安装方式规则,不能老依赖 Eclipse来帮我们搞吧,呵呵。 通过下面的步骤,可以大致分析出目前的安装模式 安装软件前: 1. emulator -wipe-data 2
19、 adb push busybox ./ 3. adb shell ./busybox tar -cf /tmp/data.tar /data 4. adb pull /tmp/data.tar . 5. mkdir original 6. cd original 7. tar -xf ../data.tar 安装软件后: 1. adb shell ./busybox tar -cf /tmp/data.tar /data 2. adb pull /tmp/data.tar . 3. mkdir after_install 4. c
20、d after_install 5. tar -xf ../data.tar 具体的区别,目前来看,就是/data/app和data/data下多了两个相关文件,同时在/data/system/packages.xml中增加了安装的程序信息。似乎菜单也是从这个文件中得到是否新安装程序,以及如何显示相关信息比如名称什么的。 对Android启动过程的进一步研究 作者: 时间:2008-11-17 来源:ITPUB 浏览评论 推荐给好友 我有问题 个性化定制 关键词: Android 对于关注Android底层的朋友来说,其具体的
21、启动过程应该是比较吸引我们的。但是很多启动文件什么的,都得adb push到host上来看,挺不方便的,都怪Android自带的Toolbox太简略了。所以在深入了解Android的启动流程之前,我们来把Busybox安装到Android上去,这样,就有很多工具供我们使用了。 首先去busybox主页 下载最新版本的源代码,然后用arm的交叉编译器编译出busybox的可执行程序,编译的时候需要注意一些设置选项,例如 Build Options —> Build BusyBox as a static binary (no shared libs) 这个要选上,因上这样子编
22、译出来的busyBox才是可以独立运行的。 │Do you want to build BusyBox with a Cross Compiler? │ │ │ │(/HOME/toolchains/gcc-4.0.2-glibc-2.3.5/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu│ 这是交叉编译器的路径,要根据具体的情况来设置。 Installation Options —> Don’t use /usr 这样子编译出来的busybox才不会安装到你主机的/usr目录下。一定要选上。 busybox的功能选项
23、根据需要自选,但是不要太贪心. OK,这里就不纠缠于编译busybox的东西了,网上资料无数。接下来,我们把busybox安装到模拟器上去。先在模拟器上随便建一个busybox的文件夹,然后进入busybox可执行文件目录,使用命令 adb push busybox.asc /data/busybox/busybox 然后进入adb shell,chmod 777 ./busybox,就可以直接使用了。但现在还是不方便,总不能每用一个命令就输一次busybox吧?所以,我们可以先用./busybox --install将程序都安装到当前目录下,然后把当前目录添加到PATH变量
24、中即可。暂时使用export来添加吧,如果想永久添加,往下看。 好了,准备工作完成,开始研究的工作了。既然是研究启动过程,那当然是先看看init.rc文件。去etc目录打开它,分析一下内容,首先是对env的定义,也就是全局环境变量的定义,接下来的建立和初始化里面的内容目前还不清楚什么意思,紧接着就是系统启动时运行的初始进程信息,这个比较有意思,包括了usbd-config和qemu,qemu自不用说,而usbd-config作为初始启动的进程,应该就是和上一篇文章猜的一样,用来调试或者usb通信的。往下看,是在初始启动进程完成之后开始启动的服务进程,这些进程如果因故退出,会自动重启。这里
25、面包括了console控制台,adbd监护进程,usbd监护进程,debuggerd监护进程等.除去这些守护进程,能引起我们注意的,是runtime和zygote。这两个进程似乎掌管着其他进程以及应用程序的启动。 现在,来让我们做一个实验吧,将自动调用的启动过程变成手动,看看启动流程具体是什么样的。想达到这个目的,首先就是要修改init.rc文件,当然不是在模拟器的console中改,一是不能改,二是你改了也没用,下次加载就会给你覆盖了。所以,我们要从原始镜像ramdisk.img入手了。从2.6标准Linux内核开始,initrd.img都采用cpio压缩,猜测ramdisk.img也
26、一样,需要使用gunzip解压缩,然后再使用cpio解包。好,进入tools/lib/images目录下,先用file命令看看ramdisk.img的类型,没错,系统提示 ramdisk.img: gzip compressed data, from Unix 很好,然后将ramdisk.img复制一份到任何其他目录下,将其名称改为ramdisk.img.gz,并使用命令 gunzip ramdisk.img.gz 然后新建一个文件夹,叫ramdisk吧,进入,输入命令 cpio -i -F ../ramdisk.img 这下,你就能看见并操作ramdisk
27、里面的内容了。当然你也可以直接在外面进行操作,但是还是建议把cpio解压缩出来的内容全部集中在一个文件夹里面,因为一会我们还要将其压缩成新的ramdisk.img。 OK,现在开始修改步骤吧。用任何一款编辑器打开init.rc,首先在PATH那里加上你的Busybox安装路径,然后注释内容,我们要手工启动他们。 # zygote { # exec /system/bin/app_process # args { # 0 -Xzygote # 1 /system/bin # 2 –zygote # } # autostart 1 # }
28、 runtime { # exec /system/bin/runtime # autostart 1 # } 在这里需要注意,不要同时把两者都注释了,注释某一个,再试验手工启动它,如果两者同时注释我这里有问题,无法启动。 好,接下来,使用下列命令重新打包成镜像 cpio -i -t -F ../ramdisk.img > list cpio -o -H newc -O lk.img < list 当前目录下生成的lk.img就是我们的新镜像了。使用自己的镜像启动emulator; emulator -console -ramdisk l
29、k.img 如果我们注释的是zygote,那么在#后输入 app_process -Xzygote /system/bin –zygote 手工启动,命令行中输出的信息是 Prepping: /system/app/AlarmProvider.apk:/system/app/Browser.apk:/system/app/ Calendar.apk:/system/app/Camera.apk:/system/app/Contacts.apk: /system/app/Development.apk:/system/app/GDataFeedsProvider.
30、apk:/system/app/ Gmail.apk:/system/app/GmailProvider.apk:/system/app/GoogleApps.apk: /system/app/GoogleAppsProvider.apk:/system/app/Home.apk:/system/app/ImProvider.apk: /system/app/Maps.apk:/system/app/MediaPickerActivity.apk: /system/app/MediaProvider.apk:/system/app/Phone.apk:/system/app/P
31、imProvider.apk:/system/ app/ApiDemos.apk:/system/app/SettingsProvider.apk: /system/app/Sms.apk:/system/app/SyncProvider.apk:/system/app/TelephonyProvider.apk: /system/app/XmppService.apk:/system/app/YouTube.apk File not found: /system/app/AlarmProvider.apk File not found: /system/app/Cale
32、ndar.apk File not found: /system/app/Camera.apk File not found: /system/app/GDataFeedsProvider.apk File not found: /system/app/Gmail.apk File not found: /system/app/GmailProvider.apk File not found: /system/app/MediaPickerActivity.apk File not found: /system/app/PimProvider.apk
33、File not found: /system/app/ApiDemos.apk File not found: /system/app/Sms.apk File not found: /system/app/SyncProvider.apk File not found: /system/app/YouTube.apk Prep complete 嘿嘿,从File not found的信息中可以看到一些Google可能会即将推出的应用,比如Gmail什么的。当然,这些都是Java框架的启动信息,我们以后还要借助其他工具来进行进一步探索。 如果我们注释的是r
34、untime,那么输出信息是: +++ post-zygote 老实说,没有明白这是啥意思,呵呵,吃饭时间到了,懒得看了。 好了,今天就说到这,基本的方法就是这样,有兴趣的朋友可以进一步深入研究。我们下一篇文章见。 GPhone开发之Android可选API介绍 作者: 时间:2008-11-17 来源:IT168 浏览评论 推荐给好友 我有问题 个性化定制 关键词: gPhone Android 今天我们继续gPhone开发教程,介绍一下Android 可选API。Google和Sun相同,把部分高端应用作为可选API供手机
35、生产商定制不同的硬件支持模块。在JME中Sun是以JSR方式公布而谷歌采用了optional API 一、Location-Based Services 定位服务 Android操作系统支持GPS API-LBS,可以通过集成GPS芯片来接收卫星信号通过GPS全球定位系统中至少3颗卫星和原子钟来获取当前手机的坐标数据,通过转换就可以成为地图上的具体位置了,这一误差在手机上可以缩小到10米。在谷歌开发手机联盟中可以看到著名的SiRF star。所以未来gPhone手机上市时集成GPS后的价格不会很贵。同时谷歌正在研制基于基站式的定位技术-MyLocation可以更快速的定位与前者G
36、PS定位需要花费大约1分钟相比基站定位更快。 二、Media APIs 多媒体接口 Android平台上集成了很多影音解码器以及相关的多媒体API, 通过这些可选API,厂商可以让手机支持MP3、MP4、高清晰视频播放处理等支持。 三、3D Graphics with OpenGL 3D图形处理OpenGL可选API Android平台上的游戏娱乐功能如支持3D游戏、或应用场景就需要用到3D技术,手机生产厂商根据手机的屏幕以及定位集成不同等级的3D加速图形芯片来加强gPhone手机的娱乐性,有来自高通的消息称最新的显示芯片在gPhone上将会轻松超过索尼PS3。
37、四、Low-Level Hardware Access 低级硬件访问 这个功能主要用于控制手机的底层方面操作,由于设计底层硬件操作,将主要由各个手机硬件生产厂商来定制,支持不同设备的操作管理等支持,如蓝牙BlueTooth以及Wifi无线网络支持等。 通过本文的介绍相信大家都了解了gPhone手机中的技术功能,开发软件或游戏的同时可以了解到Android平台的高度可伸缩性,帮助手机硬件厂商控制成本。 Google Android打开IC开源大门 作者: 时间:2008-11-17 来源:IT168 浏览评论 推荐给好友 我有问题 个性化定制 关
38、键词: Google Android 围绕Google的最新Android移动操作系统,2008年全球移动大会上推出了许多新品,其中TI、高通等发布了早期试用版。但是Android的演示(基于Linux,开放移动平台),引发了许多问题。 一个公开的问题是:在与手机应用处理器一样极具竞争力的市场,作为“开源”半导体制造商意味着什么?几个半导体制造商是开放手机联盟(一组技术和移动公司致力于使用Android平台部署手机和服务)的积极成员,其中包括领先的手机芯片制造商博通、TI和高通。 这些公司向Android平台贡献了他们的低层次驱动和库,还承诺开放源代码模式。他们将使得
39、全面的源代码可以对每个人开放,包括他们的竞争者。这样就提出了了一些问题,以至于需要数年才能解决。 高通和TI证实了正在讨论作为Android平台的参与者,他们将通过免版税计划为他们的驱动做源代码。其他公司也为Android贡献了IP,使其源代码可用。 Android的支持者指出开放源代码模式的好处:更多的公司开发解决方案从而有更多的创新,更快的上市时间,更低的价格以及更好的利用应用处理器的电源。事实上,TI和高通希望他们对Android的参与,能够促使设计上的领先并且更容易的使自己的芯片进入Android手持设备。 没有人能够确定开放源代码将对半导体厂商产生的影响。 Linu
40、x开发商已经理解了这个模式,但是这对于芯片公司的软件工程师和市场战略者还是个新概念。 驱动源代码将为芯片的详细功能提供前所未有的可视性。当这样的源代码根据保密协议与OEM定期共享时,他将直接落入竞争对手手中。博通和高通将获得TI芯片详细的功能,反之亦然。 当可视性在这些直接一级竞争者中释放了新的竞争活力,他可能就不会是最关注的。源代码将使得希望在移动市场竞争的中国半导体制造商快速成长。这个许可是否将加快中国厂商功能模仿和降低价格的能力?若确实如此,由于开放源代码模式,制造商是否还有任何的追索权? 这些是对移动技术提供商决定怎样或是否参加Android的背后问题。现在所做的决定
41、将在今后几年产生影响。 TI在展示了一个基于Android的原型手机和开放套件。所展示的TI Omap3430和Omap850处理器验证了TI在Android平台提供多媒体功能、WLAN和蓝牙等连接能力以及丰富用户界面的能力。该成果将应用在如网络浏览器、 e-mail、短信和视频领域。 高通同样也提供了一个Android原型的现场演示,基于MSM7201A的单芯解决方案,最初的开发针对微软移动操作系统。 博通同样也是开放手机联盟的成员之一,他在全球移动大会的展示与Android的展示形成了鲜明的对比。博通展示了其BCM2153双核HSDPA处理器,可在单一芯片支持Symbi
42、an、Windows Mobile或者Linux。该3G解决方案灵活了扩展了当今智能手机市场最流行的操作系统。同时,ST展示了其Nomadik多媒体应用处理器 STn8815,可以移植到不同的操作系统,包括Symbian、Nucleus、WinCE、Linux 2.4和Android。 全球移动大会的手机展示说明以应用为中心的新一代手机多媒体设备正在逐渐增长。这些产品是互联网浏览器、音乐播放器、文本信息、也可以使用语音通话e- mail设备。市场研究公司MultiMedia Intelligence表示,功能丰富,高端多媒体手机将从2007年的2000万增长到2011年的2.5亿。
43、 作为 Apple的iPhone引起的效应,触摸屏在全球移动大会也随处可见。MultiMedia Intelligence 预计带有触摸屏的手机将在2011年达到2亿个。 不过,所有功能丰富的多媒体手机的展示中,Android平台的影响似乎是最大的。 Android手机详细配置曝光 作者: 时间:2008-11-17 来源:新浪 浏览评论 推荐给好友 我有问题 个性化定制 关键词: Android HTC Dream 北京时间8月29消息,据TmoWorld网站报道,T-Mobile将于10月13日推出全球首款Android手机。 该款And
44、roid手机名为“HTC Dream/G1”,由宏达电制造。从设计草图看,手机的背面印有“with Google”(与谷歌合作)字样。 T-Mobile将是HTC Dream/G1的首家服务运营商,用户需签署两年服务合同,HTC Dream/G1的售价为199美元。 HTC Dream/G1的具体配置如下: 手机体积:117(毫米) x 55(毫米) x 16(毫米) 屏幕尺寸:3.17英寸HVGA (480 x 320) 重量:157克 电池:1150mAh电池 处理器:高通528Mhz 7201处理器 内存:64MB RAM、128MB RO
45、M 1GB MicroSD卡 5排全功能键盘 轨迹球 310万像素摄像头 支持视频格式:H.264、流媒体、3GPP、MPEG4和Codec 3GP YouTube视频播放器 支持音频格式:MP3、AAC、AAC+、WMA、MPEG4、WAV、MIDI、REAL、 AUDIO和OGG 支持墙纸格式:JPG、BMP、PNG和GIF 内置扬声器 铃声(MP3、AAC、AAC+和WMA) 支持HTTP、WAP Push和xHTML 蓝牙(class 1) Picture Caller ID 支持短信(SMS)和
46、彩信(MMS) 支持POP、IMAP、SMTP,以及AOL和GMAIL电子邮件服务 支持AIM、MSN、雅虎通和GTALK 四频(850,900,1800,1900) 支持3G,802.11b和802.11g 与谷歌日历同步 与Android Marketplace联机 支持谷歌“街景”服务 包装盒内附数据工具包。 Google Android会使Java领域支离破碎? 作者: 时间:2008-11-17 来源:硅谷动力 浏览评论 推荐给好友 我有问题 个性化定制 关键词: Android Java 谷歌的A
47、ndroid软件给了Sun公司的Java技术一个显赫的角色---但并非是其它手机厂商从2 0世纪9 0年代以来借以不断发展的Java技术版本. 相反,谷歌试图独立提高开放手机联盟 (Open Handset Alliance)的手机中使用的软件的性能和开放性.这意味着,程序设计员们将有一个新的Java技术可以用来编程,谷歌周一宣布了一项价值一千万美元的Android应用软件开发大赛以吸引开发精英参与. 一个显著不同是谷歌自己开发的Java虚拟机内核技术 (JVM),称为Dalvik,该Java虚拟机在Android手机上执行Java程序.谷歌表示,即使在手机的限制性硬件上,Da
48、lvik也能使 Java程序运行得很快.与我们通常使用的Java虚拟机的一个显著的区别就是, Android并不属于Sun公司在1999年成立的Java标准制定组织(Java Community Process, 简称JCP)的一部分. JCP负责处理和审批各种Java技术和技术规范,将新的Java特点系统化为应用程序编程接口(API),所以程序员可以有一个标准的方式调用新的技术,比如蓝牙技术或三维图形.但现有的Java的技术不能满足谷歌公司认为对于Android平台很重要的开放性要求. 致力于 Android平台开发的谷歌高级工程师Mike Cleron 说:“我们希望该
49、平台以多种不同的方式开放.我们的想法是,谁都可以在已有的Android软件上,甚至及其细微的层面上进行二次开发和替换.现有的 Java APIs并没有达到我们希望在Android上达到的开放性要求.” 应该指出的是,谷歌并不是在一个完全没有Java的环境下工作.举例来说,其中的一个OHA(开放手机联盟)合作伙伴,摩托罗拉,已经帮助引领基于Java的移动设备开发,谷歌想要保留开发人员熟悉的 Java编程经验.谷歌是JCP(Java标准制定组织)执行委员会的成员之一,但只是负责监管运行在个人电脑和服务器上的标准版和企业版Java,而不是手机和其它设备的移动版Java. Android平台工程总监Steve Horowitz 说:“我们团队里有专人活跃在Java社区,他们一直在帮助告诉并指导我们,这保证我们做的是工作是Java社区的开发人员所熟悉的.” 进一步支离破碎吗? 但更大的问题是谷歌的努力是否会恶化本已已经支离破碎地的Java领域.并非所有的手机都支持Java标准,所以程序员不能肯定的是他们开发的软件是否将可以运行在多种设备上,就像Java承诺的那样:编写一次






