mirror of
https://github.com/MatsuriDayo/NekoBoxForAndroid.git
synced 2025-12-18 22:20:06 +08:00
feat: internal plugin executableSo
This commit is contained in:
parent
9454d074ce
commit
fb5702ca29
1
app/executableSo/.gitignore
vendored
Normal file
1
app/executableSo/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
*.so
|
||||
@ -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) {
|
||||
|
||||
@ -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.")
|
||||
}
|
||||
}
|
||||
|
||||
@ -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}")
|
||||
}
|
||||
|
||||
@ -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 =
|
||||
|
||||
@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user