2016年9月12日星期一

[NodeJS for Android]预编译好的二进制文件

一步步搭积木终于搞完了。目前只放了个6.5.0和7.4.0版,重复利用环境切换到其他版本编译很轻松。


预编译好的二进制文件,可以直接从这里下载了: https://github.com/sjitech/nodejs-android-prebuilt-binaries
-full结尾的版本表示完全版,就时什么功能都没去掉,否则就是只限版,用了--without-snapshot --without-inspector --without-intl选项的那种,一般使用不要紧,而且尺寸小。
需要自己编译的,可以用这个快速环境(是个Docker容器,名叫osexp2000/build-nodejs-for-android),具体的用法可以看 https://github.com/sjitech/build-nodejs-for-android#docker-images
由于使用了CCACHE,在6.5.0和7.4.0版的编译时产生了缓存了,所以如果自己git checkout v6.4.0之类的再编译时,应该依然有很多不变的文件可以利用缓存。
对于将来的版本,编译full版时有时可能会失败(Inspector之类的实验模块里的代码错误之类的),
不过Limited版倒是比较稳定,还没发现失败过(当然前提都是用android-gcc-toolchain这个工具)。
如果是std::string之类的C++名字连接找不到之类的错误,那可以给build-nodejs-for-android命令加个参数--stl libc++八成就行了。

2016年9月8日星期四

在有密码且Root证书替换的Proxy环境里使用docker-machine

1. 解决HttpProxy密码自动输入问题

先用自己以前做的https://github.com/sjitech/proxy-login-automator工具,做个假的本机Proxy,通过它来和真的Proxy server打交道,这之中自动的插入密码。
node proxy-login-automator.js \
-local_host "*" \
-local_port 65525 \
-remote_host RealHost \
-remote_port 80 \
-usr ProxyUserIdHerer \
-pwd ProxyPasswordHere \
-as_pac_server true
而且HttpProxy Server提供的是PAC(Proxy auto configuration)文件,所以指定as_pac_server true。
然后访问一下Internet ,看看这个工具里显示说用什么临时端口来做那个范围的ip的Proxy,记住这个端口,例如65526。
-local_host "*" 指定很重要,因为我要侦听docker-machie的bridge网卡192.168.99.1。

2. 然后创建docker-machine。

这里设定HTTP_PROXY让docker虚拟机记住。
docker-machine create -d virtualbox \
--engine-env HTTP_PROXY=http://192.168.99.1:65526 \
--engine-env HTTPS_PROXY=http://192.168.99.1:65526 \
--engine-env N O_PROXY="localhost,127.0.0.1,192.168.99.*" \
--virtualbox-disk-size "100000" \
--virtualbox-cpu-count 2 \
--virtualbox-memory 1500 \
default
这样一搞,docker的确可以run了,但是,说不受信赖的内容,证书不接受什么的错误。原来是这个ProxyServer为了监控包括SSL通信的内容,替换了顶级证书做了中间人中转了。

3. 把ProxyServer的证书导入到docker-machine里。

  1. 在Browser或者certmgr里把Proxy Server的证书导出成 "BASE64 cer",然后改后缀名为PEM。
  2. 把PEM文件copy到docker-machine里。
     docker-machine ssh <<<"
     cd /var/lib/boot2docker/
     sudo mkdir certs
     sudo cp /c/Users/Download/THE_PEM_FILE.pem certs/
     "
    
     docker-machine restart
    
    这才好了。