-
Notifications
You must be signed in to change notification settings - Fork 1
426 lines (355 loc) · 18.3 KB
/
android.yml
File metadata and controls
426 lines (355 loc) · 18.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
name: Build Android AAR
on:
push:
tags:
- 'v*'
- '[0-9]*'
pull_request:
branches: [ main ]
workflow_dispatch: # Ручной запуск
permissions:
contents: write
env:
GO_VERSION: '1.25.7'
NDK_VERSION: '26.1.10909125'
ANDROID_API: '24'
jobs:
# ═══════════════════════════════════════════════════════════════════════════
# Job 1: Собираем Go пакет mobile в teleghost.aar через gomobile bind
# ═══════════════════════════════════════════════════════════════════════════
build-aar:
name: Build Go → AAR (gomobile)
runs-on: ubuntu-latest
steps:
# ── 1. Checkout ──────────────────────────────────────────────────────
- name: Checkout code
uses: actions/checkout@v4
# ── 2. Setup Go ─────────────────────────────────────────────────────
- name: Setup Go ${{ env.GO_VERSION }}
uses: actions/setup-go@v5
with:
go-version: ${{ env.GO_VERSION }}
cache: true
# ── 3. Setup Java (для Android SDK/gomobile) ─────────────────────────
- name: Setup JDK 17
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '17'
# ── 4. Setup Android SDK + NDK ───────────────────────────────────────
- name: Setup Android SDK
uses: android-actions/setup-android@v3
- name: Install Android NDK
run: |
echo "Installing NDK ${{ env.NDK_VERSION }}..."
sdkmanager --install "ndk;${{ env.NDK_VERSION }}"
# Устанавливаем ANDROID_NDK_HOME
export ANDROID_NDK_HOME="$ANDROID_HOME/ndk/${{ env.NDK_VERSION }}"
echo "ANDROID_NDK_HOME=$ANDROID_NDK_HOME" >> $GITHUB_ENV
echo "NDK installed at: $ANDROID_NDK_HOME"
ls -la "$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/" | head -20
# ── 5. Install gomobile ──────────────────────────────────────────────
- name: Install gomobile
run: |
go install golang.org/x/mobile/cmd/gomobile@latest
go install golang.org/x/mobile/cmd/gobind@latest
# Добавляем GOPATH/bin в PATH
export PATH="$PATH:$(go env GOPATH)/bin"
echo "$(go env GOPATH)/bin" >> $GITHUB_PATH
# Инициализация gomobile
gomobile init
# ── 6. Установка системных зависимостей для CGO ──────────────────────
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
build-essential \
pkg-config \
libssl-dev \
zlib1g-dev
# ── 7. Настройка NDK компиляторов для CGO ───────────────────────────
#
# КРИТИЧЕСКИ ВАЖНО: gomobile сам управляет CC/CXX, но мы должны
# убедиться что CGO_ENABLED=1 и NDK тулчейн доступен.
#
- name: Configure NDK environment for CGO
run: |
NDK_TOOLCHAIN="$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64"
echo "──── NDK Toolchain contents ────"
ls "$NDK_TOOLCHAIN/bin/" | grep -E "clang$|clang\+\+$" | head -10
# Для arm64 (основная архитектура)
echo "CC_arm64=${NDK_TOOLCHAIN}/bin/aarch64-linux-android${ANDROID_API}-clang" >> $GITHUB_ENV
echo "CXX_arm64=${NDK_TOOLCHAIN}/bin/aarch64-linux-android${ANDROID_API}-clang++" >> $GITHUB_ENV
# Для arm (armv7)
echo "CC_arm=${NDK_TOOLCHAIN}/bin/armv7a-linux-androideabi${ANDROID_API}-clang" >> $GITHUB_ENV
echo "CXX_arm=${NDK_TOOLCHAIN}/bin/armv7a-linux-androideabi${ANDROID_API}-clang++" >> $GITHUB_ENV
# Для x86_64
echo "CC_x86_64=${NDK_TOOLCHAIN}/bin/x86_64-linux-android${ANDROID_API}-clang" >> $GITHUB_ENV
echo "CXX_x86_64=${NDK_TOOLCHAIN}/bin/x86_64-linux-android${ANDROID_API}-clang++" >> $GITHUB_ENV
# Проверяем доступность компиляторов
echo "──── Compiler verification ────"
"${NDK_TOOLCHAIN}/bin/aarch64-linux-android${ANDROID_API}-clang" --version || true
"${NDK_TOOLCHAIN}/bin/armv7a-linux-androideabi${ANDROID_API}-clang" --version || true
# ── 8. Go dependencies ──────────────────────────────────────────────
- name: Download Go dependencies
run: |
go mod download
go mod verify
# ── 9. Setup Node.js & Build Frontend ──────────────────────────────
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: frontend/package-lock.json
- name: Build frontend
run: |
cd frontend
npm ci
npm run build
echo "──── Frontend dist ────"
ls -la dist/
- name: Copy frontend to mobile package
run: |
rm -rf mobile/dist
cp -r frontend/dist mobile/dist
ls -la mobile/dist
# ── 10. Install Boost (Headers Only) ────────────────────────────────
- name: Download Boost Headers
run: |
BOOST_VER="1.84.0"
BOOST_NAME="boost_1_84_0"
# ── 10. Install Boost (Headers Only) ────────────────────────────────
- name: Download Boost Prebuilts
run: |
echo "Cloning Boost for Android (PurpleI2P)..."
# Clone specific branch (e.g. boost-1_78_0 as latest prebuilt available)
git clone --depth 1 -b boost-1_78_0 https://github.com/PurpleI2P/Boost-for-Android-Prebuilt.git boost_prebuilt
echo "Scanning for Boost root..."
ls -F boost_prebuilt/
# Find version directory (e.g. boost-1_78_0 or boost_1_78_0)
# We prefer the subdirectory if it exists
BOOST_SUBDIR=$(find boost_prebuilt -maxdepth 1 -type d -name "boost*" | grep -v "^boost_prebuilt$" | head -n 1)
if [ -n "$BOOST_SUBDIR" ]; then
echo "Found Boost Version Subdir: $BOOST_SUBDIR"
echo "BOOST_ROOT=$PWD/$BOOST_SUBDIR" >> $GITHUB_ENV
elif [ -d "boost_prebuilt/boost" ] || [ -d "boost_prebuilt/include/boost" ]; then
echo "Found Boost content in root."
echo "BOOST_ROOT=$PWD/boost_prebuilt" >> $GITHUB_ENV
else
echo "Error: Could not find any boost directory usage pattern 'boost*' inside boost_prebuilt"
ls -R boost_prebuilt
exit 1
fi
- name: Download OpenSSL Prebuilts
run: |
echo "Cloning OpenSSL for Android (PurpleI2P)..."
git clone --depth 1 https://github.com/PurpleI2P/OpenSSL-for-Android-Prebuilt.git openssl_prebuilt
# PurpleI2P structure: openssl-1.1.1/{arch}/include
echo "OPENSSL_ROOT=$PWD/openssl_prebuilt/openssl-1.1.1/arm64-v8a" >> $GITHUB_ENV
- name: Verify OpenSSL Structure
run: |
ls -R openssl_prebuilt | head -20
echo "--- Checking specific path ---"
ls -F openssl_prebuilt/openssl-1.1.1/ || true
- name: Compile i2pd (Android)
run: |
chmod +x scripts/build_i2pd_android.sh
# Find OpenSSL base
OPENSSL_DIR=$(find openssl_prebuilt -maxdepth 1 -type d -name "openssl-1.1*" | head -n 1)
if [ -z "$OPENSSL_DIR" ]; then OPENSSL_DIR="openssl_prebuilt/openssl-1.1.1"; fi
OPENSSL_ROOT="$PWD/$OPENSSL_DIR"
# Source
I2PD_SRC="$PWD/internal/network/i2pd/i2pd"
echo "Building i2pd with:"
echo " NDK: $ANDROID_NDK_HOME"
echo " OpenSSL: $OPENSSL_ROOT"
echo " Boost: $BOOST_ROOT"
# Run build script
./scripts/build_i2pd_android.sh "$ANDROID_NDK_HOME" "$OPENSSL_ROOT" "$BOOST_ROOT" "$I2PD_SRC"
echo "Verifying compiled libs..."
ls -R internal/network/i2pd/lib
# Copy Boost Libs to internal/network/i2pd/lib/{arch}
echo "Copying Boost libraries..."
# Function to find and copy boost libs
cp_boost() {
ARCH_SRC=$1
ARCH_DST=$2
# Check potential boost lib paths
# PurpleI2P boost structure usually: boost-1.x/lib/arch/libboost_*.a OR boost-1.x/arch/lib
SRC_DIR=""
if [ -d "$BOOST_ROOT/lib/$ARCH_SRC" ]; then SRC_DIR="$BOOST_ROOT/lib/$ARCH_SRC"; fi
if [ -d "$BOOST_ROOT/$ARCH_SRC/lib" ]; then SRC_DIR="$BOOST_ROOT/$ARCH_SRC/lib"; fi
if [ -n "$SRC_DIR" ]; then
echo "Found Boost libs at $SRC_DIR. Copying..."
cp "$SRC_DIR"/libboost_program_options.a "internal/network/i2pd/lib/$ARCH_DST/" || echo "Warn: libboost_program_options.a not found"
# Add filesystem/system if needed, but modern boost might be header-only for those or not needed
else
echo "Error: Boost libs for $ARCH_SRC not found structure!"
ls -R "$BOOST_ROOT" | head -n 20
fi
}
cp_boost "arm64-v8a" "arm64-v8a"
cp_boost "armeabi-v7a" "armeabi-v7a"
cp_boost "x86_64" "x86_64"
cp_boost "x86" "x86"
# ── 11. BUILD: gomobile bind ────────────────────────────────────────
- name: Build AAR with CGO
run: |
export PATH="$PATH:$(go env GOPATH)/bin"
export CGO_ENABLED=1
export ANDROID_NDK_HOME="${{ env.ANDROID_NDK_HOME }}"
# 1. Find Boost include dir (EXACT PATH for C++ headers)
BOOST_H_PATH=$(find boost_prebuilt -name version.hpp | grep "boost/version.hpp" | head -n 1)
if [ -z "$BOOST_H_PATH" ]; then
echo "Error: boost/version.hpp not found!"
find boost_prebuilt -maxdepth 3
exit 1
fi
BOOST_INCLUDE_DIR=$(dirname $(dirname "$BOOST_H_PATH"))
echo "Found Boost include dir: $BOOST_INCLUDE_DIR"
# 2. Find OpenSSL include dir
DSA_H=$(find openssl_prebuilt -name dsa.h | head -n 1)
if [ -z "$DSA_H" ]; then
echo "Error: openssl/dsa.h not found!"
exit 1
fi
OPENSSL_INCLUDE_DIR=$(dirname $(dirname "$DSA_H"))
echo "Found OpenSSL include dir: $OPENSSL_INCLUDE_DIR"
# 3. Set CGO flags with ALL necessary include paths
# We need: i2pd headers AND dependency headers
I2P_INC="-I$GITHUB_WORKSPACE/internal/network/i2pd/i2pd/libi2pd -I$GITHUB_WORKSPACE/internal/network/i2pd/i2pd/libi2pd_client -I$GITHUB_WORKSPACE/internal/network/i2pd/i2pd/i18n -I$GITHUB_WORKSPACE/internal/network/i2pd/i2pd"
DEP_INC="-I$GITHUB_WORKSPACE/$BOOST_INCLUDE_DIR -I$GITHUB_WORKSPACE/$OPENSSL_INCLUDE_DIR"
# Fix for Boost + Clang compatibility:
# -Wno-enum-constexpr-conversion: Fixes -1 outside range error in Boost MPL
# -Wno-deprecated-builtins: Silences warnings about deprecated triviality checks
# -D_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_FUNCTION: Consistency with i2pd build
EXTRA_FLAGS="-Wno-enum-constexpr-conversion -Wno-deprecated-builtins -D_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_FUNCTION"
export CGO_CXXFLAGS="$I2P_INC $DEP_INC $EXTRA_FLAGS"
export CGO_CFLAGS="$DEP_INC"
echo "CGO_CXXFLAGS: $CGO_CXXFLAGS"
echo "──── Library structure (Verification) ────"
# Verify that libs were copied by our script
ls -R internal/network/i2pd/lib
echo " CGO_ENABLED=$CGO_ENABLED"
echo " ANDROID_NDK_HOME=$ANDROID_NDK_HOME"
echo " Target: android (API ${{ env.ANDROID_API }})"
echo "══════════════════════════════════════════════"
# Сборка .aar
CGO_ENABLED=1 gomobile bind \
-v \
-tags cgo_i2pd \
-target=android \
-androidapi ${{ env.ANDROID_API }} \
-o teleghost.aar \
./mobile
echo "──── Build output ────"
ls -lh teleghost.aar
file teleghost.aar
# ── 10. Upload AAR artifact ─────────────────────────────────────────
- name: Upload AAR artifact
uses: actions/upload-artifact@v4
with:
name: teleghost-aar
path: teleghost.aar
retention-days: 30
# ═══════════════════════════════════════════════════════════════════════════
# Job 2: Собираем Android APK (опциональная, если есть Gradle проект)
# ═══════════════════════════════════════════════════════════════════════════
build-apk:
name: Build Android APK
needs: build-aar
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup JDK 17
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '17'
- name: Setup Android SDK
uses: android-actions/setup-android@v3
# Скачиваем .aar из предыдущего job-а
- name: Download AAR artifact
uses: actions/download-artifact@v4
with:
name: teleghost-aar
path: android/app/libs/
- name: Verify AAR
run: |
echo "──── Verifying AAR ────"
ls -lh android/app/libs/
file android/app/libs/teleghost.aar
# Собираем фронтенд (Svelte → dist)
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: frontend/package-lock.json
- name: Build frontend
run: |
cd frontend
npm ci
npm run build
echo "──── Frontend dist ────"
ls -la dist/
# Копируем фронтенд dist в assets Android проекта
# (хотя теперь Go раздаёт фронтенд сам, оставим для совместимости или ресурсов)
- name: Copy frontend to Android assets
run: |
mkdir -p android/app/src/main/assets
cp -r frontend/dist/* android/app/src/main/assets/
echo "──── Android assets ────"
ls -la android/app/src/main/assets/
# Gradle build
- name: Build APK
run: |
cd android
chmod +x gradlew 2>/dev/null || true
./gradlew assembleDebug --stacktrace || {
echo "──── Gradle wrapper not found, using system gradle ────"
gradle assembleDebug --stacktrace
}
- name: Upload APK artifact
uses: actions/upload-artifact@v4
with:
name: teleghost-android-debug
path: android/app/build/outputs/apk/debug/*.apk
retention-days: 30
# ═══════════════════════════════════════════════════════════════════════════
# Job 3: Создаём Release (только при push тега v*)
# ═══════════════════════════════════════════════════════════════════════════
release-android:
name: Release Android
needs: [build-aar, build-apk]
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/')
steps:
- name: Download AAR
uses: actions/download-artifact@v4
with:
name: teleghost-aar
- name: Download APK
uses: actions/download-artifact@v4
with:
name: teleghost-android-debug
- name: Create Release
uses: softprops/action-gh-release@v2
with:
files: |
teleghost.aar
*.apk
draft: false
prerelease: true
body: |
## Android Build 🤖
### Артефакты:
- `teleghost.aar` — Go библиотека для Android (gomobile bind + CGO)
- `*.apk` — Debug APK для тестирования
### Требования:
- Android 5.0+ (API 21)
- Архитектуры: arm64-v8a, armeabi-v7a, x86_64
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}