Hasta ahora la APK salia re-firmando la de epsylon, y su classes.dex no implementa WebChromeClient.onPermissionRequest. Sin ese metodo el WebView deniega por defecto todo getUserMedia, asi que las videollamadas de Karvan no podian funcionar por mucho que se parchease el manifest: la lista de permisos es estatica y se fija al compilar. El wrapper cierra las dos puertas. Declara CAMERA, RECORD_AUDIO y MODIFY_AUDIO_SETTINGS, pero no se conceden al instalar: son permisos peligrosos y se piden en tiempo de ejecucion la primera vez que se pulsa Llamar. Si nadie llama, no se pide nada. uses-feature required=false evita excluir dispositivos sin camara. Reutiliza las tres librerias nativas tal cual: libnode.so es nodejs-mobile v18.20.4 oficial y libnative-lib.so son 6,8 KB con un unico simbolo JNI. De ahi que el namespace sea com.solarnethub.oasis —JNI resuelve por nombre— mientras el applicationId es net.laenre.oasis, que permite instalarla junto a la oficial. No hace falta NDK ni compilar Node. De paso corrige cosas del APK actual: targetSdk 35, trafico en claro permitido solo hacia loopback en vez de usesCleartextTraffic global, allowBackup a false para que adb backup no saque el .ssb, y el backend en un servicio en primer plano en el proceso :node, que ademas es lo que permitira reiniciarlo limpio para el cambio de identidad. El APK actual declara FOREGROUND_SERVICE pero no registra ningun servicio, de modo que el backend muere al pasar a segundo plano. Los binarios no se versionan: scripts/prepare.sh extrae las librerias y empaqueta el backend. La keystore se pasa por entorno. Verificado: ./gradlew assembleDebug construye una APK de 52 MB con las tres librerias, targetSdk 35 y los permisos declarados; su DEX contiene onPermissionRequest, PermissionRequest, CAMERA y RECORD_AUDIO, donde el APK actual tiene cero de los cuatro. Falta probarla en un dispositivo real.
60 lines
1.6 KiB
Kotlin
60 lines
1.6 KiB
Kotlin
plugins {
|
|
id("com.android.application")
|
|
id("org.jetbrains.kotlin.android")
|
|
}
|
|
|
|
android {
|
|
// El .so nativo exporta Java_com_solarnethub_oasis_OasisActivity_startNodeWithArguments,
|
|
// asi que la clase puente tiene que vivir en ese paquete para que el simbolo resuelva.
|
|
// El applicationId si es propio: la app se instala junto a la oficial sin pisarla.
|
|
namespace = "com.solarnethub.oasis"
|
|
compileSdk = 35
|
|
|
|
defaultConfig {
|
|
applicationId = "net.laenre.oasis"
|
|
minSdk = 24
|
|
targetSdk = 35
|
|
versionCode = 1
|
|
versionName = "0.9.5"
|
|
ndk { abiFilters += listOf("arm64-v8a") }
|
|
}
|
|
|
|
signingConfigs {
|
|
create("release") {
|
|
val ks = System.getenv("OASIS_KEYSTORE")
|
|
if (ks != null) {
|
|
storeFile = file(ks)
|
|
storePassword = System.getenv("OASIS_KEYSTORE_PASS")
|
|
keyAlias = System.getenv("OASIS_KEY_ALIAS") ?: "oasis"
|
|
keyPassword = System.getenv("OASIS_KEY_PASS") ?: System.getenv("OASIS_KEYSTORE_PASS")
|
|
}
|
|
}
|
|
}
|
|
|
|
buildTypes {
|
|
release {
|
|
isMinifyEnabled = false
|
|
if (System.getenv("OASIS_KEYSTORE") != null) signingConfig = signingConfigs.getByName("release")
|
|
}
|
|
}
|
|
|
|
buildFeatures { buildConfig = true }
|
|
|
|
packaging {
|
|
jniLibs {
|
|
// libnode.so son 49 MB: sin comprimir se carga por mmap y arranca mas rapido
|
|
useLegacyPackaging = false
|
|
}
|
|
}
|
|
|
|
compileOptions {
|
|
sourceCompatibility = JavaVersion.VERSION_17
|
|
targetCompatibility = JavaVersion.VERSION_17
|
|
}
|
|
kotlinOptions { jvmTarget = "17" }
|
|
}
|
|
|
|
dependencies {
|
|
implementation("androidx.appcompat:appcompat:1.7.0")
|
|
implementation("androidx.core:core-ktx:1.13.1")
|
|
}
|