在这方面做的最好的当然是Mac OS X, 另外一台macbook air合上盖子自动休眠,打开立刻恢复, 用户体验上非常流畅。 而在ubuntu 12.04下面就没有这么好的感觉了, 最坏的地方是,x220上面默认的合上盖上是关闭显示,而我有外接显示器和键盘鼠标,因此只要桌面有一点点晃动,碰到了鼠标,显示器立刻就亮了,这点很无语。
因此虽然我不敢期待它能达到MBA的体验,但是还是希望能有最基本的体验:合上盖子,迅速待机;打开,立刻恢复,最好都在5s以内完成。linux下的休眠工具是pm-utils的速度和体验最好,因此我就希望用pm-suspend命令劫持合上盖子的事件。 通过不断google搜索以后,基本实现。
先使用acpi_listen获取了合上盖子的事件, 然后发现触发的脚本是/etc/acpi/events/lidbtn, 本来默认使用/etc/acpi/lid.sh处理事件, 我替换为pmutils, 如下:

# /etc/acpi/events/lidbtn
# Called when the user closes or opens the lid

#event=button[ /]lid
#action=/etc/acpi/lid.sh
event=button[ /]lid LID close
action=/usr/sbin/pm-suspend

接着,优化了一下pm-utils的设置, 添加配置文件/etc/pm/config.d/00-use-suspend-hybrid :

# Always use suspend_hybrid instead of suspend
if [ "$METHOD" = "suspend" ]; then
  METHOD=suspend_hybrid
fi
# The delay after which hibernation gets triggered (default: 900 seconds, 15 minutes):
PM_HIBERNATE_DELAY=900

默认使用suspend_hybrid实现待机, 如果待机超过15分钟,从待机变成休眠。

如此一来,算是完美实现了我想要的功能和效果。

ubuntu12下flash全屏看视频太卡了,而且温度也高。所以考虑开始intel的vaapi进行硬件加速。下面就记录下操作步骤。

首先安装aapi

sudo apt-get install libva-intel-vaapi-driver

然后安装vdpau前端

sudo add-apt-repository ppa:nilarimogard/webupd8
sudo apt-get update
sudo apt-get install libvdpau-va-gl1

修改adobe配置

$cat /etc/adobe/mms.cfg 
EnableLinuxHWVideoDecode=1
OverrideGPUValidation=1

这时候vainfo可以 看到vaapi的信息,
VDPAU_DRIVER=va_gl vdpauinfo可以检测到vdpau是否正确。

这样执行VDPAU_DRIVER=va_gl firefox就能全屏流畅看视频了。

另外如果有安装xcompmgr或者compton这类淡入淡出和阴影特效的软件时,全屏可能还会有一定的卡顿, XLIB_SKIP_ARGB_VISUALS=1 这个配置就OK了。

PS: XLIB_SKIP_ARGB_VISUALS=1 这个参数会导致compton下,Docky或者输入法的菜单阴影有黑色的方块,因此放弃。//2015-3-4

android编译支持ssl的libcurl

首先,按照http://zhigang.net/2013/08/yi-zhi-libcurldao-android-ndk.html,生成ndk编译环境:

 ~/dev/android-ndk-r8b/build/tools/make-standalone-toolchain.sh --install-dir=/tmp/ndk --platform=android-8

配置编译环境:
PATH=$PATH:/tmp/ndk/bin

LDFLAGS="-L /tmp/ndk/sysroot/usr/lib"
CPPFLAGS="-I /tmp/ndk/sysroot/usr/include/"
(以上两个有时候可以省略,或者靠指定 --sysroot解决。)
然后下载curl的源代码 http://curl.haxx.se/download.html

此时,不支持ssl的curl已经可以直接编译了:

./configure --host=arm-linux-androideabi ....
make

但是要加上ssl支持的话,
按照http://stackoverflow.com/questions/11330180/porting-libcurl-on-android-with-ssl-support, 到https://github.com/guardianproject/openssl-android 下载一个openssl,然后用ndk-build编译, 把libssl.solibcrypt.so放到/tmp/ndk/sysroot/usr/lib, 把include 放到 /tmp/ndk/sysroot/usr/include/.
然后编译的选项指定加入--with-ssl (如果是其他路径, 配置为 --with-ssl=<PATH>)

./configure --host=arm-linux-androideabi \
--with-ssl \
--disable-ftp \
--disable-gopher \
--disable-file \
--disable-imap \
--disable-ldap \
--disable-ldaps \
--disable-pop3 \
--disable-proxy \
--disable-rtsp \
--disable-smtp \
--disable-telnet \
--disable-tftp \
--without-gnutls \
--without-libidn \
--without-librtmp \
--disable-dict

config结果:

  curl version:     7.36.0
  Host setup:       arm-unknown-linux-androideabi
  Install prefix:   /usr/local
  Compiler:         arm-linux-androideabi-gcc
  SSL support:      enabled (OpenSSL)
  SSH support:      no      (--with-libssh2)
  zlib support:     enabled
  GSS-API support:  no      (--with-gssapi)
  SPNEGO support:   no      (--with-spnego)
  TLS-SRP support:  no      (--enable-tls-srp)
  resolver:         default (--enable-ares / --enable-threaded-resolver)
  ipv6 support:     no      (--enable-ipv6)
  IDN support:      no      (--with-{libidn,winidn})
  Build libcurl:    Shared=yes, Static=yes
  Built-in manual:  enabled
  --libcurl option: enabled (--disable-libcurl-option)
  Verbose errors:   enabled (--disable-verbose)
  SSPI support:     no      (--enable-sspi)
  ca cert bundle:   no
  ca cert path:     no
  LDAP support:     no      (--enable-ldap / --with-ldap-lib / --with-lber-lib)
  LDAPS support:    no      (--enable-ldaps)
  RTSP support:     no      (--enable-rtsp)
  RTMP support:     no      (--with-librtmp)
  metalink support: no      (--with-libmetalink)
  HTTP2 support:    disabled (--with-nghttp2)
  Protocols:        HTTP HTTPS

支持httphttps了。

make编译时,发现可以生成lib/.libs/libcurl.so了,但是静态文件libcurl.a 失败,

/tmp/ndk/bin/../lib/gcc/arm-linux-androideabi/4.6.x-google/../../../../arm-linux-androideabi/bin/ld: warning: libssl.so, needed by ../lib/.libs/libcurl.so, not found (try using -rpath or -rpath-link)
/tmp/ndk/bin/../lib/gcc/arm-linux-androideabi/4.6.x-google/../../../../arm-linux-androideabi/bin/ld: warning: libcrypto.so, needed by ../lib/.libs/libcurl.so, not found (try using -rpath or -rpath-link)

可以指定 -rpath-link

LIBS=" -Wl,-rpath-link=/tmp/ndk/sysroot/usr/lib" ./configure ....
make -j4

然后就编译完成了。

今天在写java读取gzip文件时,发现一直有问题,于是写了一段测试程序不断debug和验证。
测试代码大致是这样的:

    FileInputStream in = new FileInputStream("/tmp/from_gz");
    BufferedInputStream  bis = new BufferedInputStream(new GZIPInputStream(in));
    bis.skip(12568);
    IOUtils.copy(bis, new FileOutputStream("/tmp/outfile"));

经过测试发现,在PC上执行这段代码,生成的/tmp/outfile和预期文件是一致的,md5也吻合。但是在android上,生成的/tmp/outfile却截然不同,难道是android的GZIPInputStream有bug???

自己也觉得不太可能。于是一步步debug和分析了很久,去掉了GZIPInputStream包装,直接skip然后发现生成的两个md5是一样的。看来,原因就在于GZIPInputStream和skip。

后来想到以前遇到过的,在C语言下,调用read()函数去读取一个socket/pipe时,尽管你“期望”读取1024字节,但是也许read函数只返回800字节。我查看了skip函数的javadoc,发现果然有返回值long,进而猜测在android下,这个skip没有按照预期去skip掉12568这个“大”的一个数值。输出skip的返回值,果然只skip了564字节。分析其原因,在PC下OK应该是由于x86的系统有很强的cpu和内存,所以gzip对这个stream完全不是瓶颈,而android的arm平台则不一样,需要一边decode一边生成BufferedInputStream可以read的数据,而这时skip的速度快的多,因此超过了decode的速度。

看来,写任何IO的代码,包括磁盘和网络,都得时刻考虑性能和IO瓶颈的问题。

android下的zeromq包有两个,纯java的JeroMQ和jni方式的jzmq.我自己选择了jzmq,然后libzmq使用stable的3.x.

下载zeromq,

git clone https://github.com/zeromq/zeromq3-x.git

编译:

OUTPUT_DIR=/tmp/zeromq-android
./autogen.sh
./configure  --disable-shared --host=arm-linux-androideabi --enable-static  LIBS="-lgcc"  CPPFLAGS="-fPIC -I /tmp/ndk/arm-linux-androideabi/include/c++/4.6/ -I /tmp/ndk/arm-linux-androideabi/include/c++/4.6/arm-linux-androideabi -L  /tmp/ndk/arm-linux-androideabi/lib" --prefix=/tmp/zeromq-android/
make
make install

然后是jzmq:

git clone https://github.com/zeromq/jzmq.git
./autogen.sh
./configure --host=arm-linux-androideabi --prefix=$OUTPUT_DIR --with-zeromq=$OUTPUT_DIR CPPFLAGS="-fPIC -I$OUTPUT_DIR/include" LDFLAGS="-L$OUTPUT_DIR/lib" --disable-version LIBS="-lpthread -lrt"
make
make install

如果编译有问题,去除LIBS="-lpthread -lrt"
最后在/tmp/zeromq-android目录得到: libjzmq.so,libzmq.a,zmq.jar, 用strip压缩libjzmq.so, 就可以放到libs下使用了。