feat: internal plugin executableSo

This commit is contained in:
arm64v8a 2023-07-08 14:01:49 +09:00
parent 9454d074ce
commit fb5702ca29
6 changed files with 48 additions and 9 deletions

1
app/executableSo/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*.so

View File

@ -352,7 +352,7 @@ class BaseService {
stopRunner(false, getString(R.string.invalid_server))
} catch (e: PluginManager.PluginNotFoundException) {
Toast.makeText(this@Interface, e.readableMessage, Toast.LENGTH_SHORT).show()
Logs.d(e.readableMessage)
Logs.w(e)
data.binder.missingPlugin(e.plugin)
stopRunner(false, null)
} catch (exc: Throwable) {

View File

@ -456,7 +456,7 @@ fun buildConfig(
}
if (Plugins.isUsingMatsuriExe(pluginId)) {
needExternal = false
} else if (Plugins.getPlugin(pluginId) != null) {
} else if (Plugins.getPluginExternal(pluginId) != null) {
throw Exception("You are using an unsupported $pluginId, please download the correct plugin.")
}
}

View File

@ -32,7 +32,8 @@ object PluginManager {
val result = initNative(pluginId)
if (result != null) return result
} catch (t: Throwable) {
if (throwable == null) throwable = t else Logs.w(t)
throwable = t
Logs.w(t)
}
throw throwable ?: PluginNotFoundException(pluginId)
@ -41,16 +42,41 @@ object PluginManager {
private fun initNative(pluginId: String): InitResult? {
val info = Plugins.getPlugin(pluginId) ?: return null
// internal so
if (info.applicationInfo == null) {
try {
initNativeInternal(pluginId)!!.let { return InitResult(it, info) }
} catch (t: Throwable) {
Logs.w("initNativeInternal failed", t)
}
return null
}
try {
initNativeFaster(info)?.also { return InitResult(it, info) }
initNativeFaster(info)!!.let { return InitResult(it, info) }
} catch (t: Throwable) {
Logs.w("Initializing native plugin faster mode failed", t)
Logs.w("initNativeFaster failed", t)
}
Logs.w("Init native returns empty result")
return null
}
private fun initNativeInternal(pluginId: String): String? {
fun soIfExist(soName: String): String? {
val f = File(SagerNet.application.applicationInfo.nativeLibraryDir, soName)
if (f.canExecute()) {
return f.absolutePath
}
return null
}
return when (pluginId) {
"tuic-v5-plugin" -> soIfExist("libtuic.so")
"hysteria-plugin" -> soIfExist("libhysteria.so")
else -> null
}
}
private fun initNativeFaster(provider: ProviderInfo): String? {
return provider.loadString(Plugins.METADATA_KEY_EXECUTABLE_PATH)
?.let { relativePath ->
@ -64,6 +90,7 @@ object PluginManager {
is String -> value
is Int -> SagerNet.application.packageManager.getResourcesForApplication(applicationInfo)
.getString(value)
null -> null
else -> error("meta-data $key has invalid type ${value.javaClass}")
}

View File

@ -54,13 +54,19 @@ object Plugins {
}
fun getPlugin(pluginId: String): ProviderInfo? {
getPluginExternal(pluginId)?.let { return it }
// internal so
return ProviderInfo().apply { authority = AUTHORITIES_PREFIX_NEKO_EXE }
}
fun getPluginExternal(pluginId: String): ProviderInfo? {
if (pluginId.isBlank()) return null
// try queryIntentContentProviders
var providers = getPluginOld(pluginId)
var providers = getExtPluginOld(pluginId)
// try PackageCache
if (providers.isEmpty()) providers = getPluginNew(pluginId)
if (providers.isEmpty()) providers = getExtPluginNew(pluginId)
// not found
if (providers.isEmpty()) return null
@ -81,7 +87,7 @@ object Plugins {
return providers[0]
}
fun getPluginNew(pluginId: String): List<ProviderInfo> {
private fun getExtPluginNew(pluginId: String): List<ProviderInfo> {
PackageCache.awaitLoadSync()
val pkgs = PackageCache.installedPluginPackages
.map { it.value }
@ -95,7 +101,7 @@ object Plugins {
.path("/$id")
.build()
private fun getPluginOld(pluginId: String): List<ProviderInfo> {
private fun getExtPluginOld(pluginId: String): List<ProviderInfo> {
var flags = PackageManager.GET_META_DATA
if (Build.VERSION.SDK_INT >= 24) {
flags =

View File

@ -31,10 +31,12 @@ fun Project.requireFlavor(): String {
flavor = taskName.substringAfter("assemble")
return flavor
}
taskName.contains("install") -> {
flavor = taskName.substringAfter("install")
return flavor
}
taskName.contains("bundle") -> {
flavor = taskName.substringAfter("bundle")
return flavor
@ -252,5 +254,8 @@ fun Project.setupApp() {
}
}
sourceSets.getByName("main").apply {
jniLibs.srcDir("executableSo")
}
}
}