The universal proxy toolchain for Android, written in Kotlin.

Overview

SagerNet for Android

API Releases Language: Kotlin License: GPL-3.0

The universal proxy toolchain for Android, written in Kotlin.

DOCUMENTS

https://sagernet.org

Protocols

The application is designed to be used whenever possible.

Proxy

  • SOCKS
  • HTTP(S)
  • Shadowsocks
  • ShadowsocksR
  • VMess
  • VLESS
  • Trojan
  • Trojan-Go ( trojan-go-plugin )
  • NaïveProxy ( naive-plugin )
  • relaybaton ( relaybaton-plugin )
  • Brook ( brook-plugin )
ROOT required
  • Ping Tunnel ( pingtunnel-plugin )

Subscription

  • Universal base64 format
  • Shadowsocks SIP008
  • Just My Socks' proprietary format
  • Clash

Features

  • Full basic features
  • V2Ray WebSocket browser forwarding
  • Option to change the notification update interval
  • A Chinese apps scanner (based on dex classpath scanning, so it may be slower)
  • Proxy chain
  • Balancer
  • Advanced routing with outbound profile selection
  • Reverse proxy
  • Custom config (V2Ray / Trojan-Go)

OPEN SOURCE LICENSES

LICENSE

Copyright (C) 2021 by nekohasekai 
Copyright (C) 2017-2021 by Max Lv 
Copyright (C) 2017-2021 by Mygod Studio 

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see .
Issues
  • Reproducible builds for Naive

    Reproducible builds for Naive

    Chromium supports reproducible builds, which mean the built output will be binary identical given the same source code. This offers some security benefit that allows third parties to verify build integrity. In this case, the Android builds of NaiveProxy can be verified using sha256 sums between multiple independent builders (though it's possible to have different sums if the Android NDK version is different).

    I have updated my workflow so it will produce an artifact containing the sha256 sums of all platforms, https://github.com/klzgrad/naiveproxy/actions/runs/868812522. When the user downloads naive-plugin apk from here, he should be able to verify the libnaive.so binary using the checksums from upstream artifacts. Or the upstream builds can be cross checked using build checksums from here.

    Workflow artifacts instead of release attachments are used to store the checksums because release attachments can be edited by project collaborators, so in theory I can put any rogue stuff there after the build. But workflow artifacts seem to be immutable once the workflow runs from a certain commit. If the GitHub infrastructure can be trusted, then the integrity of the checksum artifacts can be trusted, then the integrity of the binaries can be verified across projects to ensure there is no supply chain attack. The trust model here is this: the GitHub infra is trusted, the source code of a given version is trusted assuming adequate review, individual project members are not trusted as they can manually upload arbitrary release attachments at a arbitrary later date (this condition precludes use of GPG signatures).

    The only limitation is artifacts are saved only for 90 days. But I can't find another trusted platform for storing immutable data.

    In summary, I'm asking for SagerNet to also produce checksums for Naive plugin builds so they can be checked against upstream checksums. I'm also open to better idea of verifying integrity of release binaries.

    enhancement 
    opened by klzgrad 15
  • Optimize TCP DNS setup

    Optimize TCP DNS setup

    I try to have a setup for minimum latency DNS resolution. Alternatives: 1. FakeDNS creates much trouble in fixing its stale results. 2. DNS over HTTPS takes too much time, like several RTTs.

    In principle the process goes like this: [UDP *:53 -> tun2socks -> v2fly dns module -> TCP my_resolver:53] -> [Socks5 -> existing TLS tunnel] -> [Server -> TCP my_resolver:53]. The first segment happens only locally. The majority of latency is in the second TLS segment. The last segment takes little time but still could also use a little caching to improve latency. With TCP DNS queries, the second segment will only take 1 RTT instead of 3 or more RTTs with HTTPS handshakes.

    The above design does not work now.

    First test:

    • Routes: No routes; DNS Mode: Local, Local DNS: tcp://8.8.8.8:53, Enable domestic DNS: false
    • Actual: The first segment connects directly to 8.8.8.8 without entering the second and third segment.

    Second test:

    • Routes: {ip:8.8.8.8 port:53 outbound:out}; DNS Mode: Local, Local DNS: tcp://8.8.8.8:53, Enable domestic DNS: false
    • Actual: (Same as before) The first segment connects directly to 8.8.8.8 without entering the second and third segment.
    logcat of the second test
    {
      "dns": {
        "hosts": {
          "domain:googleapis.cn": "googleapis.com"
        },
        "servers": [
          "tcp://8.8.8.8:53"
        ]
      },
      "inbounds": [
        {
          "listen": "127.0.0.1",
          "port": 2080,
          "protocol": "socks",
          "settings": {
            "auth": "noauth",
            "udp": true,
            "userLevel": 8
          },
          "tag": "in"
        },
        {
          "listen": "127.0.0.1",
          "port": 6450,
          "protocol": "dokodemo-door",
          "settings": {
            "address": "tcp://8.8.8.8:53",
            "network": "tcp,udp",
            "port": 53
          },
          "tag": "dns-in"
        }
      ],
      "log": {
        "loglevel": "warning"
      },
      "outbounds": [
        {
          "protocol": "socks",
          "settings": {
            "servers": [
              {
                "address": "127.0.0.1",
                "port": 2090
              }
            ]
          },
          "tag": "out"
        },
        {
          "protocol": "freedom",
          "tag": "bypass"
        },
        {
          "protocol": "blackhole",
          "settings": {
            "response": {
              "type": "http"
            }
          },
          "tag": "block"
        },
        {
          "protocol": "dns",
          "tag": "dns-out"
        }
      ],
      "policy": {
        "levels": {
          "8": {
            "connIdle": 300,
            "downlinkOnly": 1,
            "handshake": 4,
            "uplinkOnly": 1
          }
        },
        "system": {
          "statsOutboundDownlink": true,
          "statsOutboundUplink": true
        }
      },
      "routing": {
        "domainMatcher": "mph",
        "domainStrategy": "IPIfNonMatch",
        "rules": [
          {
            "inboundTag": [
              "dns-in"
            ],
            "outboundTag": "dns-out",
            "type": "field"
          },
          {
            "outboundTag": "dns-out",
            "port": "53",
            "type": "field"
          },
          {
            "ip": [
              "geoip:private"
            ],
            "outboundTag": "bypass",
            "type": "field"
          },
          {
            "domain": [
              "example.com"
            ],
            "outboundTag": "bypass",
            "type": "field"
          },
          {
            "ip": [
              "8.8.8.8"
            ],
            "network": "tcp",
            "outboundTag": "out",
            "type": "field"
          }
        ]
      },
      "stats": {}
    }
    

    Third test:

    • Routes: ip:127.0.0.1 outbound:out; DNS Mode: Local, Local DNS: tcp://127.0.0.1:5353, Enable domestic DNS: false
    • Actual: The TCP DNS query was proxied in the TLS tunnel.

    I think the builtin route rule {"outboundTag": "dns-out", "port": "53", "type": "field"} has overridden the later rule of ip:8.8.8.8.

    Desired changes:

    1. DNS of tcp://my_resolver:53 is properly tunneled.
    2. Create associated route rules for the TCP DNS setting without user intervention.
    enhancement 
    opened by klzgrad 9
  • Spotify不能被代理

    Spotify不能被代理

    Describe the bug A clear and concise description of what the bug is. 尝试了各种设置方式,Spotify都不能被代理,显示离线。

    To Reproduce Steps to reproduce the behavior:

    1. 打开sagernet
    2. 打开Spotify

    Logcat `SagerNet 0.1-rc21 (76) on API 30 ABI arm64-v8a (arm64-v8a, armeabi-v7a, armeabi) --------- beginning of system 06-12 11:47:58.843 30379 30379 D ViewRootImpl: enqueueInputEventMotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=801.7423, y[0]=1264.527, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566816160, downTime=566816160, deviceId=2, source=0x1002, displayId=0 } 06-12 11:48:09.130 30379 30379 D ViewRootImpl: enqueueInputEventMotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=410.0, y[0]=1734.0, toolType[0]=TOOL_TYPE_UNKNOWN, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566826447, downTime=566826447, deviceId=0, source=0x10001002, displayId=0 } 06-12 11:48:09.420 30379 30379 D ViewRootImpl: enqueueInputEventMotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=410.0, y[0]=1877.0, toolType[0]=TOOL_TYPE_UNKNOWN, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566826736, downTime=566826736, deviceId=0, source=0x10001002, displayId=0 } 06-12 11:48:09.821 30379 30379 D ViewRootImpl: enqueueInputEventMotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=410.0, y[0]=1877.0, toolType[0]=TOOL_TYPE_UNKNOWN, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566827138, downTime=566827138, deviceId=0, source=0x10001002, displayId=0 } 06-12 11:48:10.195 30379 30379 D ViewRootImpl: enqueueInputEventMotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=410.0, y[0]=1877.0, toolType[0]=TOOL_TYPE_UNKNOWN, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566827512, downTime=566827512, deviceId=0, source=0x10001002, displayId=0 } 06-12 11:48:10.578 30379 30379 D ViewRootImpl: enqueueInputEventMotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=410.0, y[0]=1877.0, toolType[0]=TOOL_TYPE_UNKNOWN, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566827893, downTime=566827893, deviceId=0, source=0x10001002, displayId=0 } 06-12 11:48:10.959 30379 30379 D ViewRootImpl: enqueueInputEventMotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=410.0, y[0]=2117.0, toolType[0]=TOOL_TYPE_UNKNOWN, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566828275, downTime=566828275, deviceId=0, source=0x10001002, displayId=0 } 06-12 11:48:38.960 30379 30379 D ViewRootImpl: enqueueInputEventMotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=821.76086, y[0]=1315.5482, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566856277, downTime=566856277, deviceId=2, source=0x1002, displayId=0 } 06-12 11:48:39.685 30379 30379 D ViewRootImpl: enqueueInputEventMotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=782.72473, y[0]=1526.6361, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566857002, downTime=566857002, deviceId=2, source=0x1002, displayId=0 } 06-12 11:48:41.046 30379 30379 D ViewRootImpl: enqueueInputEventMotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=734.68024, y[0]=1791.7466, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566858362, downTime=566858362, deviceId=2, source=0x1002, displayId=0 } 06-12 11:48:41.548 30379 30379 D ViewRootImpl: enqueueInputEventMotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=759.70337, y[0]=1837.7657, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566858865, downTime=566858865, deviceId=2, source=0x1002, displayId=0 } 06-12 11:48:42.175 30379 30379 D ViewRootImpl: enqueueInputEventMotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=989.91656, y[0]=1076.4486, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566859492, downTime=566859492, deviceId=2, source=0x1002, displayId=0 } 06-12 11:48:42.251 30379 30379 D OplusViewRootUtil: initSwipState, isDisplayCompatApp false 06-12 11:48:42.251 30379 30379 D OplusViewRootUtil: mScreenHeight 2400, mScreenWidth 1080 06-12 11:48:42.275 30379 30379 V OplusZoomWindowDecorViewHelper: setLastReportedMergedConfiguration mZoomDisplayHeight: 2400 [email protected][AppManagerActivity] 06-12 11:48:43.676 30379 30379 D ViewRootImpl: enqueueInputEventMotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=157.1455, y[0]=183.0763, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566860993, downTime=566860993, deviceId=2, source=0x1002, displayId=0 } 06-12 11:48:44.766 30379 30379 D ViewRootImpl: enqueueInputEventMotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=941.8721, y[0]=2049.8542, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566862081, downTime=566862081, deviceId=2, source=0x1002, displayId=0 } 06-12 11:50:28.106 30379 30379 D ViewRootImpl: enqueueInputEventMotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=97.08989, y[0]=198.08253, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x1, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566965424, downTime=566965424, deviceId=2, source=0x1002, displayId=0 } 06-12 11:50:29.529 30379 30379 D ViewRootImpl: enqueueInputEventMotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=573.531, y[0]=928.38684, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566966843, downTime=566966843, deviceId=2, source=0x1002, displayId=0 } 06-12 11:50:33.939 30379 30379 D ViewRootImpl: enqueueInputEventMotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=708.6561, y[0]=1447.6033, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566971256, downTime=566971256, deviceId=2, source=0x1002, displayId=0 } --------- beginning of main 06-12 11:50:34.005 30379 30379 D ViewRootImpl[MainActivity]: processMotionEvent MotionEvent { action=ACTION_UP, actionButton=0, id[0]=0, x[0]=708.6561, y[0]=1447.6033, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566971321, downTime=566971256, deviceId=2, source=0x1002, displayId=0 } 06-12 11:50:34.006 30379 30379 D ViewRootImpl[MainActivity]: dispatchPointerEvent handled=true, event=MotionEvent { action=ACTION_UP, actionButton=0, id[0]=0, x[0]=708.6561, y[0]=1447.6033, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566971321, downTime=566971256, deviceId=2, source=0x1002, displayId=0 } 06-12 11:50:34.011 30379 30379 E Parcel : Reading a NULL string not supported here. 06-12 11:50:34.054 30379 30379 D OplusGameShakeOptimizationHelper: onWindowFocusChanged pkgName = io.nekohasekai.sagernet mGameShakeConfig = null 06-12 11:50:34.055 30379 30379 D OplusGameShakeOptimizationHelper: getGameShakeConfig = null 06-12 11:50:35.708 30379 30379 D OplusGameShakeOptimizationHelper: onWindowFocusChanged pkgName = io.nekohasekai.sagernet mGameShakeConfig = null 06-12 11:50:35.709 30379 30379 D OplusGameShakeOptimizationHelper: getGameShakeConfig = null 06-12 11:50:39.096 30379 30379 D ViewRootImpl: enqueueInputEventMotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=751.696, y[0]=1278.5327, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566976413, downTime=566976413, deviceId=2, source=0x1002, displayId=0 } 06-12 11:50:39.096 30379 30379 D ViewRootImpl[MainActivity]: processMotionEvent MotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=751.696, y[0]=1278.5327, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566976413, downTime=566976413, deviceId=2, source=0x1002, displayId=0 } 06-12 11:50:39.096 30379 30379 D ViewRootImpl[MainActivity]: dispatchPointerEvent handled=true, event=MotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=751.696, y[0]=1278.5327, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566976413, downTime=566976413, deviceId=2, source=0x1002, displayId=0 } 06-12 11:50:39.161 30379 30379 D ViewRootImpl[MainActivity]: processMotionEvent MotionEvent { action=ACTION_UP, actionButton=0, id[0]=0, x[0]=751.696, y[0]=1278.5327, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566976478, downTime=566976413, deviceId=2, source=0x1002, displayId=0 } 06-12 11:50:39.162 30379 30379 D ViewRootImpl[MainActivity]: dispatchPointerEvent handled=true, event=MotionEvent { action=ACTION_UP, actionButton=0, id[0]=0, x[0]=751.696, y[0]=1278.5327, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=566976478, downTime=566976413, deviceId=2, source=0x1002, displayId=0 }

    `

    Expected behavior A clear and concise description of what you expected to happen. Spotify被代理

    Screenshots If applicable, add screenshots to help explain your problem. Screenshot_2021-06-10-09-58-53-10_0438eb925998df20b3482ec25499d226.jpg

    Smartphone (please complete the following information):

    • Device: OnePlus 9 国行
    • OS: Android 11
    • Version Color OS 11.2

    Additional context 设置截图 Screenshot_2021-06-12-11-48-27-01.jpg

    missing logs 
    opened by riverscn 7
  • 请问以后会支持xray吗

    请问以后会支持xray吗

    请问以后有计划支持xray吗

    question 
    opened by gcphym 7
  • UI feedback

    UI feedback

    1. Plugins require an Autostart permission in itself to work. This is not documented and the lack of permission is not immediately clear from the errors shown. Suggest better documentation so stuff can work the first time.
    2. How do I update plugins without doing a lot of manual downloads? If managing all the plugin downloads is hard, be sure to have some update notifications for plugins.
    3. Documentation, where is it? I don't want to keep guessing or read the fine source code. The following functionalities gave me trouble understanding as a first time user. Consider adding a few words at appropriate places.
      • Group. What does it do?
      • Security Advisory by Qv2ray. I don't use Qv2ray and don't know why do I need this.
      • Apps VPN mode, with off, on, bypass three options. They are confusing. The doc of VpnService has two modes, don't know why three are needed here.
      • Domain resolution strategy. Okay I'm totally lost here. What do these three options mean?
      • Enable traffic sniffing? For what? Sounds very bad for privacy. Is this the trick that recovers domain names from FakeDNS addresses?
      • DNS mode. I know, System and FakeDNS. What's remote, what's local, or domestic? Do I need to research V2ray docs for this? I left it as default.
      • TCP keep active packet delivery interval. I think it's usually called TCP keep alive interval. Is this related to the three Mux options above? It's hard to tell.
    4. Can I have a nicer app logo? Red on yellow, wow, my eyes hurt from looking at it.
    documentation 
    opened by klzgrad 6
  • 一些问题

    一些问题

    1.先复制一个torjan的订阅地址 然后选择从剪贴板导入 没有识别成订阅地址 列表里点击修改图标后FC 出现空指针 username must not be null 没有正确识别 也没有校验

    2.设置里的路由模式 选择 绕过局域网和大陆地址 并重新连接 在浏览器中使用百度查询ip 出现的ip是服务器的ip

    3.logo 有点反人类

    4.log里出现敏感信息 分享不方便 【ip port password etc】

    5.开启vpn的时候 可以考虑可以修改设置 无操作延迟几秒后重新连接 或者加一个重启服务的按钮提示

    6.扫描中国应用 建议改成 分析中国应用并勾选
    以及分析时候的弹窗 随着显示的应用增多 不断被拉长 最后还直接消失了 这操作有点奇怪

    7.分应用代理设置界面 关闭按钮对应打开按钮,那么 绕过按钮对应的放行按钮在哪? 第一次点了之后再点没反应

    SagerNet-4509470032590749279.log

    question 
    opened by coderstory 4
  • The project generated some errors during the build process

    The project generated some errors during the build process

    I downloaded the project directly and unpacking the build produces the following error.

    Task :plugin:xtls:externalBuild FAILED /Users/buding/SagerNet/run: line 5: declare: -A: invalid option declare: usage: declare [-afFirtx] [-p] [name[=value] ...]

    Execution failed for task ':plugin:xtls:externalBuild'.

    Process 'command '/Users/buding/SagerNet/run'' finished with non-zero exit value 127

    • Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

    I hope I can get an answer

    question 
    opened by wangshuohulala 4
  • Garbage in port 6450 inbound definition with TCP DNS

    Garbage in port 6450 inbound definition with TCP DNS

    Reproduce: Set DNS Settings:

    • DNS Mode: Local
    • Local DNS: tcp://8.8.8.8:53
    • Enable domestic DNS: false

    logcat actual:

    "inbounds": [
      {
        "listen": "127.0.0.1",
        "port": 2080,
        "protocol": "socks",
        "settings": {
          "auth": "noauth",
          "udp": true,
          "userLevel": 8
        },
        "tag": "in"
      },
      {
        "listen": "127.0.0.1",
        "port": 6450,
        "protocol": "dokodemo-door",
        "settings": {
          "address": "tcp://8.8.8.8:53",
          "network": "tcp,udp",
          "port": 53
        },
        "tag": "dns-in"
      }
    ],
    

    logcat expected:

    • "address": "8.8.8.8",
    • "network": "tcp"? Is there some UDP to TCP translation in v2fly that could support tcp,udp both, or only tcp here?
    question 
    opened by klzgrad 4
  • my problems

    my problems

    Describe the bug A clear and concise description of what the bug is.

    To Reproduce Steps to reproduce the behavior:

    1. Go to '...'
    2. Click on '....'
    3. Scroll down to '....'
    4. See error

    Logcat Export it yourself :)

    Expected behavior A clear and concise description of what you expected to happen.

    Screenshots If applicable, add screenshots to help explain your problem.

    Smartphone (please complete the following information):

    • Device: [e.g. MI6]
    • OS: [e.g. Android8.1]
    • Version [e.g. 5.15.0]

    Additional context Add any other context about the problem here.

    bug not following template spam 
    opened by dawoodiran 4
  • is there are reason for integrating older SS-libev library?

    is there are reason for integrating older SS-libev library?

    hi devs, i really appreciate your efforts on this project. i was curious why you chose to use https://github.com/shadowsocksRb/shadowsocksr-libev rather than https://github.com/shadowsocks/shadowsocks-libev which is kept up-to-date with security/bug fixes?

    thanks!

    question 
    opened by mfc 4
  • 你们Telegram管理真牛批

    你们Telegram管理真牛批

    毫无素质

    spam 
    opened by tonyHjony 3
  • Wrong position of the FAB

    Wrong position of the FAB

    Describe the bug The float action button is located incorrectly. Version 0.2-rc01 from Google Play.

    To Reproduce Steps to reproduce the behavior:

    1. Launch the app
    2. Swipe up
    3. Swipe down

    Logcat SagerNet-6091432842835533507.zip

    Expected behavior The float action button shows up in the correct position.

    Screenshots https://user-images.githubusercontent.com/16894061/123198503-cd2ce880-d4df-11eb-8ddf-f0ae0be00bb6.mp4

    Smartphone (please complete the following information):

    • Device: Google Pixel 3a XL
    • OS: Android 11
    • Version: RQ3A.210605.005

    Additional context

    bug help wanted 
    opened by nvxarm 1
  • Target Android S (12)

    Target Android S (12)

    shadowsocks/shadowsocks-android#2749

    opened by nekohasekai 0
  • Support Windows and Mac NDK

    Support Windows and Mac NDK

    windows can use msys2 or cygwin

    opened by SquallATF 6
  • 添加对SSH协议的支持

    添加对SSH协议的支持

    Is your feature request related to a problem? Please describe. 我访问的一个网站里面有关于SSH协议连接的计划,我用别的类似的软件都没有这个功能

    Describe the solution you'd like 添加SSH协议的支持

    Describe alternatives you've considered 暂无

    Additional context 暂无

    enhancement 
    opened by linuxblog996 2
  • [Feature request] Add Tasker plugin support

    [Feature request] Add Tasker plugin support

    Tasker is a convenient app for automation. Several V2Ray/XRay apps have support of Tasker plugin for connecting and disconnecting to server.

    Could you add support of Tasker plugin?

    enhancement 
    opened by xsm1997 0
Releases(0.3-rc08)
The universal proxy toolchain for Android, written in Kotlin.

SagerNet for Android The universal proxy toolchain for Android, written in Kotlin.

Project S 1.7k Jul 29, 2021
Java HTTP Request Library

Http Request A simple convenience library for using a HttpURLConnection to make requests and access the response. This library is available under the

Kevin Sawicki 3.2k Aug 1, 2021
The easiest HTTP networking library for Kotlin/Android

Fuel The easiest HTTP networking library for Kotlin/Android. You are looking at the documentation for 2.x.y.. If you are looking for the documentation

Kittinun Vantasin 4k Aug 3, 2021
Pluto is a on-device debugger for Android applications, which helps in inspection of HTTP requests/responses, capture Crashes and ANRs and manipulating application data on-the-go.

Pluto Pluto is a on-device debugger for Android applications, which helps in inspection of HTTP requests/responses, capture Crashes and ANRs and manip

Mocklets 35 Aug 2, 2021
Kotlin DSL http client

Introduction Kotlin DSL http client Features ?? Developers Experience-driven library without verbosity. ?? Native way to use http client in Kotlin. ??

Sergei Rybalkin 444 Jul 26, 2021
HttpMocker is a simple HTTP mocking library written in Kotlin to quickly and easily handle offline modes in your apps

HttpMocker HttpMocker is a very lightweight Kotlin library that allows to mock HTTP calls relying on either OkHttp or the Ktor client libraries. It ca

David Blanc 160 Jul 5, 2021
Multiplatform coroutine-based HTTP client wrapper for Kotlin

networkinkt This is a lightweight HTTP client for Kotlin. It relies on coroutines on both JS & JVM platforms. Here is a simple GET request: val text =

Egor Zhdan 31 Jun 24, 2020
Write your asynchronous Network / IO call painlessly in Kotlin !!

Asynkio : Write asynced IO/ Network calls painlessly on android | | | Documentation Write your network requests, IO calls in android with Kotlin seaml

Nikhil Chaudhari 84 Jun 15, 2021
An android asynchronous http client built on top of HttpURLConnection.

Versions 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 Version 1.0.6 Description An android asynchronous http client based on HttpURLConnection. Updates U

David 15 Mar 29, 2020
WebRTC Kotlin Multiplatform SDK

WebRTC Kotlin Multiplatform SDK

Alex Shepeliev 3 Jun 22, 2021
Square’s meticulous HTTP client for the JVM, Android, and GraalVM.

OkHttp See the project website for documentation and APIs. HTTP is the way modern applications network. It’s how we exchange data & media. Doing HTTP

Square 40.5k Jul 26, 2021
Kotlin HTTP requests library. Similar to Python requests.

khttp khttp is a simple library for HTTP requests in Kotlin. It functions similarly to Python's requests module. import khttp.get fun main(args: Arra

Anna Clemens 420 Jul 15, 2021
URL Shortener CDK example

url-shortener URL Shortener AWS CDK example. High level infrastructure architecture Route 53 - Is used to setup the dns records for the url shortener

Michael Brewer 3 Jun 21, 2021