V2ray-core: v2ctl 怎么做精简编译呢,不能手动一次转换,永远不变

Created on 21 Jan 2019  ·  10Comments  ·  Source: v2ray/v2ray-core

最近在把 v2ray 集成到 openwrt 里面去,flash 只有 16MB ,用 squashfs (自带压缩的文件系统)

v2ray 可以通过修改 main/distro/all/all.go 文件,去除不需要的模块,从而实现精简编译

可是 v2ctl 依然太大了(13MB多),我们用 v2ctl 只是把 json 转换成 pronbuf 格式,就是一次性的操作而已,没必要占用这么大存储

请教一下, 应该修改哪个文件,可以实现把 v2ctl 精简编译,去除不需要的功能,只需要一个转化json格式就足够了

之前有人建议 "你可以尝试手工执行v2ctl convert把你配置的json转换成protobuf,命名为xxx.pb,这样调用v2ray -config xxx.pb就不会调用v2ctl了。虽然麻烦了一步但是可以省下十几M空间"

我这个是集成到 openwrt 里面, 用户是可以修改配置的,也就是说,用户自己配置 json,然后动态运行,不是固定写死不变的,所以没法手动转换,然后永远不变的让用户就使用同一个配置

还是需要精简编译 v2ctl ,请问应该如何操作呢?

谢谢

Most helpful comment

@qiang-yu 我今天尝试写了一下,程序内生成配置(也就是最终只有一个文件),包含inbound: {socks, http},outbound: {vmess over wss, freedom},gfwlist路由,win64的exe大概8m。我是打算自己拿来当便携式的翻墙工具用,你需要我可以放源码出来大家做参考。

All 10 comments

@qiang-yu 一样配置main/distro/all/all.go, 里面有这样几行:

    // JSON config support. Choose only one from the two below.
    // The following line loads JSON from v2ctl
    _ "v2ray.com/core/main/json"
    // The following line loads JSON internally
    // _ "v2ray.com/core/main/jsonem"

意思是选择下面的包就会内置解释json配置,不依赖v2ctl了。

感觉目前的问题主要在于v2ctl序列化时引用了core的整个包, 而不是仅仅只是*.pb.go的代码, 而这会再次引入之前移除的包, 并间接引入quic/websocket/http/...的所有实现(已从all.go中移除), 造成v2ctl不必要的增大, 不管是使用jsonem还是外置的v2ctl都是如此. 不过感觉改起来很麻烦的样子.

https://github.com/v2ray/ext/blob/v4.13.0/tools/conf/transport_internet.go#L8-L17
https://github.com/v2ray/ext/blob/v4.13.0/tools/conf/api.go#L6-L9同理
@VictoriaRaymond @liberal-boy

多谢,已经解决这个问题了

就是楼上说的,用 jsonem,这样只需要一个 v2ray 不需要 v2ctl 了,虽然依然有 13MB 那么大,但是总好过 v2ray + v2ctl 两个一起更大

@qiang-yu 我今天尝试写了一下,程序内生成配置(也就是最终只有一个文件),包含inbound: {socks, http},outbound: {vmess over wss, freedom},gfwlist路由,win64的exe大概8m。我是打算自己拿来当便携式的翻墙工具用,你需要我可以放源码出来大家做参考。

@liberal-boy 期待啊!

说真的,由于v2ctl依赖了整个core包,使得v2ctl的文件内部实际上包含了v2ray这个可执行文件的几乎所有代码,只不过缺一个入口罢了,这样是不是有点浪费空间呢(虽然在PC上十几M算不了什么),而且本来想达到的解耦合的目的也没有真正的实现

解耦合是为了core足够小,而不是为了平均分配

我只是觉得从源码上拆分core和json部分的确是挺好的,不过最后在编译的时候单独编译出一个内部包含了v2ray的所有功能,却只能用来做配置文件的格式检查和转换的v2ctl,这样的行为是不是有点奇怪,虽然全静态编译是golang的特性之一。
我倒是有一条不算成熟的建议,可以编译出一个不含v2ctl功能的v2ray-core,以及一个全功能的v2ray,把v2ctl作为一个软连接指向v2ray即可,当然这么做还是有点奇怪,要是能把v2ctl对core部分的依赖减弱那是最好的,这样也能更好的解决本issue的问题

@qiang-yu 我今天尝试写了一下,程序内生成配置(也就是最终只有一个文件),包含inbound: {socks, http},outbound: {vmess over wss, freedom},gfwlist路由,win64的exe大概8m。我是打算自己拿来当便携式的翻墙工具用,你需要我可以放源码出来大家做参考。

这个做法非常不错呢,把配置也打包进去编译成一个文件。可以放代码上来参考吗

Was this page helpful?
0 / 5 - 0 ratings