Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
275 changes: 275 additions & 0 deletions .github/workflows/android-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,275 @@
name: Android Build

on:
push:
branches: [ master, main, 'claude/**' ]
pull_request:
branches: [ master, main ]

jobs:
build:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'

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

- name: Install NDK and CMake
run: |
sdkmanager --install "ndk;25.1.8937393" "cmake;3.22.1"
echo "ANDROID_NDK_HOME=$ANDROID_HOME/ndk/25.1.8937393" >> $GITHUB_ENV

- name: Cache Gradle packages
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-

- name: Grant execute permission for gradlew
run: chmod +x gradlew

- name: Create local.properties
run: |
echo "sdk.dir=$ANDROID_HOME" > local.properties
echo "ndk.dir=$ANDROID_NDK_HOME" >> local.properties

- name: Create dummy google-services.json
run: |
mkdir -p app
cat > app/google-services.json << 'EOF'
{
"project_info": {
"project_number": "000000000000",
"project_id": "dummy-project",
"storage_bucket": "dummy-project.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:000000000000:android:0000000000000000",
"android_client_info": {
"package_name": "org.proxydroid"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "dummy-api-key"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
}
],
"configuration_version": "1"
}
EOF

- name: Build Debug APK
run: ./gradlew assembleDebug --stacktrace

- name: Upload Debug APK
uses: actions/upload-artifact@v4
with:
name: app-debug
path: app/build/outputs/apk/debug/app-debug.apk
retention-days: 7

lint:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'

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

- name: Cache Gradle packages
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-

- name: Grant execute permission for gradlew
run: chmod +x gradlew

- name: Create local.properties
run: echo "sdk.dir=$ANDROID_HOME" > local.properties

- name: Create dummy google-services.json
run: |
mkdir -p app
cat > app/google-services.json << 'EOF'
{
"project_info": {
"project_number": "000000000000",
"project_id": "dummy-project",
"storage_bucket": "dummy-project.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:000000000000:android:0000000000000000",
"android_client_info": {
"package_name": "org.proxydroid"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "dummy-api-key"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
}
],
"configuration_version": "1"
}
EOF

- name: Run Lint
run: ./gradlew lint --stacktrace
continue-on-error: true

- name: Upload Lint Results
uses: actions/upload-artifact@v4
if: always()
with:
name: lint-results
path: app/build/reports/lint-results*.html
retention-days: 7

test:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'

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

- name: Install NDK and CMake
run: |
sdkmanager --install "ndk;25.1.8937393" "cmake;3.22.1"
echo "ANDROID_NDK_HOME=$ANDROID_HOME/ndk/25.1.8937393" >> $GITHUB_ENV

- name: Cache Gradle packages
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-

- name: Grant execute permission for gradlew
run: chmod +x gradlew

- name: Create local.properties
run: |
echo "sdk.dir=$ANDROID_HOME" > local.properties
echo "ndk.dir=$ANDROID_NDK_HOME" >> local.properties

- name: Create dummy google-services.json
run: |
mkdir -p app
cat > app/google-services.json << 'EOF'
{
"project_info": {
"project_number": "000000000000",
"project_id": "dummy-project",
"storage_bucket": "dummy-project.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:000000000000:android:0000000000000000",
"android_client_info": {
"package_name": "org.proxydroid"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "dummy-api-key"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
}
],
"configuration_version": "1"
}
EOF

- name: Run Unit Tests
run: ./gradlew testDebugUnitTest --stacktrace

- name: Upload Test Results
uses: actions/upload-artifact@v4
if: always()
with:
name: test-results
path: |
app/build/reports/tests/
app/build/test-results/
retention-days: 7

- name: Test Summary
if: always()
run: |
echo "=== Test Summary ==="
find app/build -name "TEST-*.xml" -type f 2>/dev/null | while read f; do
echo "--- $f ---"
cat "$f"
done || echo "No test XML results found"
echo ""
echo "=== Test Report ==="
if [ -f "app/build/reports/tests/testDebugUnitTest/index.html" ]; then
echo "Test report generated successfully"
else
echo "No HTML test report found"
find app/build -name "*.html" -type f 2>/dev/null | head -20
fi
34 changes: 20 additions & 14 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'
apply plugin: 'io.fabric'
plugins {
id 'com.android.application'
id 'com.google.gms.google-services'
id 'com.google.firebase.crashlytics'
}

android {
compileSdkVersion 29
buildToolsVersion "29.0.0"
namespace 'org.proxydroid'
compileSdk 33
ndkVersion "25.1.8937393"
defaultConfig {
applicationId "org.proxydroid"
minSdkVersion 16
targetSdkVersion 29
versionCode 72
versionName "3.2.0"
minSdk 21
targetSdk 33
versionCode 73
versionName "3.3.0"

ndk {
// Specifies the ABI configurations of your native
Expand All @@ -25,20 +28,19 @@ android {
}
}
compileOptions {
sourceCompatibility = 1.8
targetCompatibility = 1.8
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}

externalNativeBuild {
cmake {
version '3.10.2'
path "src/main/cpp/CMakeLists.txt"
}
}
}

configurations {
compile.exclude group: "junit", module: "junit"
implementation.exclude group: "junit", module: "junit"
}

dependencies {
Expand All @@ -50,5 +52,9 @@ dependencies {
implementation 'com.google.firebase:firebase-core:17.2.1'
implementation 'com.google.firebase:firebase-ads:18.3.0'
implementation 'com.google.firebase:firebase-analytics:17.2.1'
implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1'
implementation 'com.google.firebase:firebase-crashlytics:18.4.3'

// Test dependencies
testImplementation 'junit:junit:4.13.2'
testImplementation 'org.mockito:mockito-core:4.11.0'
}
Loading
Loading