2010年4月23日

Git和Repo扫盲——如何取得Android源代码

Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的分布式版本控制软件,它不同于Subversion、CVS这样的集中式版本控制系统。在集中式版本控制系统中只有一个仓库(repository),许多个工作目录(working copy),而像Git这样的分布式版本控制系统中(其他主要的分布式版本控制系统还有BitKeeperMercurialGNU ArchBazaarDarcsSVKMonotone等),每一个工作目录都包含一个完整仓库,它们可以支持离线工作,本地提交可以稍后提交到服务器上。分布式系统理论上也比集中式的单服务器系统更健壮,单服务器系统一旦服务器出现问题整个系统就不能运行了,分布式系统通常不会因为一两个节点而受到影响

因为Android是由kernel、Dalvik、Bionic、prebuilt、build等多个Git项目组成,所以Android项目编写了一个名为Repo的Python的脚本来统一管理这些项目的仓库,使得Git的使用更加简单。

这几天William为了拿Android最新的sourcecode,学习了一下git和repo的一些基本操作,整理了一个如何取得Android代码的How-To,今天把他贴上来。

1、Git的安装
在Ubuntu 8.04上安装git只要设定了正确的更新源,然后使用apt-get就可以了,有什么依赖问题,就让它自己解决吧。其中cURL是一个利用URL语法在命令行下工作的文件传输工具,会在后面安装Repo的时候用到。
sudo apt-get install git-core curl

2、安装Repo
首先确保在当前用户的主目录下创建一个/bin目录(如果没有的话),然后把它(~/bin)加到PATH环境变量中
接下来通过cURL来下载Repo脚本,保存到~/bin/repo文件中
curl http://android.git.kernel.org/repo >~/bin/repo

别忘了给repo可执行权限
chmod a+x ~/bin/repo

3、初始化版本库
如果是想把Android当前主线上最新版本的所有的sourcecode拿下来,我们需要repo的帮助。
先建立一个目录,比如~/android,进去以后用repo init命令即可。
repo init -u git://android.git.kernel.org/platform/manifest.git
这个过程会持续很长的时间(至少可以好好睡一觉),具体要多少时间就取决于网络条件了
最后会看到 repo initialized in /android这样的提示,就说明本地的版本库已经初始化完毕,并且包含了当前最新的sourcecode。

如果想拿某个branch而不是主线上的代码,我们需要用-b参数制定branch名字,比如:
repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake

另一种情况是,我们只需要某一个project的代码,比如kernel/common,就不需要repo了,直接用Git即可。
git clone git://android.git.kernel.org/kernel/common.git
这也需要不少的时间,因为它会把整个Linux Kernel的代码复制下来。

如果需要某个branch的代码,用git checkout即可。比如我们刚刚拿了kernel/common.get的代码,那就先进入到common目录,然后用下面的命令:
git checkout origin/android-goldfish-2.6.27 -b goldfish
这样我们就在本地建立了一个名为goldfish的android-goldfish-2.6.27分支,代码则已经与android-goldgish-2.6.27同步。我们可以通过git branch来列出本地的所有分支。

4、同步版本库
使用epo sync命令,我们把整个Android代码树做同步到本地,同样,我们可以用类似
repo sync project1 project2 …
这样的命令来同步某几个项目

如果是同步Android中的单个项目,只要在项目目录下执行简单的
git pull
即可。

5、通过GitWeb下载代码
另外,如果只是需要主线上某个项目的代码,也可以通过GitWeb下载,在shortlog利用关键字来搜索特定的版本,或者找几个比较新的tag来下载还是很容易的。

Git最初是为Linux内核开发而设计,所以对其他平台的支持并不好,尤其是Windows平台,必须要有Cygwin才可以。现在,得益于msysgit项目,我们已经可以不需要Cygwin而使用Git了。另外,Git Extensions是一个非常好用的Windows Shell扩展,它能与资源管理器紧密集成,甚至提供了Visual Studio插件。它的官方网站上有一分不错的说明文档,感兴趣的朋友可以看一看。

至于Git的参考文档,我推荐Git Magic,这里还有一个Git Magic的中文版

posted @ 2011-01-08 02:38 braden 阅读(579) | 评论 (0)编辑 收藏

服务器推送实现方案

很多应用譬如监控、即时通信、即时报价系统都需要将后台发生的变化实时传送到客户端而无须客户端不停地刷新、发送请求。此时有两种技术可以将通信引入基于浏览器的应用之中:Bayeux(又称CometD)和WebSockets。

CometD框架是Bayeux协议的实现,可以使得服务器端和客户端在不可靠的网络上进行多通道异步通信。该实现用到了多种语言(JavaScriptJavaPerl等等),但是主要还是基于浏览器的AJAX应用。Bayeux的优势在于,它可以运行在任何支持AJAX的浏览器上,在现有HTTP通信机制下,就能够让浏览器支持异步后台的更新,比如类似于Google邮件的新邮件通知的新信息送达。事实上,同样的协议还可以用于使用其他语言在不可靠的网络上连接设备进行通信(比如移动设备)。

WebSockets是一个标准草案,这项草案由Google、Apple和其他进行HTML 5标准化的WhatWG工作组成员所资助。因此,支持HTML 5的浏览器(Chrome或者Safari)已经开始支持内建的WebSocket协议。

这两个协议的目标都是让基于Web的AJAX应用能通过异步消息或者基于Socket的连接进行通信,而不是在一个现有应用之上再搭建一个自己实现的通信层。这使得在设计应用的时候,可以只关注于组件部分,而把消息传递给通信层去递送。另外,这两个协议都能够建立长连接,事件可以通过长连接异步地递送给应用。这没什么新鲜的:HTTP 1.1就支持连接管道(可以在每个请求之后保持连接,并可以在第一个请求得到处理之后再发送多个请求);而像IMAP等一些协议则支持IDLE命令,把连接置成休眠状态,这样在休眠的连接上就不再有数据传输,但是服务器依然可以随时推送新消息。其实在Bayeux或者WebSockets之前,通过HTTP进行持久通信的机制一般被称为“HTTP推送”。

然而,长连接并不是没有任何问题。一条连接如果长时间没有数据通信的话,会被认为已经死掉,并在接下来的某个时间点被终止。为了解决这个问题,IMAP的IDLE建议客户端每29分钟发送一个IDLE命令来避免断连。而HTTP代理则会决定连接是处于闲置状态并丢弃连接,而不去管客户端和服务器端是否已经保持了一条长连接。

资源限制也是一个问题。通常,浏览器都会限制对单个服务器的并发HTTP连接的数量,以避免对该服务器(或者网络连接)造成过大的压力。浏览器一般会将这个并发连接数量限制在每次2到4个。

Bayeux和WebSockets都试图避免资源限制问题,使用回退机制来实现长轮询(比如Bayeux),或者切换到其他非HTTP协议之上。那么,这些程序库的使用者就不需要再担心浏览器或者基础架构的限制问题。

Erlang之父Joe Armstrong认为,WebSockets将会干掉Comet

聊天室的典型用例是这样的,你进入了一个聊天室,标识出你的存在,这个标识会一直保持到你显式地退出聊天室。而在Web聊天的情况下,你可以收发聊天消息,直到你关闭浏览器或者转至其他网页。不幸的是,即便是这么简单的用例都无法通过WebSocket实现,因为在该协议中,连接有一个闲置超时。

为了保持存在的状态,聊天应用要发送“连接保持(Keep Alive)”的消息给WebSocket,来避免该连接因为闲置超时而关闭。然而,应用并不知道这个闲置超时究竟是多少,因此它只能随便选一个间隔周期(比如30秒)来发送该消息,这和长轮询要做的事似乎就多少有些类似了。

通过onClose处理、连接保持、消息队列、超时和重试,我们最终实现了一个可以在用户停留在网页上的时候保持其存在状态的聊天室。但是遗憾的是这个聊天室依然还没有完,因为它还需要处理错误和非暂时性故障。

 

即便如此,现在还是开始cometd之路,毕竟就现在而言,cometd在我们项目中实施WebSocket要方便。

2.实战

本文实现了一个server 定时push一个随机数到client端,此例查询了大量的实例,经过笔者验证,在IE和FireFox下都可以运行。

运行此例,需要下面配置:

1) Tomcat要求支持Comet,必须使用NIO或者APR的方式,因此,修改Tomcat/conf/server.xml

    <Connector port="9000" executor="tomcatThreadPool"  protocol="org.apache.coyote.http11.Http11NioProtocol"
               connectionTimeout="20000"  maxThreads="150"
               redirectPort="8443"  maxKeepAliveRequests="1"/>

2)Tomcat版本要求6.0.16以上,最好使用最新的版本

3) 修改附件中源码里面的web目录下的comet-compatible.jsp文件,把里面涉及IP和端口的url,改成你机器的ip地址和端口

4) 测试运行:http://ip:port/contextName/comet-compatible.jsp

请耐心等数秒钟,随机数开始从server push到client端了

源码见附件,附件的URL如下:

http://dl.javaeye.com/topics/download/ee28df9d-d838-3572-be73-dbf06c11080f

posted @ 2010-12-30 14:05 braden 阅读(2524) | 评论 (0)编辑 收藏

Android NDK r5 开发记录 window环境

My God I did it

       学习的第一步,就是模仿。现在的任务就是跑通官方自带的例子

一、环境搭建(在搭建好Android SDK 开发环境的基础上)
1.Cygwin:make,gcc,perl…
2.android-ndk-r5-windows.zip
二、Cygwin环境配置
修改文件 X:\cygwin\home\use\.bashrc ,加入如下信息

NDK=/cygdrive/e/ProgramLibs/android-ndk-r5
export NDK

三、开始项目

1.打开Cygwin,进入到项目所在目录image

 

2.执行命令:$NDK/ndk-build 正常编译(根据AndroidManifest.xml,android:debuggable="true" 进行指定)$NDK/ndk-build NDK_DEBUG=1 调试编译,如果是SDK是8或更高的版本,你不要指定,工具自动按照调试来执行编译

%9X_`$_CJ%{9CEM)]P6I`@S

 

更多资料参照 android-ndk-r5/documentation.html

posted @ 2010-12-28 17:11 braden 阅读(894) | 评论 (1)编辑 收藏

servlet——编码处理

     摘要: 对于输出:
response.getwrite().write("中国"),在浏览器中显示乱码:
应为response.getwrite().write("中国"),默认按照ISO-8859编码响应服务器发送“中国”,而我们用的浏览器默认为GBK或GB2312编码,从而导致编码不同产生乱码  阅读全文

posted @ 2010-04-23 23:28 braden 阅读(2606) | 评论 (0)编辑 收藏

<2010年4月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

导航

统计

常用链接

留言簿(1)

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜