在上一篇流水账中我已经有了个能用的ROM,然而这个android系统还是太老了,在这个系统上并不能支持最新版的shadowsocks安卓app,而旧版本的shadowsocks没有自带kcptun,不知道为什么也没法通过我手工启动的kcptun连上服务器。所以只好放弃使用app,手工编译一个ARM指令集的native shadowsocks客户端程序。
这篇包含两部分,前一部分是使用NDK交叉编译shadowsocks-libev,后一部分是使用go交叉编译shadowsocks-go。
使用NDK交叉编译shadowsocks-libev:
由于这是一次失败的尝试,同时我在写这篇文章的时候也是在回忆了,所以这部分重心放在记述如何使用NDK交叉编译可以运行在android的native程序而不是ss,有些细节可能略过了。
按照这里的步骤从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文件的办法并不管用。
之后编译openssl,pcre等lib库,在执行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的时候记得添加这几项:
l --host=arm-linux 指定编译目标系统环境
l --with-sysroot=/my-android-toolchain-path/sysroot 指定sysroot到toolchain
l --prefix=/my-android-toolchain/sysroot/usr 指定安装目录到toolchain
之后编译shadowsocks-libev仍然并不顺利,因为这个工程并没有做好在NDK编译的工作,指定-DANDROID,手工添加编译ancillary和添加-llog引用等一系列工作完成后编译出来的程序并不能正常工作,于是我把视野转向了shadowsocks-go。
交叉编译shadowsocks-go:
由于我完全没有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了。
沒有留言:
張貼留言