Skip to content
Draft
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
1,130 changes: 1,130 additions & 0 deletions assets/ip-list.txt

Large diffs are not rendered by default.

16 changes: 16 additions & 0 deletions clients/android/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ plugins {

val repoRoot = layout.projectDirectory.dir("../../..")
val generatedSkirkJniLibs = layout.buildDirectory.dir("generated/skirk-go/jniLibs")
val generatedSkirkAssets = layout.buildDirectory.dir("generated/skirk-assets")
val generatedHevJniLibs = layout.buildDirectory.dir("generated/hev-tun2socks/jniLibs")
val hevSourceDir = repoRoot.dir("third_party/hev-socks5-tunnel")
val skirkAppVersion = providers.gradleProperty("skirk.version").orElse("0.1.55").get()
Expand Down Expand Up @@ -78,6 +79,19 @@ val buildSkirkAndroidSidecar = tasks.register("buildSkirkAndroidSidecar") {
}
}

val copySkirkAndroidAssets = tasks.register("copySkirkAndroidAssets") {
group = "build"
description = "Copy shared Skirk assets into the Android APK."
inputs.file(repoRoot.file("assets/ip-list.txt"))
outputs.dir(generatedSkirkAssets)

doLast {
val outputDir = generatedSkirkAssets.get().asFile
outputDir.mkdirs()
repoRoot.file("assets/ip-list.txt").asFile.copyTo(outputDir.resolve("ip-list.txt"), overwrite = true)
}
}

fun androidSdkRoot(): File {
val explicit = providers.gradleProperty("android.sdk.path").orNull
val env = System.getenv("ANDROID_HOME") ?: System.getenv("ANDROID_SDK_ROOT")
Expand Down Expand Up @@ -199,6 +213,7 @@ android {
getByName("main") {
jniLibs.srcDir(generatedSkirkJniLibs)
jniLibs.srcDir(generatedHevJniLibs)
assets.srcDir(generatedSkirkAssets)
}
}

Expand All @@ -212,6 +227,7 @@ android {
tasks.named("preBuild") {
dependsOn(buildSkirkAndroidSidecar)
dependsOn(buildHevTun2socks)
dependsOn(copySkirkAndroidAssets)
}

dependencies {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class AndroidSkirkEngine(
waitForListenPortRelease(profile)

val configFile = writeRuntimeConfig(profile)
val googleIpListFile = prepareGoogleIpListFile()
val engine = File(context.applicationInfo.nativeLibraryDir, ENGINE_NAME)
check(engine.exists()) { "Skirk engine was not packaged at ${engine.absolutePath}" }

Expand All @@ -40,12 +41,15 @@ class AndroidSkirkEngine(
Log.i(TAG, "Starting ${engine.absolutePath} on SOCKS ${profile.socksAddress} HTTP $httpListen")
appendLogLine(
logFile,
"android starting mode=${profile.connectionMode} socks=${profile.socksAddress} http=$httpListen",
"android starting mode=${profile.connectionMode} socks=${profile.socksAddress} http=$httpListen googleIpList=${googleIpListFile.absolutePath}",
)
process = ProcessBuilder(buildProcessArgs(engine, configFile, profile, metricsFile))
val processBuilder = ProcessBuilder(buildProcessArgs(engine, configFile, profile, metricsFile))
.directory(context.filesDir)
.redirectErrorStream(true)
.redirectOutput(ProcessBuilder.Redirect.appendTo(logFile))
processBuilder.environment()["SKIRK_GOOGLE_IP_LIST"] = googleIpListFile.absolutePath
processBuilder.environment()["SKIRK_CACHED_LIST"] = googleIpListFile.absolutePath
process = processBuilder
.start()
.also { child ->
watchProcessExit(child, logFile)
Expand Down Expand Up @@ -237,6 +241,21 @@ class AndroidSkirkEngine(
private fun readinessHost(host: String): String =
if (host == "0.0.0.0") "127.0.0.1" else host

private fun prepareGoogleIpListFile(): File {
val googleIpDir = File(context.filesDir, "google-ip").apply { mkdirs() }
val target = File(googleIpDir, "ip-list.txt")
runCatching {
context.assets.open("ip-list.txt").use { input ->
target.outputStream().use { output ->
input.copyTo(output)
}
}
}.getOrElse { error ->
throw IllegalStateException("Skirk Android assets did not include ip-list.txt", error)
}
return target
}

private fun writeRuntimeConfig(profile: ClientProfile): File {
val configsDir = File(context.filesDir, "configs").apply { mkdirs() }
val suffix = if (profile.rawConfig.trim().startsWith("skirk:")) "skirk" else "json"
Expand Down
12 changes: 12 additions & 0 deletions clients/android/settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,15 @@ dependencyResolutionManagement {

rootProject.name = "SkirkAndroid"
include(":app")

val sdkPath = providers.gradleProperty("android.sdk.path").orNull
?: System.getenv("ANDROID_SDK_ROOT")
?: System.getenv("ANDROID_HOME")
if (!sdkPath.isNullOrBlank()) {
val localPropertiesFile = rootDir.resolve("local.properties")
if (!localPropertiesFile.exists()) {
localPropertiesFile.writeText("""
sdk.dir=$sdkPath
""".trimIndent() + "\n")
}
}
Loading