A shadowsocks client for Android

Last update: May 24, 2022

Shadowsocks for Android

CircleCI API Releases Language: Kotlin Codacy Badge License: GPL-3.0

for Android & Chrome OS (beta)
for Android TV (beta)

PREREQUISITES

  • JDK 1.8
  • Android SDK
    • Android NDK
  • Rust with Android targets installed
  $ cd core/src/main/rust/shadowsocks-rust
  $ rustup target add armv7-linux-androideabi aarch64-linux-android i686-linux-android x86_64-linux-android

BUILD

You can check whether the latest commit builds under UNIX environment by checking Travis status.

  • Install prerequisites
  • Clone the repo using git clone --recurse-submodules or update submodules using git submodule update --init --recursive
  • Build it using Android Studio or gradle script

BUILD WITH DOCKER

  • Clone the repo using git clone --recurse-submodules or update submodules using git submodule update --init --recursive
  • Run docker run --rm -v ${PWD}:/build -w /build shadowsocks/android-ndk-go ./gradlew assembleDebug

CONTRIBUTING

If you are interested in contributing or getting involved with this project, please read the CONTRIBUTING page for more information. The page can be found here.

TRANSLATE

OPEN SOURCE LICENSES

LICENSE

Copyright (C) 2017 by Max Lv <[email protected]>
Copyright (C) 2017 by Mygod Studio <[email protected]>

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 http://www.gnu.org/licenses/.

GitHub

https://github.com/shadowsocks/shadowsocks-android
Comments
  • 1. Service is down intermittently

    Describe the bug

    Sometimes the Internet fails entirely when Shadowsocks keeps running for a while. This is a new bug introduced around v5.1.7 until latest master.

    To Reproduce Steps to reproduce the behavior:

    1. Start Shadowsocks
    2. Wait until your Internet is dead
    3. Restart service and verify that it is back working again

    Expected behavior Shadowsocks should work 24/7.

    Relevant logcat

    ERROR dns udp 127.0.0.1:38945 query message parse error: dns class value unknown: 2287
    

    This message is repeated 6 times over 4 seconds, around when the DNS goes down. Not sure if it is related though.

    Smartphone (please complete the following information):

    • Android/Chrome OS version: Android 11
    • Device: Pixel 3a XL
    • Version: Reproducible from v5.2.1 (9a1c677) to 1394ab3
    • Last version that did not exhibit the issue: around v5.1.7

    Configuration Put an x inside the [ ] that applies.

    • [x] IPv4 server address
    • [ ] IPv6 server address
    • [x] Client IPv4 availability
    • [ ] Client IPv6 availability
    • Encrypt method: n/a
    • Route
      • [x] All
      • [ ] Bypass LAN
      • [ ] Bypass China
      • [ ] Bypass LAN & China
      • [ ] GFW List
      • [ ] China List
      • [ ] Custom rules
    • [ ] IPv6 route
    • [ ] Apps VPN mode
      • [ ] Bypass mode
    • Remote DNS: 1.1.1.1
    Reviewed by Mygod at 2021-01-26 04:03
  • 2. Media upload problem in Telegram since upgraded to shadowsocks-rust 1.9

    Please read contributing guidelines. Thanks.

    There is a problem in Telegram media uploading since shadowsocks rust was updated to version 1.9. Same problem exist in telegram desktop with shadowsocks rust 1.9 client.

    Expected behavior Start upload media after sending.

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

    Smartphone (please complete the following information):

    • Android/Chrome OS version: Android 10
    • Device: Mi 9T pro
    • Version: All versions after 5.1.7

    Configuration Put an x inside the [ ] that applies.

    • [x] IPv4 server address
    • [ ] IPv6 server address
    • [ ] Client IPv4 availability
    • [ ] Client IPv6 availability
    • Encrypt method: chacha20-poly1305
    • Route
      • [ ] All
      • [x] Bypass LAN
      • [ ] Bypass China
      • [ ] Bypass LAN & China
      • [ ] GFW List
      • [ ] China List
      • [ ] Custom rules
    • [ ] IPv6 route
    • [ ] Apps VPN mode
      • [ ] Bypass mode
    • Remote DNS: 8.8.8.8
    • [ ] DNS over UDP
    • Plugin configuration (if applicable): v2ray (websocket-tls)
    • [ ] Auto Connect
    • [ ] TCP Fast Open
    • If you're not using VPN mode, please supply more details here:

    Additional context Add any other context about the problem here.

    Reviewed by arbabseyfola at 2021-02-23 21:29
  • 3. 移动4G cmnet 连不上

    Please read contributing guidelines. Thanks.

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

    移动4G连上有问题,dns请求发不出去的样子,表现为连上后网页打不开,而telegram却能正常使用,同样的节点配置,使用v2rayNG 的ss功能可以正常连接!

    根据之前的issues https://github.com/shadowsocks/shadowsocks-android/issues/591

    改DNS检查为allowed,无效 APN连接点的端口为80,无效 APN协议从"ipv4/ipv6"改成"ipv4",无效

    补充,发现APN改为cmwap可以连上,改回cmnet又不行!cmwap无法使用微信的语音视频等功能…蛋疼

    使用v2rayNG 的ss功能两个APN都能正常连接! 望大佬看看原因…

    To Reproduce Steps to reproduce the behavior:

    1. 关闭wifi
    2. 启动 shadowsocks 并连接
    3. 开启google
    4. 查看错误

    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):

    • Android 8.0 OxygenOS 5.0.8
    • Device: [ OnePlus 3T ]
    • Version: [ONEPLUS A3010_28_181206]
    • Last version that did not exhibit the issue: [not applicable]

    Configuration Put an x inside the [ ] that applies.

    • [x] IPv4 server address
    • [ ] IPv6 server address
    • [x] Client IPv4 availability
    • [ ] Client IPv6 availability
    • Encrypt method:
    • Route
      • [x] All
      • [ ] Bypass LAN
      • [ ] Bypass China
      • [ ] Bypass LAN & China
      • [ ] GFW List
      • [ ] China List
      • [ ] Custom rules
    • [ ] IPv6 route
    • [x] Apps VPN mode
      • [ ] Bypass mode
    • Remote DNS: 8.8.8.8 (修改过,并无改善) *[x] DNS over UDP
    • Plugin configuration (if applicable):
    • [ ] Auto Connect
    • [ ] TCP Fast Open
    • If you're not using VPN mode, please supply more details here:

    Additional context Add any other context about the problem here.

    上截图,为防止是线路导致的问题,我在家里的树莓派安装服务端, 404 _20190305221241 _20190305221245 _20190305221249

    连接后访问国内网站某度,完全无法打开,截图中可以看到,shadowsocks 中间有发送与接收数据,由于找不到可以直接用ip访问的网站,我访问 http://119.29.29.29/,虽然是个404页面,但确实打开了。 然后某些直接使用ip连接的app也没有问题。

    V2客户端正常

    _20190305221434 _20190305221437

    最后, 把APN换成 CMWAP 后就能正常打开网页 - -

    @madeye

    Reviewed by ghost at 2019-03-03 03:19
  • 4. Integrate shadowsocks-rust

    This PR aims to replace shadowsocks-libev with shadowsocks-rust.

    Fix issue #2452.

    • [x] Gradle and Cargo integration
    • [x] Build pass
    • [x] VPNService callback
    • [x] TCP relay
    • [x] DNS realy
    • [x] UDP relay
    • [x] ACL (IP rules)
    • [x] ACL (domain name rules)
    • [x] Traffic statistics

    Nice to have:

    • [x] Parallel lookup to local and remote
    • [x] Unix domain socket to local DNS resolver.

    Future development plan (maybe not covered by this PR)

    • [ ] A local DNS cache
    • [ ] Local DNS resolver in Rust
    • [ ] Fine-grained policy routing
    • [ ] Multiple upstreams
    Reviewed by madeye at 2020-02-23 12:55
  • 5. CPU usage is pretty high than previous v5.0.6

    when compared with previous 5.0.6, my xiaomi10 shows cpu is very high, almost 100% with full 8 core running.

    when downgrade the v5.0.6, cpu becomes normal.

    They are using same profile.

    Reviewed by xygwfxu at 2020-12-12 06:34
  • 6. kcp插件无法启动

    Please read FAQ then answer these questions before submitting your issue. Thanks!

    Environment

    • Android version: e.g. "7.0.0_r14", more detailed description is preferred android 7.0
    • Device: e.g. Google Pixel XL 华为p8
    • Shadowsocks version: version code "v3.0.0" or commit ID "a073f85" v4.0
    • Last version that did not exhibit the issue (if applicable):

    Configuration

    Put an x inside the [ ] that applies.

    • [ x] IPv4 server address
    • [ ] IPv6 server address
    • [ x] Client IPv4 availability
    • [ ] Client IPv6 availability
    • Local port: 1080
    • Encrypt method:rc4-md5
    • [ ] One-time authentication
    • Route
      • [ ] All
      • [ ] Bypass LAN
      • [x ] Bypass China
      • [ ] Bypass LAN & China
      • [ ] GFW List
      • [ ] China List
      • [ ] Custom rules
    • [ ] IPv6 route
    • [ ] Per-App Proxy
      • [ ] Bypass mode
    • [ ] UDP Forwarding
    • KCP Parameters: (leave blank if not enabled)
    • [x ] Auto Connect
    • [ x] TCP Fast Open
    • [ ] NAT mode

    What did you do?

    使用kcp插件连接失败,提示”服务启动失败,无法连接远程服务器:unknow plugin kcptun” 远程端口连接kcp端口,参数autoexpire=10;mode=fast 。

    What did you expect to see?

    请问kcp插件如何使用

    What did you see instead?

    Reviewed by triaqu at 2017-01-24 02:38
  • 7. Plugin system [Draft]

    Plugin should be bundled as an apk. $PLUGIN_ID in this draft corresponds to the executable name for the plugin in order to be cross-platform, e.g. simple-obfs. An apk can have more than one plugins bundled. We don't care as long as they have different $PLUGIN_ID. Duplicated plugins will be disabled so user has to uninstall them until there's only not more than one left.

    There is no restrictions/requirements on package name, but you're suggested to use com.github.shadowsocks.plugin.$PLUGIN_ID if it only contains a single plugin to prevent duplicate plugins.

    There will be a library to implement the base framework contrived in this draft and some example plugins for the ease of developers. :smile:

    1. Plugin configuration

    Plugins get their args configured via one of the following two options:

    • A configuration activity.
    • If no configuration activity is found, a fallback mode will be used: user manual input and help message; (example: https://github.com/shadowsocks/shadowsocks-android/blob/67fab03/src/main/scala/com/github/shadowsocks/preferences/KcpCliPreferenceDialogFragment.scala#L38)

    Configuration activity

    • [x] Should this be implemented at all?

    If the plugin provides a configuration activity, it will be started when user picks your plugin and taps configure. It:

    • MUST have action: com.github.shadowsocks.plugin.$PLUGIN_ID.ACTION_CONFIGURE;
    • SHOULD parse string extra com.github.shadowsocks.plugin.EXTRA_OPTIONS (all arg as a single string) and display the old settings;
    • MUST return the data Intent with the new com.github.shadowsocks.plugin.EXTRA_OPTIONS;
    • SHOULD distinguish between server settings and feature settings in some way, e.g. for simple_obfs, obfs is a server setting and obfs_host is a feature setting;
    • NEED NOT be consistent with shadowsocks-android styling - you don't need to use preferences UI at all if you don't feel like it - however it's recommended to use Material Design at minimum.

    Help activity/callback

    If the plugin doesn't provide a configuration activity, it's highly recommended to provide a help message in the form of an Activity. It:

    • MUST have action: com.github.shadowsocks.plugin.$PLUGIN_ID.ACTION_HELP;
    • CAN parse string extra com.github.shadowsocks.plugin.EXTRA_OPTIONS and display some more relevant information;
    • MUST be either:
      • Be invisible and return help message with CharSequence extra com.github.shadowsocks.plugin.EXTRA_HELP_MESSAGE in the data intent; (in this case, default dialog will be shown containing the message)
      • Be visible and return null as data intent.
    • SHOULD distinguish between server settings and feature settings in some way, e.g. for simple_obfs, obfs is a server setting and obfs_host is a feature setting.

    2. Plugin implementation

    Every plugin can be either in native mode or JVM mode.

    Native mode

    In native mode, plugins are provided as native executables and shadowsocks-libev's plugin mode will be used.

    Every native mode plugin MUST have a content provider to provide the native executables (since they can exceed 1M which is the limit of Intent size) that:

    • MUST have android:label and android:icon; (may be configured by activity or application)
    • MUST have action: com.github.shadowsocks.plugin.ACTION_NATIVE_PLUGIN. (used for discovering plugins)
    • MUST have android:authorities set to com.github.shadowsocks.plugin.$PLUGIN_ID;
    • MUST implement query that returns the file list which MUST include $PLUGIN_ID when having these as arguments:
      • uri = "content://com.github.shadowsocks.plugin.$PLUGIN_ID";
      • projection = ["path"]; (relative path, for example obfs-local)
      • selection = null;
      • selectionArgs = null;
      • sortOrder = null;
    • MUST implement openFile that for files returned in query, openFile with mode = "r" returns a valid ParcelFileDescriptor for reading. For example, uri can be content://com.github.shadowsocks.plugin.kcptun/kcptun.

    Native mode without binary copying

    • [x] Should this be implemented at all?

    By taking advantage of android:protectionLevel="signature", plugins that have the same signature as the base package (shadowsocks-android in this case) should be able to be accessed directly by ss-local. If any native mode plugin wishes to support this mode, it must have an Activity which:

    • MUST have action: com.github.shadowsocks.plugin.$PLUGIN_ID.ACTION_START;
    • MUST be invisible;
    • MUST return the com.github.shadowsocks.plugin.EXTRA_EXECUTABLE with executable path (e.g. /data/data/com.github.shadowsocks.plugin.kcptun/lib/libkcptun.so).

    All plugins in this mode HAVE to support native mode with binary copy.

    P.S. If this is implemented, "official" plugins will perform a tiny little bit better than "unofficial" ones.

    JVM mode

    Note: This can actually be hybrid mode since I'm not caring what you do under the hood. But this should probably be a good idea if your plugin was written in a JVM language.

    • [ ] Should this be implemented at all?

    Every JVM mode plugin MUST have a service intent filter that:

    • MUST have android:label and android:icon; (may be configured by activity or application)
    • MUST have action: com.github.shadowsocks.plugin.$PLUGIN_ID.ACTION_START;
    • MUST have action: com.github.shadowsocks.plugin.ACTION_JVM_PLUGIN; (used for discovering plugins)
    • After onStartCommand(intent, flags, startId), where caller package name, server_ip, server_port and com.github.shadowsocks.plugin.EXTRA_OPTIONS will be passed via intent extra. Within 5000ms, it MUST broadcast com.github.shadowsocks.plugin.ACTION_JVM_PLUGIN_READY with local_port (should be the result of new ServerSocket(0).getLocalPort()) as extra or com.github.shadowsocks.plugin.ACTION_JVM_PLUGIN_FAIL with optional error message as string extra to caller package.
    • After shutdown or startService timeout, stopService will be called on target service. The plugin MUST gracefully handle this and terminate.

    Default configurations

    If a plugin need to supply default configuration, it can put it under the ContentProvider/Service's meta-data tag, for example:

    <meta-data android:name="com.github.shadowsocks.plugin.default_config"
               android:value="obfs=http"/>
    

    If you need to provide different default configurations for different plugins, you have to use multiple ContentProvider/Service. It should be easy to implement with sub-classing.

    3. Plugin security considerations

    Plugins are certified using package signatures and shadowsocks-android will consider these signatures as trusted:

    • Signatures by trusted sources which includes:
      • @madeye, i.e. the signer of the main repo;
      • The main repo doesn't contain any other trusted signatures. Third-party forks should add their signatures to this trusted sources if they have plugins signed by them before publishing their source code.
    • Current package signature, which means:
      • If you get apk from shadowsocks-android releases or Google Play, this means only apk signed by @madeye will be recognized as trusted.
      • If you get apk from a third-party fork, all plugins from that developer will get recognized as trusted automatically even if its source code isn't available anywhere online.

    A warning will be shown for untrusted plugins. No arbitrary restriction will be applied.

    4. Plugin platform versioning

    In order to be able to identify compatible and incompatible plugins, Semantic Versioning will be used.

    Given a version number MAJOR.MINOR.PATCH, increment the:

    1. MAJOR version when you make incompatible API changes,
    2. MINOR version when you add functionality in a backwards-compatible manner, and
    3. PATCH version when you make backwards-compatible bug fixes.

    Plugin app must include this in their application tag: (which should be automatically included if you are using our library)

    <meta-data android:name="com.github.shadowsocks.plugin.version"
               android:value="1.0.0"/>
    

    5. Possible problems

    • In some places hyphens are not accepted, for example package name. In that case, hyphens - should be changed into underscores _. For example, the package name for obfs-local would probably be com.github.shadowsocks.plugin.obfs_local (if it turns out that we really can't use hyphens in package name).
    • In the current implementation, kcptun needs to be restarted whenever a network change is detected. We may need to put this into this platform somehow, e.g. a restart receiver for shadowsocks and a start/stop receiver for plugins...

    References

    • SIP003: https://github.com/shadowsocks/shadowsocks-org/issues/28;
    • Previous discussion at: https://github.com/shadowsocks/shadowsocks-android/issues/1054#issuecomment-270568281.

    Opinions are welcome!

    Reviewed by Mygod at 2017-01-09 15:14
  • 8. Considering alternative coroutine sslocal impls

    Moving discussion from https://github.com/shadowsocks/shadowsocks-org/issues/154.

    We are trying to make ACL handling of shadowsocks-android less hacky (for example https://github.com/shadowsocks/shadowsocks-libev/issues/2627), however, things seem challenging.

    1. While shadowsocks-libev more or less takes the approach of doing async I/O via libev, libev requires you to manually keep track of your execution point to resume your connection processing. This makes extending functionalities error-prone and overall the code is hard to read. In fact, there are still traces of synchronous I/O in shadowsocks-libev (e.g. get_sockaddr), which could block the entire thread if network conditions are bad.
    2. Modern programming language more or less solves this problem with coroutines, examples include golang/rust/c++20/Kotlin. However, go-shadowsocks2 (missed opportunity for go2shadowsocks btw) and shadowsocks-rust do not have support for ACL files yet. As we use really large ACL files, we need to integrate re2 or look for a regex library with similar performance. (golang stdlib does not suffice: https://github.com/golang/go/issues/11646)
    3. Implementing everything in JVM is a bad idea since every byte array is going to be an object in GC heap, and there are no good Kotlin async I/O libraries either. It seems like there are similar issues in golang (objects escaping to heap) but I am not an expert in golang.
    4. Doing PAC is going to be even more expensive than ACL since PAC is actually Javascript.

    Thoughts are appreciated.

    CC @madeye @riobard @zonyitoo

    Reviewed by Mygod at 2020-02-20 18:14
  • 9. gradle build failed on win7

    Environment

    Win7 64bit

    What did you do? I get source and set environment ANDROID_HOME,ANDROID_NDK_HOME ,GOROOT_BOOTSTRAP ,then do "git submodule update --init --recursive". last,I use "gradle build -stacktrace" then found it fialed as follows:

    FAILURE: Build failed with an exception.

    • What went wrong: The specified build file 'E:\work\myproject\workspace\jsq\code\sample_new\shadowsocks-android\uild' does not exist.

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

    • Exception is: java.lang.IllegalArgumentException: The specified build file 'E:\work\myproject\workspace\jsq\code\sample_new\shadowsocks-android\uild' does not exist. at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:43) at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:30) at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:59) at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:44) at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:45) at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:30) at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122) at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122) at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122) at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34......... I wan't known what's my problem,thank you very much.

    Reviewed by xiguapi2015 at 2018-01-15 03:45
  • 10. v4.4.2 后台服务启动失败:请选择配置文件

    Please read FAQ then answer these questions before submitting your issue. Thanks!

    Environment

    • Android version: 7.1.1
    • Device: 锤子坚果pro 2
    • Shadowsocks version: 4.4.2
    • Last version that did not exhibit the issue (if applicable):

    Configuration

    Put an x inside the [ ] that applies.

    • [x] IPv4 server address
    • [ ] IPv6 server address
    • [x] Client IPv4 availability
    • [ ] Client IPv6 availability
    • Encrypt method:
    • Route
      • [ ] All
      • [ ] Bypass LAN
      • [ ] Bypass China
      • [x] Bypass LAN & China
      • [ ] GFW List
      • [ ] China List
      • [ ] Custom rules
    • [ ] IPv6 route
    • [ ] Apps VPN mode
      • [ ] Bypass mode
    • Remote DNS: 8.8.8.8
    • [ ] DNS Forwarding
    • Plugin configuration (if applicable):
    • [ ] Auto Connect
    • [ ] TCP Fast Open
    • If you're not using VPN mode, please supply more details here:

    What did you do?

    Just install v4.4.2 and import my server config.

    What did you expect to see?

    Connect successfully.

    What did you see instead?

    后台服务启动失败:请选择配置文件

    Reviewed by luffyke at 2017-12-25 06:56
  • 11. shadowsocks hangs with stopping

    • Android version: 6.0.1
    • Device: Motorola G4 Plus 64 GB
    • Shadowsocks version: 4.0.2 (4.0.1 also)
    • Last version that did not exhibit the issue (if applicable): 3.3.1

    Configuration

    Put an x inside the [ ] that applies.

    • [x] IPv4 server address
    • [ ] IPv6 server address
    • [x] Client IPv4 availability
    • [ ] Client IPv6 availability
    • Local port: 1080
    • Encrypt method: AES-128-CTR
    • [ ] One-time authentication
    • Route
      • [ ] All
      • [z] Bypass LAN
      • [ ] Bypass China
      • [ ] Bypass LAN & China
      • [ ] GFW List
      • [ ] China List
      • [ ] Custom rules
    • [ ] IPv6 route
    • [ ] Per-App Proxy
      • [ ] Bypass mode
    • [x] UDP Forwarding
    • Plugin configuration (if applicable):
    • [ ] Auto Connect
    • [ ] TCP Fast Open
    • [ ] NAT mode

    What did you do?

    Start it. Then Stop it from the green paper airplane icon.

    What did you expect to see?

    I expected it to stop and be ready to restart.

    What did you see instead?

    It hung with the orange ring going around the green paper airplane. Text saying shutting down. VPN icon still in the top android status bar. I had to force stop the app.

    Reviewed by KarlM256 at 2017-02-12 21:46
  • 12. linker-wrapper.sh` failed: exit status: 127

    error: linking with /Users/test/Desktop/Projects/shadowsocks-android/build/linker-wrapper/linker-wrapper.sh failed: exit status: 127 linking with /Users/test/Desktop/Projects/shadowsocks-android/build/linker-wrapper/linker-wrapper.sh failed: exit status: 127

    | = note: "/Users/test/Desktop/Projects/shadowsocks-android/build/linker-wrapper/linker-wrapper.sh" .... = note: /Users/test/Desktop/Projects/shadowsocks-android/build/linker-wrapper/linker-wrapper.sh: line 4: python: command not found

    linker-wrapper.sh :

    `#!/usr/bin/env bash

    Invoke linker-wrapper.py with the correct Python command.

    "${RUST_ANDROID_GRADLE_PYTHON_COMMAND}" "${RUST_ANDROID_GRADLE_LINKER_WRAPPER_PY}" "[email protected]"`

    好像是跟python有关。 我不了解它,请问怎么解决 It seems to have something to do with Python. I don't understand it. How can I solve it

    Reviewed by ysjava at 2022-04-29 06:53
  • 13. ipv6_first option in android

    Describe the bug I need something like "ipv6_first" in android. My ipv6 can be detected in ipv6-test.com but it's not the default. I have imported this configuration file into the android client:

    
    {
    "server":"46.38.xxx.xxx",
    "server_port":5532,
    "local_address": "127.0.0.1",
    "local_port":1080,
    "password":"xxxxxxxxx",
    "timeout":600,
    "method":"chacha20-ietf-poly1305",
    "mode": "tcp_and_udp",
    "fast_open": true,
    "ipv6_first": true
    }
    

    To Reproduce Steps to reproduce the behavior:

    1. Connect to any shadowsocks server

    Expected behavior I want ipv6 to be the default.

    Screenshots shadowsocks-linux

    image

    Smartphone (please complete the following information):

    • Android version: 9
    • Device: Samsung galaxy j7 pro
    • Version: 5.2.6
    Reviewed by AmirHosseinCV at 2022-04-25 20:05
  • 14. 自定义规则中,在线规则文件URL被GFW阻隔。

    我尝试用这个在线文件 URL https://raw.githubusercontent.com/NateScarlet/gfwlist.acl/master/gfwlist.acl 但是提示无法连接远程服务器。我尝试在其之前添加域名及其子域名 githubusercontent.com 也还是不行。 让在线文件 URL 直接走代理是否更为合理?

    Reviewed by meng89 at 2022-04-09 00:01
  • 15. Why does TV version not support xchacha20-ietf-poly1305?

    Is your feature request related to a problem? Please describe. I've found that the TV version does not support xchacha20-ietf-poly1305, since the master branch already add xchacha20-ietf-poly1305 back, I see no reason why we do not add xchacha20-ietf-poly1305 back.

    Reviewed by manjuprajna at 2022-03-30 01:36
  • 16. not support path in v2ray plugin

    same config work in pc's shadowsocks, i scan the qr cocde to load config to my phone. it's not work in shadowsocks android. without plugin options param "path", v2ray plugin work well both in pc and andorid.

    Reviewed by charlieyu at 2022-03-28 03:18
An unofficial open source Reddit client for Android.

RedReader An unofficial, open source Android client for Reddit. Features Free and open-source Software - no ads/tracking Lightweight and fast Swipe po

May 16, 2022
Open-source alternative Instagram client on Android.
Open-source alternative Instagram client on Android.

Instagram client; previously known as InstaGrabber.

Jul 23, 2021
A light Sina Weibo client for Android
A light Sina Weibo client for Android

BlackLight 新浪微博客户端 请注意,当前BlackLight的开发已经被冻结,直到2016年高考后重启。 The development progress has been FROZEN till June 2016. 详细介绍以及Changelog请见Play商店。 https://pl

May 1, 2022
Cnblogs Client for Android - Material Design
Cnblogs Client for Android - Material Design

Cotable - Yet Another Cnblogs Client for Android Description Cotable = Code + Stable (The Paradise of Coder) The Android client of Cnblogs that named

Feb 12, 2022
GitHub client for Android based on the abandoned official app

ForkHub ForkHub started off as a fork of the official Android app from GitHub, and has since seen lots of improvements. You can see a comprehensive li

May 13, 2022
A handy Dribbble client for Android.

Notice Gunnner has been deprecated since Dribbble API v1 has been retired on March 26, 2018. Gunnner Gunnner1 is a handy Dribbble client for Android.

Feb 12, 2022
An Android client for Pump.io

Impeller - An Android client for Pump.io What is it A client for Pump.io, intended to provide a rich, platform-integrated experience. Runs on Android

Feb 12, 2022
Github client for Android
Github client for Android

OctoDroid This application provides access to GitHub and lets you stay connected with your network Download Main features Repository List repositories

May 20, 2022
Skooter App - Android client source code
Skooter App - Android client source code

Skooter App STAY CONNECTED. LOCALLY Skooter is a FREE mobile application that acts like a Hyper Local Bulletin Board for your area by showing the most

Feb 23, 2022
An Android client for the microblogging server Mastodon
An Android client for the microblogging server Mastodon

Tusky Tusky is a beautiful Android client for Mastodon. Mastodon is an ActivityPub federated social network. That means no single entity controls the

May 22, 2022
YouJoin Android Client, a cool app of connection, use Material Design.

YouJoin-Android 简介 这个repo是YouJoin社交平台的Android客户端,代码由本人独立编写,功能和特点包括: 采用Material Design设计 登录注册 即时聊天 个人中心(支持资料编辑、头像上传) 心情动态(支持最多九张图片;支持点赞、评论) 好友关注 附近的人(采

May 18, 2022
A app client for Github
A app client for Github

Git.NB A android app client for Github. 效果图 关于项目 Git.NB现以升级到2.0,功能大有升级,UI大改版本。各种有趣的操作,欢迎下载代码试完。 如果发现有任何问题和建议,随时欢迎Email或者开Issues, 如果有版权问题,立即删除。 使用的开源技术

Feb 12, 2022
Simple Twitter Client just for tweeting, written in Kotlin with reactive MVVM-like approach
Simple Twitter Client just for tweeting, written in Kotlin with reactive MVVM-like approach

Monotweety Simple Twitter Client just for tweeting. Monotweety is also available at F-Droid compatible repository called IzzyOnDroid F-Droid Repositor

Feb 12, 2022
Yet another Twitter unofficial client for Lollipop.
Yet another Twitter unofficial client for Lollipop.

Tweetin Yet another Twitter unofficial client. Just design for Lollipop now!!! Screenshot: How to use the source code? Just import the Tweetin folder

Feb 12, 2022
Library for easy work with Facebook, Twitter, LinkedIn and Google on Android
Library for easy work with Facebook, Twitter, LinkedIn and Google on Android

THIS PROJECT IS NO LONGER MAINTAINED, FEEL FREE TO FORK AND FIX IT FOR YOUR NEEDS There is also an Android Library that is being maintained, CloudRail

Apr 23, 2022
Easy social network authorization for Android. Supports Facebook, Twitter, Instagram, Google+, Vkontakte. Made by Stfalcon

SocialAuthHelper A library that helps to implement social network authorization (Facebook, Twitter, Instagram, GooglePlus, Vkontakte). Who we are Need

Sep 26, 2021
Youtube-dl for android

youtube-dl-android Android library wrapper for youtube-dl executable. Based on yausername's youtubedl-android but with ability to download binary file

May 11, 2022
Twidere for Android

Twidere for Android Material Design ready and feature rich Twitter/Mastodon/Fanfou app for Android 4.1+. Enjoy Fediverse now! Twidere-Android is maint

May 18, 2022
Slide is an open sourced, ad free Reddit browser for Android
Slide is an open sourced, ad free Reddit browser for Android

Slide Slide is an open source, ad free Reddit browser for Android. It is based around the Java Reddit API Wrapper. Slide is available on the Google Pl

May 16, 2022