diff --git a/app.json b/app.json
index 03f2e21..c106650 100644
--- a/app.json
+++ b/app.json
@@ -33,6 +33,7 @@
"favicon": "./assets/images/favicon.png"
},
"plugins": [
+ "./plugins/with-portable-gradle-toolchain",
"expo-router",
[
"expo-camera",
diff --git a/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/results.bin b/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/results.bin
new file mode 100644
index 0000000..7ed749e
--- /dev/null
+++ b/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/results.bin
@@ -0,0 +1 @@
+o/bundleLibRuntimeToDirDebug
diff --git a/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/BuildConfig.dex b/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/BuildConfig.dex
new file mode 100644
index 0000000..75b5596
Binary files /dev/null and b/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/BuildConfig.dex differ
diff --git a/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/ExpoEasyTierVpnModule$Companion.dex b/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/ExpoEasyTierVpnModule$Companion.dex
new file mode 100644
index 0000000..6e41a64
Binary files /dev/null and b/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/ExpoEasyTierVpnModule$Companion.dex differ
diff --git a/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/ExpoEasyTierVpnModule$definition$lambda$3$$inlined$AsyncFunction$1.dex b/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/ExpoEasyTierVpnModule$definition$lambda$3$$inlined$AsyncFunction$1.dex
new file mode 100644
index 0000000..68d01ae
Binary files /dev/null and b/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/ExpoEasyTierVpnModule$definition$lambda$3$$inlined$AsyncFunction$1.dex differ
diff --git a/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/ExpoEasyTierVpnModule$definition$lambda$3$$inlined$AsyncFunction$2.dex b/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/ExpoEasyTierVpnModule$definition$lambda$3$$inlined$AsyncFunction$2.dex
new file mode 100644
index 0000000..2e9e01c
Binary files /dev/null and b/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/ExpoEasyTierVpnModule$definition$lambda$3$$inlined$AsyncFunction$2.dex differ
diff --git a/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/ExpoEasyTierVpnModule$definition$lambda$3$$inlined$AsyncFunction$3.dex b/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/ExpoEasyTierVpnModule$definition$lambda$3$$inlined$AsyncFunction$3.dex
new file mode 100644
index 0000000..c26e581
Binary files /dev/null and b/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/ExpoEasyTierVpnModule$definition$lambda$3$$inlined$AsyncFunction$3.dex differ
diff --git a/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/ExpoEasyTierVpnModule$definition$lambda$3$$inlined$AsyncFunctionWithoutArgs$1.dex b/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/ExpoEasyTierVpnModule$definition$lambda$3$$inlined$AsyncFunctionWithoutArgs$1.dex
new file mode 100644
index 0000000..8c7b9d6
Binary files /dev/null and b/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/ExpoEasyTierVpnModule$definition$lambda$3$$inlined$AsyncFunctionWithoutArgs$1.dex differ
diff --git a/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/ExpoEasyTierVpnModule$definition$lambda$3$$inlined$FunctionWithoutArgs$1.dex b/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/ExpoEasyTierVpnModule$definition$lambda$3$$inlined$FunctionWithoutArgs$1.dex
new file mode 100644
index 0000000..ec915ab
Binary files /dev/null and b/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/ExpoEasyTierVpnModule$definition$lambda$3$$inlined$FunctionWithoutArgs$1.dex differ
diff --git a/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/ExpoEasyTierVpnModule.dex b/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/ExpoEasyTierVpnModule.dex
new file mode 100644
index 0000000..3281a72
Binary files /dev/null and b/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/modules/easytier/ExpoEasyTierVpnModule.dex differ
diff --git a/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin b/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin
new file mode 100644
index 0000000..601f245
Binary files /dev/null and b/modules/expo-easytier-vpn/android/build/.transforms/4825c1e462d5e6e59d2960fb040aa2fc/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin differ
diff --git a/modules/expo-easytier-vpn/android/build/.transforms/be62a2d457ad24785bba0388a6b22df9/results.bin b/modules/expo-easytier-vpn/android/build/.transforms/be62a2d457ad24785bba0388a6b22df9/results.bin
new file mode 100644
index 0000000..0d259dd
--- /dev/null
+++ b/modules/expo-easytier-vpn/android/build/.transforms/be62a2d457ad24785bba0388a6b22df9/results.bin
@@ -0,0 +1 @@
+o/classes
diff --git a/modules/expo-easytier-vpn/android/build/.transforms/be62a2d457ad24785bba0388a6b22df9/transformed/classes/classes_dex/classes.dex b/modules/expo-easytier-vpn/android/build/.transforms/be62a2d457ad24785bba0388a6b22df9/transformed/classes/classes_dex/classes.dex
new file mode 100644
index 0000000..dfd7cca
Binary files /dev/null and b/modules/expo-easytier-vpn/android/build/.transforms/be62a2d457ad24785bba0388a6b22df9/transformed/classes/classes_dex/classes.dex differ
diff --git a/modules/expo-easytier-vpn/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties b/modules/expo-easytier-vpn/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
index 619c3ae..ff40e6c 100644
--- a/modules/expo-easytier-vpn/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
+++ b/modules/expo-easytier-vpn/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
@@ -1 +1 @@
-#Wed Mar 25 11:49:16 CDT 2026
+#Wed Mar 25 12:15:20 CDT 2026
diff --git a/modules/expo-easytier-vpn/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml b/modules/expo-easytier-vpn/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml
index 8f7a9d3..2cae5e7 100644
--- a/modules/expo-easytier-vpn/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml
+++ b/modules/expo-easytier-vpn/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml
@@ -1,2 +1,2 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/modules/expo-easytier-vpn/android/build/intermediates/incremental/mergeDebugAssets/merger.xml b/modules/expo-easytier-vpn/android/build/intermediates/incremental/mergeDebugAssets/merger.xml
index 6d57f43..694c6c6 100644
--- a/modules/expo-easytier-vpn/android/build/intermediates/incremental/mergeDebugAssets/merger.xml
+++ b/modules/expo-easytier-vpn/android/build/intermediates/incremental/mergeDebugAssets/merger.xml
@@ -1,2 +1,2 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/modules/expo-easytier-vpn/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml b/modules/expo-easytier-vpn/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
index 295e887..9880a90 100644
--- a/modules/expo-easytier-vpn/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
+++ b/modules/expo-easytier-vpn/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
@@ -1,2 +1,2 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/modules/expo-easytier-vpn/android/build/intermediates/incremental/mergeDebugShaders/merger.xml b/modules/expo-easytier-vpn/android/build/intermediates/incremental/mergeDebugShaders/merger.xml
index 8954df5..4cdf415 100644
--- a/modules/expo-easytier-vpn/android/build/intermediates/incremental/mergeDebugShaders/merger.xml
+++ b/modules/expo-easytier-vpn/android/build/intermediates/incremental/mergeDebugShaders/merger.xml
@@ -1,2 +1,2 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/modules/expo-easytier-vpn/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt b/modules/expo-easytier-vpn/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt
index b089476..aac6318 100644
--- a/modules/expo-easytier-vpn/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt
+++ b/modules/expo-easytier-vpn/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt
@@ -5,7 +5,7 @@
5
6
7
-7-->C:\project\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml:2:3-65
-7-->C:\project\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml:2:20-62
+7-->C:\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml:2:3-65
+7-->C:\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml:2:20-62
8
9
diff --git a/modules/expo-easytier-vpn/android/build/kotlin/compileDebugKotlin/cacheable/last-build.bin b/modules/expo-easytier-vpn/android/build/kotlin/compileDebugKotlin/cacheable/last-build.bin
index 7650025..9e1c135 100644
Binary files a/modules/expo-easytier-vpn/android/build/kotlin/compileDebugKotlin/cacheable/last-build.bin and b/modules/expo-easytier-vpn/android/build/kotlin/compileDebugKotlin/cacheable/last-build.bin differ
diff --git a/modules/expo-easytier-vpn/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin b/modules/expo-easytier-vpn/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin
deleted file mode 100644
index 2dc55c9..0000000
Binary files a/modules/expo-easytier-vpn/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin and /dev/null differ
diff --git a/modules/expo-easytier-vpn/android/build/outputs/logs/manifest-merger-debug-report.txt b/modules/expo-easytier-vpn/android/build/outputs/logs/manifest-merger-debug-report.txt
index 4ee0f2f..82db5c6 100644
--- a/modules/expo-easytier-vpn/android/build/outputs/logs/manifest-merger-debug-report.txt
+++ b/modules/expo-easytier-vpn/android/build/outputs/logs/manifest-merger-debug-report.txt
@@ -1,20 +1,20 @@
-- Merging decision tree log ---
manifest
-ADDED from C:\project\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml:1:1-3:12
-INJECTED from C:\project\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml:1:1-3:12
+ADDED from C:\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml:1:1-3:12
+INJECTED from C:\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml:1:1-3:12
package
- INJECTED from C:\project\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml
+ INJECTED from C:\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml
xmlns:android
- ADDED from C:\project\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml:1:11-69
+ ADDED from C:\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml:1:11-69
uses-permission#android.permission.INTERNET
-ADDED from C:\project\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml:2:3-65
+ADDED from C:\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml:2:3-65
android:name
- ADDED from C:\project\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml:2:20-62
+ ADDED from C:\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml:2:20-62
uses-sdk
-INJECTED from C:\project\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml reason: use-sdk injection requested
-INJECTED from C:\project\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml
-INJECTED from C:\project\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml
+INJECTED from C:\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml reason: use-sdk injection requested
+INJECTED from C:\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml
+INJECTED from C:\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml
android:targetSdkVersion
- INJECTED from C:\project\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml
+ INJECTED from C:\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml
android:minSdkVersion
- INJECTED from C:\project\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml
+ INJECTED from C:\mobile\modules\expo-easytier-vpn\android\src\main\AndroidManifest.xml
diff --git a/package-lock.json b/package-lock.json
index b623dcf..9ceaf6c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,9 +16,11 @@
"expo-camera": "~17.0.9",
"expo-clipboard": "~8.0.7",
"expo-constants": "~55.0.9",
+ "expo-easytier-vpn": "file:./modules/expo-easytier-vpn",
"expo-font": "~55.0.4",
"expo-linear-gradient": "~15.0.7",
"expo-linking": "~55.0.8",
+ "expo-modules-core": "~55.0.17",
"expo-router": "~55.0.7",
"expo-splash-screen": "~55.0.12",
"expo-status-bar": "~55.0.4",
@@ -38,6 +40,15 @@
"typescript": "~5.9.2"
}
},
+ "modules/expo-easytier-vpn": {
+ "version": "1.0.0",
+ "license": "MIT",
+ "peerDependencies": {
+ "expo": "*",
+ "react": "*",
+ "react-native": "*"
+ }
+ },
"node_modules/@babel/code-frame": {
"version": "7.29.0",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
@@ -4391,6 +4402,10 @@
"react-native": "*"
}
},
+ "node_modules/expo-easytier-vpn": {
+ "resolved": "modules/expo-easytier-vpn",
+ "link": true
+ },
"node_modules/expo-file-system": {
"version": "55.0.11",
"resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-55.0.11.tgz",
diff --git a/plugins/with-portable-gradle-toolchain.js b/plugins/with-portable-gradle-toolchain.js
new file mode 100644
index 0000000..16dfb8f
--- /dev/null
+++ b/plugins/with-portable-gradle-toolchain.js
@@ -0,0 +1,67 @@
+const {
+ withAppBuildGradle,
+ withGradleProperties,
+} = require("expo/config-plugins");
+
+const TARGET_KEYS = new Set([
+ "org.gradle.java.installations.auto-detect",
+ "org.gradle.java.installations.auto-download",
+ "org.gradle.java.installations.fromEnv",
+ "org.gradle.java.installations.paths",
+]);
+
+function upsertProperty(entries, key, value) {
+ const existing = entries.find(
+ (entry) => entry.type === "property" && entry.key === key
+ );
+
+ if (existing) {
+ existing.value = value;
+ return;
+ }
+
+ entries.push({ type: "property", key, value });
+}
+
+function addCppFlag(contents) {
+ const flag = 'cppFlags "-Wno-error=deprecated-declarations"';
+ if (contents.includes(flag)) {
+ return contents;
+ }
+
+ return contents.replace(
+ /(buildConfigField "String", "REACT_NATIVE_RELEASE_LEVEL", "[^\n]*"\n)/,
+ `$1 externalNativeBuild {\n cmake {\n ${flag}\n }\n }\n`
+ );
+}
+
+module.exports = function withPortableGradleToolchain(config) {
+ config = withGradleProperties(config, (config) => {
+ config.modResults = config.modResults.filter(
+ (entry) => !(entry.type === "property" && TARGET_KEYS.has(entry.key))
+ );
+
+ upsertProperty(
+ config.modResults,
+ "org.gradle.java.installations.auto-detect",
+ "false"
+ );
+ upsertProperty(
+ config.modResults,
+ "org.gradle.java.installations.auto-download",
+ "false"
+ );
+ upsertProperty(
+ config.modResults,
+ "org.gradle.java.installations.fromEnv",
+ "JAVA_HOME"
+ );
+
+ return config;
+ });
+
+ return withAppBuildGradle(config, (config) => {
+ config.modResults.contents = addCppFlag(config.modResults.contents);
+ return config;
+ });
+};