Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
1a12548
refactor(crypto): extract AES-CTR backend adapter and keep cryptograp…
Mar 16, 2026
7dc9b04
test(crypto): add MTProto init and splitter coverage
Mar 16, 2026
5e6fbdf
test(socks5): cover handshake, address parsing and connect failures
Mar 16, 2026
ecc89d4
feat(crypto): add android-compatible pure-python AES-CTR backend
Mar 16, 2026
ec70188
refactor(core): extract cross-platform proxy runtime from windows app
Mar 16, 2026
47e5c62
feat(android): scaffold kotlin app with settings screen and foregroun…
Mar 16, 2026
ec6de3a
feat(android): embed python runtime and boot proxy service inside for…
Mar 16, 2026
fe55624
feat(ci): build and publish Android debug APK in GitHub releases
Mar 16, 2026
360ea20
Merge pull request #1 from Dark-Avery/android_migration
Dark-Avery Mar 16, 2026
c5f8b40
fix(android): normalize Chaquopy Java list inputs for proxy config
Mar 16, 2026
db5a6cc
feat(android): add Telegram proxy intent and background-limit status …
Mar 16, 2026
8d43fa2
feat(android): add richer service notification
Mar 16, 2026
da15296
feat(android): show proxy traffic stats in foreground notification
Mar 16, 2026
6171370
build(android): add env-based release signing config
Mar 16, 2026
c61e2e8
feat(ci): build and publish signed Android release APK
Mar 16, 2026
a57f238
Merge pull request #2 from Dark-Avery/android_migration
Dark-Avery Mar 16, 2026
bf21bbf
docs(android): update README for Android fork, signed APK releases, a…
Mar 16, 2026
6cbec90
feat(android): add restart action, log viewer, and persistent service…
Mar 16, 2026
cf758f6
fix(android): use dedicated notification icon instead of system downl…
Mar 16, 2026
ee4d41a
Merge pull request #3 from Dark-Avery/android_migration
Dark-Avery Mar 16, 2026
09fbc5d
fix(android): restore notification payload compile after rollback
Mar 16, 2026
30f902e
docs: align README with upstream and add minimal Android sections
Mar 17, 2026
3d10eb9
Merge upstream/main into android_migration
Dark-Avery Mar 19, 2026
85b111d
refactor(desktop): move windows linux and macos launchers to shared r…
Dark-Avery Mar 19, 2026
b5b6a80
Merge upstream/main into android_migration
Dark-Avery Mar 22, 2026
faea437
feat(android): add advanced upstream tuning settings
Dark-Avery Mar 22, 2026
e6cceac
Merge branch 'main' into android_migration
Dark-Avery Mar 23, 2026
e50ea25
Merge upstream/main into android_migration
Dark-Avery Mar 28, 2026
4f65813
fix(runtime): accept advanced logging and socket tuning settings
Dark-Avery Mar 23, 2026
54b86cd
feat(android): add separate legacy32 APK build for armeabi-v7a
Dark-Avery Mar 23, 2026
934eb34
feat(android): add update checks using shared python release checker
Dark-Avery Mar 28, 2026
336602e
feat(android): harden update checks, ci, and direct-only ui
Dark-Avery Mar 28, 2026
68a378b
feat(android): harden update checks, ci, and direct-only ui
Dark-Avery Mar 28, 2026
7984080
Merge remote-tracking branch 'origin/android_migration' into android_…
Dark-Avery Mar 29, 2026
9e2c8c1
merge: take upstream v1.4.0 core as android_migration base
Dark-Avery Mar 30, 2026
1599b11
feat(runtime): adapt android_migration shell to upstream mtproto core
Dark-Avery Mar 30, 2026
810991e
feat(android): switch config and tg intent to mtproto model
Dark-Avery Mar 30, 2026
0302a3b
docs(readme): align android instructions with mtproto config
Dark-Avery Mar 30, 2026
7e9acc4
docs(readme): keep android-only additions on android_migration
Dark-Avery Mar 30, 2026
7ad377c
fix(android-build): move WSL build outputs off Windows mounts
Dark-Avery Mar 30, 2026
76b375b
fix(runtime): close ws pool tasks before loop shutdown
Dark-Avery Mar 30, 2026
7c8bc17
fix(android-build): run gradle from android project root
Dark-Avery Mar 30, 2026
3552de7
fix(gitignore): ignore WSL android build symlink
Dark-Avery Mar 30, 2026
e511ff5
fix(runtime): detect android bind errors as port conflicts
Dark-Avery Mar 30, 2026
509f50f
fix(android): avoid cryptography dependency and preserve version on u…
Dark-Avery Mar 30, 2026
a564170
test(android): cover bridge startup without cryptography
Dark-Avery Mar 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 103 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ on:
permissions:
contents: write

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true

jobs:
build-windows:
runs-on: windows-latest
Expand Down Expand Up @@ -318,8 +321,99 @@ jobs:
dist/TgWsProxy_linux_amd64
dist/TgWsProxy_linux_amd64.deb

build-android:
runs-on: ubuntu-latest
timeout-minutes: 30
env:
ANDROID_APK_STANDARD_NAME: tg-ws-proxy-android-${{ github.event.inputs.version }}.apk
ANDROID_APK_LEGACY32_NAME: tg-ws-proxy-android-${{ github.event.inputs.version }}-legacy32.apk
defaults:
run:
working-directory: android
steps:
- name: Checkout
uses: actions/checkout@v6

- name: Validate Android release signing secrets
env:
ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
run: |
test -n "$ANDROID_KEYSTORE_BASE64" || { echo "Missing secret: ANDROID_KEYSTORE_BASE64"; exit 1; }
test -n "$ANDROID_KEYSTORE_PASSWORD" || { echo "Missing secret: ANDROID_KEYSTORE_PASSWORD"; exit 1; }
test -n "$ANDROID_KEY_ALIAS" || { echo "Missing secret: ANDROID_KEY_ALIAS"; exit 1; }
test -n "$ANDROID_KEY_PASSWORD" || { echo "Missing secret: ANDROID_KEY_PASSWORD"; exit 1; }

- name: Set up JDK 17
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: "17"
cache: gradle
cache-dependency-path: |
android/settings.gradle.kts
android/build.gradle.kts
android/gradle.properties
android/app/build.gradle.kts

- name: Set up Python 3.12
uses: actions/setup-python@v6
with:
python-version: "3.12"

- name: Set up Android SDK
uses: android-actions/setup-android@v3

- name: Accept Android SDK licenses
run: yes | sdkmanager --licenses > /dev/null

- name: Install Android SDK packages
run: sdkmanager "platforms;android-34" "build-tools;34.0.0"

- name: Prepare Android release keystore
env:
ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
run: |
printf '%s' "$ANDROID_KEYSTORE_BASE64" | base64 --decode > "$RUNNER_TEMP/android-release.keystore"
test -s "$RUNNER_TEMP/android-release.keystore"

- name: Build Android release APKs
env:
LOCAL_CHAQUOPY_REPO: ${{ github.workspace }}/android/.m2-chaquopy-ci
ANDROID_KEYSTORE_FILE: ${{ runner.temp }}/android-release.keystore
ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
run: |
chmod +x gradlew build-local-debug.sh
./build-local-debug.sh assembleStandardRelease
./build-local-debug.sh assembleLegacy32Release

- name: Rename APKs
run: |
cp app/build/outputs/apk/standard/release/app-standard-release.apk \
"app/build/outputs/apk/standard/release/$ANDROID_APK_STANDARD_NAME"
cp app/build/outputs/apk/legacy32/release/app-legacy32-release.apk \
"app/build/outputs/apk/legacy32/release/$ANDROID_APK_LEGACY32_NAME"

- name: Stage Android release artifacts
run: |
mkdir -p dist
cp "app/build/outputs/apk/standard/release/$ANDROID_APK_STANDARD_NAME" "dist/$ANDROID_APK_STANDARD_NAME"
cp "app/build/outputs/apk/legacy32/release/$ANDROID_APK_LEGACY32_NAME" "dist/$ANDROID_APK_LEGACY32_NAME"

- name: Upload artifact
uses: actions/upload-artifact@v7
with:
name: TgWsProxy-android-release
path: |
android/dist/${{ env.ANDROID_APK_STANDARD_NAME }}
android/dist/${{ env.ANDROID_APK_LEGACY32_NAME }}

release:
needs: [build-windows, build-win7, build-macos, build-linux]
needs: [build-windows, build-win7, build-macos, build-linux, build-android]
runs-on: ubuntu-latest
if: ${{ github.event.inputs.make_release == 'true' }}
steps:
Expand All @@ -329,6 +423,12 @@ jobs:
path: dist
merge-multiple: true

- name: Download Android build
uses: actions/download-artifact@v8
with:
name: TgWsProxy-android-release
path: dist

- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
Expand All @@ -343,6 +443,8 @@ jobs:
dist/TgWsProxy_macos_universal.dmg
dist/TgWsProxy_linux_amd64
dist/TgWsProxy_linux_amd64.deb
dist/tg-ws-proxy-android-${{ github.event.inputs.version }}.apk
dist/tg-ws-proxy-android-${{ github.event.inputs.version }}-legacy32.apk
draft: false
prerelease: false
env:
Expand Down
12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,18 @@ build/
.idea/
*.swp
*.swo
.gradle/
.gradle-local/
android/.gradle-local/
android/.m2-chaquopy*/
local.properties
android/.idea/
android/build/
android/app/build/
android/app/build
android/*.jks
*.keystore
android/*.keystore.properties

# OS
Thumbs.db
Expand Down
52 changes: 51 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,23 @@ chmod +x TgWsProxy_linux_amd64

При первом запуске откроется окно с инструкцией. Приложение работает в системном трее (требуется AppIndicator).

### Android

Перейдите на [страницу релизов](https://github.com/Flowseal/tg-ws-proxy/releases) и скачайте подписанный APK вида **`tg-ws-proxy-android-vX.Y.Z.apk`**.

После установки:

- откройте приложение
- проверьте `Android background limits`
- при необходимости отключите battery optimization и снимите background restrictions
- нажмите **Start Service**
- нажмите **Open in Telegram**

Что важно для стабильной работы на Android:

- разрешите уведомления
- отключите battery optimization для приложения

## Установка из исходников

### Консольный proxy
Expand Down Expand Up @@ -121,6 +138,20 @@ tg-ws-proxy-tray-linux
tg-ws-proxy [--port PORT] [--host HOST] [--dc-ip DC:IP ...] [-v]
```

### Android debug APK

Требуются JDK 17, Android SDK и Gradle. Локальная debug-сборка:

```bash
./android/build-local-debug.sh assembleStandardDebug
```

Результат:

```text
android/app/build/outputs/apk/standard/debug/app-standard-debug.apk
```

**Аргументы:**

| Аргумент | По умолчанию | Описание |
Expand Down Expand Up @@ -178,6 +209,26 @@ tg-ws-proxy-tray-linux = "linux:main"
- **Порт:** `1443` (или переопределенный вами)
- **Secret:** из настроек или логов

## Настройка Telegram Android

### Автоматически

В приложении нажмите **Open in Telegram** после запуска foreground service.

### Вручную

1. Telegram → **Настройки** → **Данные и память** → **Настройки прокси**
2. Добавить прокси:
- **Тип:** MTProto
- **Сервер:** `127.0.0.1`
- **Порт:** `1443`
- **Secret:** из настроек приложения

Важно:

- сначала должен быть запущен foreground service
- если Telegram был уже открыт, иногда проще закрыть и открыть его заново после запуска прокси

## Конфигурация

Tray-приложение хранит данные в:
Expand Down Expand Up @@ -217,7 +268,6 @@ Tray-приложение хранит данные в:
- Intel macOS 10.15+
- Apple Silicon macOS 11.0+
- Linux x86_64 (требуется AppIndicator для системного трея)

## Лицензия

[MIT License](LICENSE)
Loading