初探shadowsocks-android:源码编译打包

(Last Updated On: 2018-10-30)

ss-android版源码已经经历了很多版本了,从之前的Scala到Kotlin,也没怎么看过源码,最近刚好想看看Kotlin,顺便拿它来研究一下,从客户端角度看看proxy、socks5。当然里面还涉及C、go、BashShell等等,能了解到不少东西,也可以编译一个属于自己的版本,去广告,加默认节点等。步骤按照项目说明就行,只是中间还是有些错综复杂的情况,这里记录一下。基于shadowsocks-android V4.6.1,将来或早期版本未必适用,可以参照具体版本的Readme。

0.准备

  • 项目地址:https://github.com/shadowsocks/shadowsocks-android
  • JDK 1.8
  • Go 1.4+
  • Android SDK
    • Build Tools 27+
    • Android NDK r16+
  • 编辑器推荐AndroidStudio
  • 环境变量ANDROID_HOME 设置到sdk目录如 /path/to/android-sdk
  • 环境变量ANDROID_NDK_HOME 设置到ndk目录如 /path/to/android-ndk
  • 环境变量GOROOT_BOOTSTRAP 设置到go目录 /path/to/go

本人的AndroidStudio版本3.1.3,gradle版本4.9-all,go随便用的1.10.3,其他直接用项目默认的配置。

1.下载源码

可以直接连同子模块一起clone:

git clone --recurse-submodules <repo>  

也可以先clone主干:git clone <repo>,再更新拉取子模块:

git submodule update --init --recursive

本人使用的是后者,因为一开始并不知道有子模块。

主干是android项目,module是核心依赖core目录下的go和overture。

  • overture是用go写的DNS服务器/调度器
  • go其实是go语言的一个镜像

2.编译core

编译之前,还需要把AndroidStudio相关的配置和依赖适配好,gradle无明显报错。使用AndroidStudio里的core:build gradle脚本进行编译

报错1:Set $GOROOT_BOOTSTRAP to a working Go tree >= Go 1.4

overture/go/src/make.sh 默认是用户目录下的go1.4,如果使用的是更高的版本或者不同的版本,需要去设置一下,比如我装的go1.10.3在/usr/local/go,也可以直接替换成go目录。

#export GOROOT_BOOTSTRAP=${GOROOT_BOOTSTRAP:-$HOME/go1.4}
#export GOROOT_BOOTSTARP=${GOROOT_BOOTSTRAP:-$HOME/go}
export GOROOT_BOOTSTRAP=${GOROOT_BOOTSTRAP}

报错2:go get “…golang.org/x/net/…” timeout

由于你懂的原因,golang.org里的crypto、net、text模块等无法正常下载,搜索了一些解决方案:

  1. 就是给git设置代理,给terminal设置代理,ss开启全局没作用,也可以试试将AndroidStudio也设置代理(搞来搞去没解决,就用替代方案了)
  2. github.com/golang   下有各个模块的项目,可以直接下载或者clone后放到GOPATH下的src下的golang.org/x/…相应目录,也可以替换到项目的go/src下,build的时候都会检索到。

build成功后,得到各种依赖。

> Task :core:javaPreCompileDebugUnitTest 
> Task :core:compileDebugUnitTestJavaWithJavac NO-SOURCE 
> Task :core:processDebugUnitTestJavaRes NO-SOURCE
> Task :core:transformClassesAndResourcesWithPrepareIntermediateJarsForDebug 
> Task :core:testDebugUnitTest NO-SOURCE 
> Task :core:generateReleaseUnitTestSources UP-TO-DATE 
> Task :core:preReleaseUnitTestBuild UP-TO-DATE 
> Task :core:javaPreCompileReleaseUnitTest 
> Task :core:compileReleaseUnitTestJavaWithJavac NO-SOURCE 
> Task :core:processReleaseUnitTestJavaRes NO-SOURCE 
> Task :core:transformClassesAndResourcesWithPrepareIntermediateJarsForRelease 
> Task :core:testReleaseUnitTest NO-SOURCE 
> Task :core:test UP-TO-DATE 
> Task :core:check 
> Task :core:build BUILD SUCCESSFUL in 1m 20s 90 
actionable tasks: 50 executed, 40 up-to-date 
Task execution finished 'build'.

2.打包apk

使用AndroidStudio里的mobile:assembleDebug/assembleRelease脚本打包,debug默认使用debug证书,release需要自己生成证书。

打包成功会在mobile/build/outputs/apk/下有几个apk,分别对应各种架构的手机设备,universal为通用包,包含其他的架构,所以包大小也比其他的包大了几M。

3.测试和其他

将包安装到手机即可,如果证书不一致,包名也没改的话,不能和原版进行覆盖,属于2个完全不同的App。需要先卸载原版再安装。使用起来与原版没有什么差别。

本人尽可能将遇到的问题记录下来,部分细节如安装go,安装ndk等略过,可以自行查资料,欢迎指教。

2018-08-28更新 可以build、打包,不能直接run

报错Cause:java.lang.NullPointerException,具体展开报错信息提示:mobile:transformClassesWithInstantRunForDebug 这里报红,估计是InstantRun出问题,到preference -> build -> instantRun 暂时关闭,即可。但是具体能不能兼容instant run ,还需要进一步验证。

《初探shadowsocks-android:源码编译打包》有11个想法

  1. 楼主 Android studio 编译错误, 代码是直接从 github 上下载下来的

    1. macOS,苹果系统,go和Android Studio在各个系统都有对应的版本,使用差异不会太大

  2. win10 android studio 3.* 编译 *core:goBuild error 好像没有go android studio 无法安装golang 你这个是在win平台编译吗?

    1. 感谢提醒,其实编辑的时候是“- -”,显示会合成一条长一点的“一”,以后还是用代码模式来编辑这部分。

  3. BUILD SUCCESSFUL in 5m 36s
    106 actionable tasks: 18 executed, 88 up-to-date
    20:48:16: Task execution finished ‘build’.

    5m 36s
    5m 36s
    5m 36s

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Solve : *
20 + 4 =


此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据