2016年12月9日 星期五

废物利用老旧安卓平板流水账(二):交叉编译shadowsocks


在上一篇流水账中我已经有了个能用的ROM,然而这个android系统还是太老了,在这个系统上并不能支持最新版的shadowsocks安卓app,而旧版本的shadowsocks没有自带kcptun,不知道为什么也没法通过我手工启动的kcptun连上服务器。所以只好放弃使用app,手工编译一个ARM指令集的native shadowsocks客户端程序。

这篇包含两部分,前一部分是使用NDK交叉编译shadowsocks-libev,后一部分是使用go交叉编译shadowsocks-go

使用NDK交叉编译shadowsocks-libev:

由于这是一次失败的尝试,同时我在写这篇文章的时候也是在回忆了,所以这部分重心放在记述如何使用NDK交叉编译可以运行在androidnative程序而不是ss,有些细节可能略过了。
首先需要去这里下载一份NDK。由于我只是需要交叉编译个native程序而已,并不是要搞app开发,所以只要使用standalone toolchain就好。
按照这里的步骤NDK创建出适用于自己的android平台的standalone toolchain。如果直接使用ndk目录内的toolchain你可能会遇到像这里或者这里还有这里遇到的诸如“fatal error: string: No such file or directory”或者“undefined reference to `std::basic_string”之类的编译错误,由于我们不是android工程没有使用ndk-build所以创建Application.mk文件的办法并不管用。
之后编译opensslpcrelib库,在执行configure之前先设置环境变量让make的时候使用我们的toolchain(将'/my-android-toolchain-path替换为你的toolchain目录):

export ANDROID_TOOLCHAIN='/my-android-toolchain-path/'
export CC=${ANDROID_TOOLCHAIN}/bin/'arm-linux-androideabi-gcc --sysroot='${ANDROID_TOOLCHAIN}/sysroot
export CXX=${ANDROID_TOOLCHAIN}/bin/'arm-linux-androideabi-g++ --sysroot='${ANDROID_TOOLCHAIN}/sysroot
export CCLD=${ANDROID_TOOLCHAIN}/bin/arm-linux-androideabi-ld
export AR=${ANDROID_TOOLCHAIN}/bin/arm-linux-androideabi-ar
export AS=${ANDROID_TOOLCHAIN}/bin/arm-linux-androideabi-as
export RANLIB=${ANDROID_TOOLCHAIN}/bin/arm-linux-androideabi-ranlib

configure的时候记得添加这几项:
--host=arm-linux 指定编译目标系统环境
--with-sysroot=/my-android-toolchain-path/sysroot 指定sysroottoolchain
--prefix=/my-android-toolchain/sysroot/usr 指定安装目录到toolchain

之后编译shadowsocks-libev仍然并不顺利,因为这个工程并没有做好在NDK编译的工作,指定-DANDROID,手工添加编译ancillary和添加-llog引用等一系列工作完成后编译出来的程序并不能正常工作,于是我把视野转向了shadowsocks-go

交叉编译shadowsocks-go:

其实如果COW或者MEOW这种自动化的工具更合你的口味的话,你完全不需要自己去编译shadowsocks-go,因为他们都提供了ARM版本的bin。而对于我来说,他们都不是我的菜。
由于我完全没有go编程经验,所以我这里的一些对go的理解很可能是错误的,请自行思考并有选择的接受我的看法。
Go的交叉编译很简单,按照下面的顺序执行即可:
yum install -y golang
安装go

export GOARCH=arm
指定go编译的指令集

https_server=127.0.0.1:1234 go get github.com/shadowsocks/shadowsocks-go/cmd/shadowsocks-local
因为golang.org被墙了,所以这里指定了https代理服务器127.0.0.1:1234

之后就可以在/lib/golang/bin/linux_arm路径下找到arm版的shadowsocks-go了。

接下来我做了什么?在平版上安装了ssh服务,然后结合kcptun + shadowsocks-go + privoxy搞了个内网公用服务器。这三个组合起来在安卓上搞内网服务并没有啥难度,我不确定会不会单开一篇详述。另外最近才发现privoxy真的很强大呢,完全超越了PAC的灵活性(见这里这里

沒有留言:

張貼留言