工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.wdlinux.cn 注册 | 登陆
浏览模式: 标准 | 列表全部文章

squid刷新策略

3. 通过使用多播HTCP包来完成Squid清理,这是MediaWiki目前正在使用的方法,当wiki更新时用于更新全球的Squid缓存服务器,实现原理为:发送PURGE请求到特定的多播组,所有Squid服务器通过订阅该多播组信息完成删除操作,这种实现方式非常高效,避免了Squid服务器处理响应和建立TCP连接的开销。参考资料:Multicast HTCP purging 

 

发送no-cache头的方式在很多情况下不适用,因为大多数站长都会配置ignore-reload来阻止no-cachereload头以提高Squid的命中率;通过适当的权限控制PURGE清理将是一种非常简单可行的方式,考虑到安全问题我们可以仅允许特定的主机进行PURGE清理操作,对第12种方式进行简单的变通就可以用于管理较大规模数量的前端缓存服务器 - 我们可以在被允许的主机上提供一个专门的后台刷新队列,这个刷新队列在接收到刷新操作时就多线程的向前端服务器发送删除指令,这样就达到了同步刷新的效果。第3种方式没有进行过尝试,因为需要安装相应的补丁,并进行配置,操作成本相对较高,在服务器数量特别巨大的情况下这无疑是一种非常高效的实现方式。

如何让squid实现动态缓存

Refresh_pattern 指令间接的控制磁盘缓存。宽松的设置增加了cache的命中率,同样也增加了用户接受过时相应的几率; 保守的设置,降低了cache的命中率和过时响应

 Refresh_pattern 规则仅仅应用到没有明确过时期限响应。原始服务器能使用Expires 头部,或者使用Cache-Control:max-age指令来设置过时期限,当然在squid主配置文件中配置refresh_pattern 配置任意数量,squid是按照顺序进行查找以匹配正则表达式,。一旦squid找到一个匹配时,squid会使用相应的值来决定,某个缓存响应是存活还是过期,当正则表达式之一被匹配URI时,squid 就会停止搜索

 Refresh_pattern 的语法

 Refresh _pattern [-i] regexp min  percent  max  [Option]

   一 regexp 参数是大小写敏感的正则表达式,- i 选项是忽略大小写,

   二  min 参数是分钟数量,它是过时响应的最低是时间限制。如果魔鬼响应驻留在cache里的时间没有超过这个最低限制,那么它不会过期。同样max 参数是存活响应的最高时间限制。如果某个响应驻留在cache里的时间高于这个最高限制,那么它必须被刷新

   三  在min 和max 时间限制之间的响应,会面对squid的最后修改系统LM-factor算法LM-factor=(responseb age)/(resource age). 对这样的响应,squid计算响应的年龄和最后修改系数,然后将它作为百分比值进行比较,响应年龄简单地就是从原始服务器产生,或者是最后一次验证响应后,经历的时间数量。源年龄在Last-Modified 和Date头部之间是不同的,LM-factor 是响应年龄与源年龄的比率。这不是一个精确控制过期的参数,如果要精确控制过期,就不要使用该参数

   四   squid的refresh_pattern 算法的简单描述

       1   如果响应年龄超过refresh_pattern 的max值,该响应过期;

       2  如果LM-factor 少于refresh_pattern 的percent的值。该响应存活

       3  如果响应年龄少于refresh_pattern 的min值,该响应存活

       4  其他情况,响应过期

  五  Refresh_pattern  percent 计算方法

      Resource age=对象进入cache的时间 – 对象的last_modified

      Response age= 当前时间 – 对象进入cache的时间

      LM-factor   =(response age)/(resource age )

例如 refresh_pattern 20%

    假如源服务器上www.aaa.com/index.html - --lastmodified 是2007-04-10 02:00:00

         Squid 上的proxy.aaa.com/index.html  index.html存入cache的时间2007-04-10 03:00:00

   1  如果当前时间 2007-04-10 03:00:00

      Resource age =3点 – 2点 =60分钟
      Response age =0 分钟
      Index.html 还可以在cache 中停留的时间(resource age)*20%= 12 分钟,换句话说,    index.html 进入cache后,可以停留十二分钟,才被重新载入
    2  如果当前时间是 2007-04-10 03:05:00
      Resource age =3点 – 2点 =60 分钟
      Response age=5 分钟
      Index.html 还可以在cache中停留的时间
     ( resource age)*20%=12 分钟-5=7分钟
      LM-factor=5/60 =8.3% <20%

    3  所有说2007-04-10 03:12:00 LM-factor=12/60=20% 之后,cache中的页面index.html 终于stale,如果这段时间没有index.html的请求,index.html会一直缓存中,如果有index.html 请求,squid收到请求后,由于已经过期,squid 会像源服务器发一个index.html是否有改变的请求,如果源服务器收到请求后,如果index.html没有更新,squid就不用缓存,直接会把缓存中的内容给客户端;同时,重置对象进入cache的时间为源服务器确认的时间。比如2007-04-10 03:13:00 ,如果正好在这个后重新确认了页面。重置后,resource age 变长,相应在cache中的cache中存活的时间也同样变长

   如果有改变则把最新的index.html返还给squid ,而squid 收到会更新缓存,然后把新的index.html 返还给客户端,同时根据新页面中的Last_Modified 和取页面的时间,重新计算resource age,同样也重新计算存活时间
    实际上,一个对象进入cache后,同样他的存活时间就确定了,即(resource age)* percent ,直到被重新确认
六  refresh_pattern 指令

   1 Override-expire

 该项导致squid在检查Ecpires 头部之前,先检查min 值,这样。一个非零的min时间让squid返回一个未确认的cache命中,及时该响应准备过期

  2 Override-lastmod

该选项导致squid在检查LM-factor 百分比之前先检查min值,其生效在expire 之后

  3 Reload-into-ims

 该项让squid在确认请求里,以no-cache指令传送一个请求,话句话说,squid在转发请求前,对该请求增加一个If-Modified-Since 头部,主要该点的是,仅仅在目标有Last-Modified 时间截时才能工作。外面进来的请求保留no-cache 指令,以便他到达原始服务器。一般情况下可以使用reload-into-ims。它是强行控制对象的超时时间,这违反了http协议的精神,但是也在带宽较窄的情况下。可以明显的提高系统的响应时间
                 如 

               refresh_pattern -i \.css$ 1440 50% 129600 reload-into-ims

               refresh_pattern -i \.xml$ 1440 50% 129600 reload-into-ims

              refresh_pattern -i \.html$ 1440 90% 129600 reload-into-ims

              refresh_pattern -i \.shtml$ 1440 90% 129600 reload-into-ims

              refresh_pattern -i \.hml$ 1440 90% 129600 reload-into-ims

              refresh_pattern -i \.jpg$ 1440 90% 129600 reload-into-ims

              refresh_pattern -i \.png$ 1440 90% 129600 reload-into-ims

              refresh_pattern -i \.bmp$ 1440 90% 129600 reload-into-ims

              refresh_pattern -i \.js$ 1440 90% 129600 reload-into-ims 

  4 Ignore-reload

   该选项导致squid的忽略请求里的任何no-cache指令
 如果希望内容一旦进入cache就不删除,除非是被主动purge掉为止,可以加上ignore-reload 选项,该项常用在mp3,wma,wmv,gif 之类

 refresh_pattern -i \.mp3$ 1440 50% 2880 ignore-reload

refresh_pattern -i \.wmv$ 1440 50% 2880 ignore-reload

refresh_pattern -i \.rm$ 1440 50% 2880 ignore-reload

refresh_pattern -i \.swf$ 1440 50% 2880 ignore-reload

refresh_pattern -i \.mpeg$ 1440 50% 2880 ignore-reload

refresh_pattern -i \.wma$ 1440 50% 2880 ignore-reload

 

 5 Ignore-no-cache

     该项导致squid强制忽略从源站而来的“Pragma:no-cache”和“cache-control:no-cache”

 6 Ignore-private

     该项导致squid强制忽略从源站而来的“cache-control:private”

 7 Ignore-auth

     该项导致squid 强制将一个请求认为是源站发送的带有“cache-control:public”

 8 Ignore-no-store

    该指令是忽略来自源站不缓存对象

     a no-store directive from the Web server which makes an object non-cacheable is ignored.  

 9 Refresh-ims

     该项是client一个刷新请求转换成一个If-Modified-Since 请求 

 

       a refresh request from a client is converted into an If-Modified-Since request.

Squid缓存命中率调整惨痛教训

公司的网站使用Squid 2.6STABLE2作缓存加速服务器,缓存的命中率一直不好,最好也只能达到90%,折腾了许久,终于发现影响最大的原来只是一个小参数,不过期间也学 到了不少东西~

起初,考虑缓存命中率不高,考虑是不是给Squid的内存不够,所以就加大了内存配置,2G内存的机器给Squid 1G用,测试了两天,结果基本没有什么大的改变;于是调整refresh_pattern的参数,增大内容缓存时间,测试了两天,效果也不理想。

从 kxn的文章中知道可以使用Expires模块让Apache给文件指定缓存时间,期望可以提高缓存性能,于是在服务器上:
ExpiresActive On
ExpiresDefault A2592000
结果第二天一早发现缓存命中率竟然比前一天还下降了2个百本点,有点晕了~

于是将cachemgr配置起来,详细地检查squid的运行状况,发现1G的内存缓存实际只用了不到300M,所以显然不是内存不够的问题。

为了充分利用内存,将maximum_object_size_in_memory调大到128KB,让其可以缓存更大的文件,而不是默认的 8KB。顺手将ufs换成aufs,启用异步IO。

之后情况稍有改善,1个小时之后,内存的占用达到了1G,但命中率并没有明显上升。

于是又调整了内存的覆盖策略(memory_replacement_policy),听从kxn的教诲,使用lru,发现变化不大,也许是我们的 访问量还不大的原因吧。

这时候缓存命中率仍然在90%以下徘徊。是不是我们的网站结构影响只能达到这么高呢?但是网站结构我没有办法改变,所以还是要从其他方面入手来解决 问题。

于是使用Cache Manager 仔细的查看各个统计数据,当看到In-Memory and In-Transit Objects项目时,发现一个问题,那就是所有的网页文件都显示NOT_IN_MEMORY,这就比较奇怪了,问什么访问量最大的网页文件竟然没有被缓 存到内存呢?是因为文件太大还是因为文件请求的数量太少,所以才没有被缓存呢?于是找了一个页面作测试,使用工具查看了返回的大小,只有40K多一些,与 我的maximum_object_size_in_memory最大值128KB还有相当大的差距,所以不可能是这个原因。于是有使用ab程序对这个页 面做了1000次请求,心想这下总会缓存了吧。可是查看缓存内容,依然没有,而且不但内存中没有,就连硬盘上也没有!

至此得出结论,一定是什么原因阻止了Squid对这些网页进行缓存。仔细的检查In-Memory and In-Transit Objects中的内容,发现IN_MEMORY 状态的对象基本都是jpg和gif图像文件,html,css等文本文件内容则都没有缓存。

这两种文件有什么不同吗?记忆中Squid也没有对这些文件类型的设定呀,refresh_pattern对所有的静态文件的设置也都是一致的,所 以差异不应该来源于squid本身——也就是因为这种记忆使得我后来多费了许多的功夫~

在Apache上找到了文本文件与图像文件之间设置的差异——deflate压缩。是不是所有使用deflate压缩的内容都不会缓存呢?使用同样 的squid软件版本及配置文件,相同的Apache软件版本和配置,快速的搭建了一套测试环境。squid只有1台,重建其磁盘缓冲区,重新启动 squid,观察内存中对象的变化。果然,对于deflate压缩的内容,squid内存中没有缓存,磁盘也找不到。停止apache的deflate功 能,重新请求页面,立即在squid的内存中查到了内容的缓存,这么看来是squid和deflate不太兼容了?

好吧,先将产品环境Apache的deflate停掉,过了一段时间,有两台squid的缓存命中了提高到了94%,虽然只提升了4个百分点,但是 这充分验证了squid和deflate不兼容的观点。

然而,事情到此才刚刚开始!

难道Squid真的无法缓存deflate压缩的页面吗?好吧google一下,squid+deflate,在squid的邮件列表中找到了一些 讨论deflate的东西,属于比较古老的吧,说因为deflate压缩之后,会产生Content-Encoding: gzip这样的HTTP头部,属于HTTP/1.1的内容,而Squid并不完全兼容HTTP/1.1之类的,需要用Transfer-Encoding 之类的代替,可是mod_deflate和mod_gzip产生的头部就是Content-Encoding,怎么办?

为了解决这个问题,引入了另一个Apache的模块,mod_headers,用它来改写HTTP应答的头部,将Content-Encoding 更改给Transfer-Encoding,可是,很自然的,页面一片乱码!说明此路不通啊!

又以Content-Encoding为关键字,快速的搜索了一下squid 2.6STABLE2的源代码,也没有发现几个地方用到这个东西,无果。

继续Google之,squid+can’t cache+Content-Encoding找到一篇文章,其中说’SQUID would never bother to cache ANYTHING that had
a “Vary:” header on it.’ 看来Squid缓存内容与Vary: 头部有关系。再次检查一下HTTP请求返回的头部内容,发现对于deflate压缩的内容,拥有”Vary: Accept-Encoding”这样一个头部,而没有经过deflate压缩的内容则没有这个头部,这次看来问题比较清楚了,因为deflate压缩添 加了Vary: Accept-Encoding这个头部,导致了内容无法被squid缓存。

那么难道真的没有办法让squid缓存deflate压缩之后的内容吗?

基于上面的经验,很自然的想到使用mod_headers模块的功能将Vary头抹掉Squid不就可以缓存了吗?后来一想,这样会有其它问题: 1)如果用户浏览器不支持gzip压缩功能,那么将无法正常的浏览网页;2)其它可能很重要的Vary内容也没有了,可能会导致更大的隐患。那么这种办法 不行。

还有其它的办法吗?再次的快速搜索了Squid的源文件中关于Vary的内容,在Changelog中找到了这么一条:
- Full ETag/Vary support, caching responses which varies with request details (browser, language etc).
也就是说已经完全支持带ETag/Vary头部的内容缓存了。这一条出现在Changes to squid-2.6.STABLE1,也就是说在Squid2.6STABLE1就已经完全实现了这个功能,那么2.6STABLE2应该没有问题,会不 会是2.6STABLE2的BUG呢,查询了一下2.6系列的所有Changelog,没有提到此故障的信息。推断我们的故障要么由一个未知BUG导致, 要么是自己配置不当。BUG的问题我无法确认,只能先从配置入手。

找来一份2.6STABLE2带的默认配置文件,搜索Vary,第一条:
# TAG: cache_vary
# Set to off to disable caching of Vary:in objects.
#
#Default:
# cache_vary on
难道我的配置文件是off不成?赶紧检查,发现还真是off,sign,原来就是这个问题折磨我,改成on,将 Apache的Deflate配置启用,再观察内存对象,发现静态网页真的被缓存了!

郁闷了许久,终于可以松口气了。

过了一会儿,再查看Squid的状态,发现缓存命中率没有下降,稳定在94%左右。

也许Squid还有什么可挖掘的空间吧,改天接着折腾!

后记:Squid对Vary和Etag的支持属于2.6的一项主要改进,这一特性改进Squid对HTTP/1.1标准的支持。在将Squid升级 至2.6之前,也看过他的Changelog,但当时并不明白Vary到底有什么用途,这么一折腾,明白了不少。看来应该把HTTP/1.1的标准再好好 研读一下。

搞了一天Ubuntu Android 2.3的编译环境,做一下总结

Ubuntu 10.10 x64的版本
第一步:安装Java SDK 1.6 后续的版本估计都是要用JDK 1.6了吧
这里给个地址,大家自助下载:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
然后修改~/.profile 添加下边这两行:
export PATH=$PATH:/opt/jdk1.6/bin/
export JAVA_HOME=/opt/jdk1.6/
其中上边的/opt/jdk1.6是我安装JDK的地方,大家想装那里就随意吧,也可以让1.6和1.5共存,就看大家愿意怎么弄了
第二步:Ubuntu 10.10中缺少什么就装什么,这里主要总结一下出错的地方
1、编译过程中出现com.sun.javadoc不存在的错误,如下方式解决:
export ANDROID_JAVA_HOME=$JAVA_HOME
2、usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h: No such file or directory
解决办法:sudo apt-get install libc6-dev-i386
3、/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.3/libstdc++.so when searching for -lstdc++
解决办法:sudo apt-get install g++-multilib
4、Traceback (most recent call last):
  File "../repo", line 595, in <module>
    main(sys.argv[1:])
  File "../repo", line 562, in main
    _Init(args)
  File "../repo", line 181, in _Init
    _CheckGitVersion()
  File "../repo", line 210, in _CheckGitVersion
    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
  File "/usr/lib/python2.6/subprocess.py", line 623, in __init__
    errread, errwrite)
  File "/usr/lib/python2.6/subprocess.py", line 1141, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
解决办法:sudo apt-get install git
5、/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../libz.so when searching for -lz
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../libz.a when searching for -lz
/usr/bin/ld: skipping incompatible //usr/lib/libz.so when searching for -lz
/usr/bin/ld: skipping incompatible //usr/lib/libz.a when searching for -lz
/usr/bin/ld: cannot find -lz
collect2: ld returned 1 exit status
解决办法:sudo apt-get install lib32z1-dev
6、/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.3/libstdc++.so when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.3/libstdc++.a when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.3/libstdc++.so when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.3/libstdc++.a when searching for -lstdc++
解决办法:sudo apt-get install g++-multilib
7、/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../libncurses.so when searching for -lncurses
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../libncurses.a when searching for -lncurses
/usr/bin/ld: skipping incompatible /usr/lib/libncurses.so when searching for -lncurses
/usr/bin/ld: skipping incompatible /usr/lib/libncurses.a when searching for -lncurses
/usr/bin/ld: cannot find -lncurses
解决办法:sudo apt-get install lib32ncurses5-dev

8、prebuilt/linux-x86/sdl/include/SDL/SDL_syswm.h:55:22: error: X11/Xlib.h: 没有那个文件或目录
prebuilt/linux-x86/sdl/include/SDL/SDL_syswm.h:56:23: error: X11/Xatom.h: 没有那个文件或目录

解决办法:sudo apt-get install libx11-dev

最后就是搞定代码开始编译了

Ubuntu下编译Android源码并运行Emulator

建立编译环境

1.在VirtualBox上安装Ubuntu

2.安装JDK
   $ sudo apt-get install sun-java5-jdk  或
   $ sudo apt-get install sun-java6-jdk (donut 1.6)
3.安装flex,bison,gperf,libsdl-dev,libesd0-dev,libwxgtk2.6-dev(可选),build-essential,zip,curl。
   $ sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
4.安装Valgrind(可选),此工具可以帮你查找内存泄漏、堆栈破坏以及数组访问越界等错误。
   $ sudo apt-get install valgrind
5.下载Android源代码

从Android官方下载donut分支的Android源代码
sudo apt-get install git-core curl
curl http://android.git.kernel.org/repo >~/bin/repo
chmod a+x ~/bin/repo

cd ~/bin/
   $ ./repo init -u git://android.git.kernel.org/platform/manifest.git -b android-1.6_r2
   $ ./repo sync

6.在 ~/.bashrc 加环境变量。
   $ vim ~/.bashrc
在.bashrc文件的最后面加入如下2行,即将JDK的安装路径加入到环境变量中
       export JAVA_HOME=/usr/lib/jvm/java-6-sun
       export ANDROID_JAVA_HOME=$JAVA_HOME
完成后,$source ~/.bashrc即可生效。

运行   $ java -version 将出现下面提示:
      [root@Neil java]# java -version
      java version "1.6.0_11"
      Java(TM) SE Runtime Environment (build 1.6.0_11-b03)
      Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode, sharing)
      [root@Neil java]#
说明Java已经成功被安装了

通过
$ update-alternatives --config javadoc
$ sudo update-alternatives --config java
$ sudo update-alternatives --config javac
然后选一个编号,就切换过去了。



编译Android  

$ cd android            //(进入android目录)
  $ make                  //(编译android)

注意:编译时要确保系统的内存在1.2GM以上,且有足够的硬盘可用空间,否则会编译失败终止。
    Android编译环境提供了”showcommands”选项来显示编译命令行,如:
    $ make showcommands


1.5_r2版编译出错的解决方法:
The Android code contains a bug that hasn’t been solved up to the date of this article.
So before you start compiling the code, you’ll need a few modifications, or the build will fail (after consuming some of your time and patience). The error is:
external/qemu/sockets.c: In function 'sock_address_init_resolve':
external/qemu/sockets.c:637: error: 'EAI_NODATA' undeclared (first use
in this function)
external/qemu/sockets.c:637: error: (Each undeclared identifier is
reported only once
external/qemu/sockets.c:637: error: for each function it appears in.)
make: *** [out/host/linux-x86/obj/EXECUTABLES/emulator_intermediates/
sockets.o] Error 1
To fix this, before compiling the android code, open ~/mydroid/external/qemu/sockets.c and add
#define __USE_GNU
just before the #include <netdb.h>

新编译的system.img不能正常使用sdcard 的解决办法:
    $ mount -t vfat /dev/block//vold/179:0 /sdcard
    也可以更改system/core/vold程序


运行emulator
我们这里使用已经编译好的模拟器kernel镜像,即kernel-qemu,位于android/prebuilt/android-arm/kernel目录下,然后运行模拟器。

1.在 ~/.bashrc 加环境变量。(本项可选)
   $ vim ~/.bashrc
在.bashrc文件的最后面加入如下2行,即将Android工具的路径
   export PATH=/archer/external/android/out/host/linux-x86/binPATH
   export ANDROID_PRODUCT_OUT=/archer/external/android/out/target/product/generic

   export ANDROID_SWT=/android/out/host/linux-x86/framework

2.创建Android虚拟设备
   $ cd android/out/host/linux-x86/bin    (进入模拟器程序所在目录)
   $ ./android create avd -t 2 -n g1
其中 -t 指定TargetID (Android 1.5 SDK的ID为2,Android 1.0 SDK的ID为1),-n指定创建的Android虚拟设备名字。

3.运行emulator
   $ cd android/out/host/linux-x86/bin    (进入模拟器程序所在目录)
   $ ./emulator -avd g1                     或者
   $ ./emulator -avd g1 -scale 0.8
其中 -avd指定Android设备名,-scale指定缩放比例。
按 Ctrl + F12 可以使模拟器屏幕旋转90度,即横屏、竖屏切换。
4.删除创建的Android虚拟设备
   $ ./android delete avd -n g1


编译linux kernel


直接编译Android源码时,并没有编译 linux kernel。如果只运行模拟器,不用编译 linux kernel。
从emulator获取内核编译参数的配置文件:
  启动模拟器
  $ adb pull /proc/config.gz .
   解压缩config.gz  $ gzip -d config.gz
   将config文件替换kernel文件夹下的.config文件。
根据需要,修订config与Makefile配置文件


编译模块

Android中的一个应用程序可以单独编译,编译后需要重新生成system.img。
在Android目录下运行
$ . build/envsetup.sh  或者
$ source build/envsetup.sh ,然后就会多出几个可用的命令:

- croot:   Changes directory to the top of the tree.
- m:       Makes from the top of the tree.
- mm:      Builds all of the modules in the current directory.
- mmm:     Builds all of the modules in the supplied directories.
- cgrep:   Greps on all local C/C++ files.
- jgrep:   Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir:   Go to the directory containing a file.
- printconfig: 当前build的配置情况.
可以使用 --help查看用法。
如:在修改了某一个模块以后,可以使用 $ mmm <目录>  来重新编译所有在<目录>中的所有模块,使用 $ mm  编译当前目录中的所有模块。
编完之后,即修改了Android系统以后,可以使用 $ make snod 重新生成system.img。

在Ubuntu下安装JDK 6和Eclipse

首先需要安装JDK 6
sudo apt-get install sun-java6-jdk

之后需要设置默认的java程序
sudo update-alternatives –config java
按照提示输入对应的选项,指定为JDK 6

下面设置
sudo vim /etc/environment

在其中添加如下两行:
CLASSPATH=/usr/lib/jvm/java-6-sun/lib
JAVA_HOME=/usr/lib/jvm/java-6-sun
如果其中已经设置了CLASSPATH和JAVA_HOME,则将其修改为上面的形式,按ZZ保存退出。

接下来安装Eclipse
sudo apt-get install eclipse

需要注意的是,此时Eclipse并不关心之前设置的update-alternative

所以应该修改Eclipse的配置。首先将 SUN-JDK-6彻底设为系统默认:

sudo update-java-alternatives -s java-6-sun

然后编辑JVM配置文件:
sudo vim /etc/jvm

在文件顶部添加
/usr/lib/jvm/java-6-sun
(如果没有则自己新建)

sudo vim /etc/eclipse/java_home

也是在文件顶部添加
/usr/lib/jvm/java-6-sun

之后启动Eclipse,选择Help->About Eclipse SDK,选择Configuration Details,可以看到JDK6的设置已经生效。

Android系统(安卓)手机刷机前需要知道的一些基础知识

安卓现在是炙手可热啊,原来支持其他系统的玩家对都纷纷转投安卓怀抱了。在这里给大家也是给自己普及下刷机知识。
一、关于Root
1、什么是“root”?
     “Root”权限相当于电脑的管理员权限,“Root”后用户可以完全权限访问Linux内核:“Root用户”可以编辑修改系统 内的任何东西。出于安全考虑,“普通用户”没有该完全访问权限。
     root你的手机 之后,你就可以读写未root时你无法访问的手机内部核心区块。
     当然,是否root完全取决你自己。普通手机用户不root也可以很好的使用自己的手机。
2、为何要“root”我的手机?
     最主要的原因是刷第三方ROM(相当于重装电脑的操作系统)。另外,有ROOT权限后就可以运行一些需要root的软件。
     Root后,你可以做的事:
     a)运行更多的Linux命令(android ADB)和超级用户权限。
     b)可以使用许多需要root权限的软件(例如,钛备份,Root Explorer等)。
     c)更改某些重要的核心系统设置 。比如,关闭官方 Rom的安全校验以使我们可以刷写第三方固件,或者运行某些有趣的调节程序 比如说超频,再或者还可以让我们安装核心recovery程序。
3、root安全吗?
     是的。如果你胆大心细,按照教程来做,不会发生什么蛋疼的事。
4、root后会删除我的个人资料吗?
     不会。root仅仅是改变系统权限而已。
5、root会使我的保修失效吗?
     退一万步说,你可以unroot你的手机并恢复出厂设置,来假装什么事也没发生过。
6、root过程是可逆的吗?
     是的。只要你愿意完全可以unroot你的手机。

二、关于S-OFF和刷机
1、“S-OFF”是什么?“S-ON”和“S-OFF”有什么区别?我为何需要“S-OFF”?
    每一部手机缺省状态下都是“S-ON”。为了获取完全的写入权限(例如刷自制固件,装自制recovery工具),需要转换为“S-OFF”。
    通常手机都是处于“S-ON”(Security ON)状态,此时手机“/system”和“/recovery”分区无法被读写。最直接的表现就是如果用RE管理器等高权限文件管理器删除“/system”文件夹下的程序,重启后程序又会出现(这也好多网友说获得root后还是删除不了系统自带软件的原因);另外无法修改开机第一屏画面。
    S-OFF不同于root:S-OFF可以让你通过Bootloader里的Fastboot或者自制recovery(多数人用的都是clockwork)刷写自制固件。
2、如何“S-OFF”?
    目前有两种S-OFF的方法:
    a)通过安装工程模式 的hBoot来S-OFF。即所谓的软解。
    b)通过某些设备,例如白卡来S-OFF。即所谓白卡解锁。
    软解的手机进入Bootloader后第一行的末尾显示的是:ENG S-OFF,白卡解的手机则是:SHIP S-OFF。ENG意为engineering即工程模式,SHIP即意为原厂发布的。
3、如何改回“S-ON”?
    因某些原因(送去保修等)想要恢复S-ON的话,需要下载 对应你手机版本的HTC 官方刷写程序RUU刷回原厂固件。这样S-ON就回来了。
4、“RUU”是什么?
    RUU意为Rom Update Utility。是一个PC端的刷机工具。大多数RUU都是HTC官方发布的,其包含了刷机工具和官方固件,并打包为一个单独文件 。
5、什么是“Rom”?
    Rom意为Read Only Memory,他指手机的不可访问的只读的内部存储单元。他包含了android操作系统和所有原厂预装应用软件工具。
    通常一个完整的ROM(或者说固件)包含了:一个recovery镜像,一个boot镜像(包含了核心(Kernel)和ramdisk),一个系统镜像(操作系统,或者简称“OS”),和一个Radio镜像。
    我们也经常把可刷入手机内存 的镜像统称为ROM或固件。
6、什么是“Radio”?我们为何要刷Radio?
    一个合适的Radio可以改善我们手机的信号 、蓝牙、WiFi和GPS 。也许也可以提高手 机电池 的寿命。
7、什么是“刷机”?
    刷机就是把一个新的固件镜像刷入手机的内存里。
    你可以刷入一个recovery,或是一个boot,或系统,或Radio,或者是包含以上所有东西的完整Rom。
8、我为什么要刷机?
    刷机后:
    a)把你的手机更新到最新的官方固件(因为是官方的,所以无需root也无需S-OFF,也不会使保修失效)。
    b)把你的手机去除品牌定制化,变成通用的官方固件。
    c)刷入了自制固件,其:包含/去除HTC sense,其他android版本,等等。
    d)安装了更好用的recovery工具,比如clockwork。
    e)更合适的Radio。
9、刷机会删除我的个人资料吗?
    如果你仅仅是刷boot或者recovery的话,不会。
    但是如果你刷的是系统或者完整的Rom的话,会的。你个人的所有资料都会被清理掉,所以在刷机前请备份个人资料。
    在菜市场里有很多备份软件。(例如钛备份)
    你也可以备份NANDroid 。
10、刷机会使保修失效吗?
      同样的退一万步讲,如果你备份后原厂固件或是下载了对应你手机版本的固件的话,可以随时刷回去。
      同样,对于大多数的水货手机来说,一切保修都是浮云。
三、关于Bootloader和Recovery
1、何为“Bootloader”?
    Bootloader是一个Rom里的固件管理工具。使用它可以让你恢复出厂设置,用Fastboot刷机,加载Recovery工具。
    在Bootloader里你也可以查看S-ON/S-OFF的状态,固件和Radio的版本等等。
    进入Bootloader无需root或S-OFF。在每台HTC出厂的手机里都有。
2、如何进入Bootloader?
    关机,然后按住音量-和电源键。(需要把“快速开机 ”关闭,在“设置”》“应用程序”里改。或者拔掉电池,让手机真正的关机。)
    你可以直接拔电池来退出Bootloader。
    如果你装了自制recovery的话,可以进入recovery,然后重启手机。
3、如何备份我的当前ROM(固件)?
    在自制recovery里备份。
4、自制recovery是什么?
    自制recovery(比如clockwork)是一个增强的recovery版本,其替换了固件里原来的recovery。
    自制recovery比原厂的recovery要好,因为他可以让你可以安全的刷写未签名的自制rom,也可以备份你手机内存里的整个固件镜像(NANDroid备份)。
5、如何安装ClokworkMod (CWM)Recovery?
    你必须先root和S-OFF。然后用“Rom Manager”安装,或者单独下载clockwork recovery在ADB环境下手动刷写。
6、什么是NANDroid备份?
    一个完整的体统镜像可以被重新刷回手机。其不仅仅是简单备份,因为他包含了当前在你手机内存里的所有内容:Boot、Recovery、系统、数据、缓存,等。他是你手机整个ROM的快照。
    执行NANDroid备份的方法:进入clockwork recovery,进到“Backup and Restore”选项中执行。NANDroid备份将会被保存在sd卡ClockworkMod文件夹内。
7、如何加载NANDroid备份?
    如果你可以进入clockwork recovery的话,只需简单的从他的菜单里加载NANDroid。
    如果你的手机变砖从而无法进入clockwork recovery的话,也有最后一个方法:单独下载clockwork recovery至PC里,然后打开cmd控制台,进入存有clockwork recovery的目录,使用以下ADB命令刷写:“fastboot flash recovery recovery-clockwork-2.5.1.2-vision.img”。(前提是你的PC上有ADB环境,不过好像这招对白卡解锁的机器 无用)
8、什么是ADB?
    ADB意为Android Debug Bridge。其使用Linux命令对手机发出指令。你可以在MS-DOS环境下直接使用ADB命令,或者进入ADB shell使用Linux命令。通过ADB,你可以安装软件,卸载软件,刷写镜像,改变手机设置等。

G11 2.3.3 S-ON软解S-OFF

这个参照其它机友的经验修改壹些误导。。。。。。。。。
基本上都可以100%软解

在之前港版2.3.3上无法S-OFF,于是马上拿出我的金卡,刷回欧版的2.3.3.再次运行AlphaRevX,不到一分钟就提示S-OFF成功了!


刷机方法:(其实刷欧版的只是做S-OFF的一个跳板而已,不必在欧版上纠结,等成功S-OFF后,不就可以任刷第三方的rom吗?就算到时拿港版来做成s-off,难道你不也一样只是为了任刷第三方的rom吗?)

1.已更新到2.3的朋友,若你的rom不是欧版(WWE)的话,请用金卡刷回WWE版的2.3.3(不知道怎么用金卡刷的,可以去找下教程,很简单,附欧版的2.3.3下载:http://u.115.com/file/e61z0c8l)
2.安装HTC Sync,安装好后,连接手机,系统会自动帮你装上驱动。(安装完后,请将HTC SYNC关掉,win的系统,在右下角任务栏选择关掉即可,其实在安装完HTC SYNC后,不用去理它,在做软解时,不需要将它运行,其目的只是为了安装驱动而已)
3.取下数据线,关手机,进入手机的HBOOT后,再次连接好数据线,系统会再次为你装好驱动(其间还要按下电源键,其间可能系统会显示无法识别,可以直接PASS掉,不必在意这个,我刷时也一样提示)等系统没有提示安装驱动,待装好后,重启手机
4.重启手机后,连接好数据线,选择charge only(仅充电),确认。 刷完欧版的要记得打开USB调试哦,否则连不上手机哦。默认为关闭的

5.运行AlphaRevX软解程序(win7的用户,请用管理员的身份运行),等显示连接手机成功后,会让你输入你申请的S/N码所对应的KEY,输入完成后(有人问这S/N码如何得到,有三种方法查看,第一,关机,取出电池,看手机上的标签,就会看到S/N码了,目前多数是以HT开头的,第二种,进设置->关于手机->设备信息->设备序列号,最后一种方法,连接好手机,运行AlphaRevX程序后,会自动显示出来),回车,程序会自动帮你完成s-off。刚开始时,需等待一会(当初我还以为又象港版的那样,卡在这里了)10多秒后,就看到有提示了。直到显示SUCCESS-XXXXX(此处省略N多英文)

注意得出的S/N码所对应的KEY,只能复制》 然后粘上去才行,手工输往往报错。

好了,马上看看手机的HBOOT画面,看到没有,最上一行显示粉底白字的字样没有,那就恭喜你了,不过值得大家注意的话,S-OFF后,显示的HBOOT为1.09了,不再是2.3.3时的1.13了。这点请大家不用胆心,系统是没有什么任何问题。还有一点需要说明的是,若今后刷回官方的ruu后,就会变为s-on了(刷第三方的rom不会)。这个比以前用G7做s-off简单多了,又不需要刻盘或制作启动U盘或虚拟机来做了,也不必再为好做S-OFF时,被替换第一屏的画面而去修改了!
怎么申请KEY,其实很简单,进入http://alpharev.nl/x/beta/网站后,点击Download for Windows,就会弹出一个获取KEY的画面,选择你手机的型号.HBOOT版本,输入你的手机的S/N码后,点击generate key按钮,就会得到一组英文+数字的key,在运行AlpharevX后,能正确连接你的手机,此时画面会显示你的手机型号,HBOOT版本,S/N,再输入刚才申请的KEY,注意大小字哦