mirror of
https://github.com/MatsuriDayo/NekoBoxForAndroid.git
synced 2025-12-19 06:30:05 +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))
|
stopRunner(false, getString(R.string.invalid_server))
|
||||||
} catch (e: PluginManager.PluginNotFoundException) {
|
} catch (e: PluginManager.PluginNotFoundException) {
|
||||||
Toast.makeText(this@Interface, e.readableMessage, Toast.LENGTH_SHORT).show()
|
Toast.makeText(this@Interface, e.readableMessage, Toast.LENGTH_SHORT).show()
|
||||||
Logs.d(e.readableMessage)
|
Logs.w(e)
|
||||||
data.binder.missingPlugin(e.plugin)
|
data.binder.missingPlugin(e.plugin)
|
||||||
stopRunner(false, null)
|
stopRunner(false, null)
|
||||||
} catch (exc: Throwable) {
|
} catch (exc: Throwable) {
|
||||||
|
|||||||
@ -456,7 +456,7 @@ fun buildConfig(
|
|||||||
}
|
}
|
||||||
if (Plugins.isUsingMatsuriExe(pluginId)) {
|
if (Plugins.isUsingMatsuriExe(pluginId)) {
|
||||||
needExternal = false
|
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.")
|
throw Exception("You are using an unsupported $pluginId, please download the correct plugin.")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,7 +32,8 @@ object PluginManager {
|
|||||||
val result = initNative(pluginId)
|
val result = initNative(pluginId)
|
||||||
if (result != null) return result
|
if (result != null) return result
|
||||||
} catch (t: Throwable) {
|
} catch (t: Throwable) {
|
||||||
if (throwable == null) throwable = t else Logs.w(t)
|
throwable = t
|
||||||
|
Logs.w(t)
|
||||||
}
|
}
|
||||||
|
|
||||||
throw throwable ?: PluginNotFoundException(pluginId)
|
throw throwable ?: PluginNotFoundException(pluginId)
|
||||||
@ -41,16 +42,41 @@ object PluginManager {
|
|||||||
private fun initNative(pluginId: String): InitResult? {
|
private fun initNative(pluginId: String): InitResult? {
|
||||||
val info = Plugins.getPlugin(pluginId) ?: return null
|
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 {
|
try {
|
||||||
initNativeFaster(info)?.also { return InitResult(it, info) }
|
initNativeFaster(info)!!.let { return InitResult(it, info) }
|
||||||
} catch (t: Throwable) {
|
} catch (t: Throwable) {
|
||||||
Logs.w("Initializing native plugin faster mode failed", t)
|
Logs.w("initNativeFaster failed", t)
|
||||||
}
|
}
|
||||||
|
|
||||||
Logs.w("Init native returns empty result")
|
Logs.w("Init native returns empty result")
|
||||||
return null
|
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? {
|
private fun initNativeFaster(provider: ProviderInfo): String? {
|
||||||
return provider.loadString(Plugins.METADATA_KEY_EXECUTABLE_PATH)
|
return provider.loadString(Plugins.METADATA_KEY_EXECUTABLE_PATH)
|
||||||
?.let { relativePath ->
|
?.let { relativePath ->
|
||||||
@ -64,6 +90,7 @@ object PluginManager {
|
|||||||
is String -> value
|
is String -> value
|
||||||
is Int -> SagerNet.application.packageManager.getResourcesForApplication(applicationInfo)
|
is Int -> SagerNet.application.packageManager.getResourcesForApplication(applicationInfo)
|
||||||
.getString(value)
|
.getString(value)
|
||||||
|
|
||||||
null -> null
|
null -> null
|
||||||
else -> error("meta-data $key has invalid type ${value.javaClass}")
|
else -> error("meta-data $key has invalid type ${value.javaClass}")
|
||||||
}
|
}
|
||||||
|
|||||||
@ -54,13 +54,19 @@ object Plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun getPlugin(pluginId: String): ProviderInfo? {
|
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
|
if (pluginId.isBlank()) return null
|
||||||
|
|
||||||
// try queryIntentContentProviders
|
// try queryIntentContentProviders
|
||||||
var providers = getPluginOld(pluginId)
|
var providers = getExtPluginOld(pluginId)
|
||||||
|
|
||||||
// try PackageCache
|
// try PackageCache
|
||||||
if (providers.isEmpty()) providers = getPluginNew(pluginId)
|
if (providers.isEmpty()) providers = getExtPluginNew(pluginId)
|
||||||
|
|
||||||
// not found
|
// not found
|
||||||
if (providers.isEmpty()) return null
|
if (providers.isEmpty()) return null
|
||||||
@ -81,7 +87,7 @@ object Plugins {
|
|||||||
return providers[0]
|
return providers[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getPluginNew(pluginId: String): List<ProviderInfo> {
|
private fun getExtPluginNew(pluginId: String): List<ProviderInfo> {
|
||||||
PackageCache.awaitLoadSync()
|
PackageCache.awaitLoadSync()
|
||||||
val pkgs = PackageCache.installedPluginPackages
|
val pkgs = PackageCache.installedPluginPackages
|
||||||
.map { it.value }
|
.map { it.value }
|
||||||
@ -95,7 +101,7 @@ object Plugins {
|
|||||||
.path("/$id")
|
.path("/$id")
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
private fun getPluginOld(pluginId: String): List<ProviderInfo> {
|
private fun getExtPluginOld(pluginId: String): List<ProviderInfo> {
|
||||||
var flags = PackageManager.GET_META_DATA
|
var flags = PackageManager.GET_META_DATA
|
||||||
if (Build.VERSION.SDK_INT >= 24) {
|
if (Build.VERSION.SDK_INT >= 24) {
|
||||||
flags =
|
flags =
|
||||||
|
|||||||
@ -31,10 +31,12 @@ fun Project.requireFlavor(): String {
|
|||||||
flavor = taskName.substringAfter("assemble")
|
flavor = taskName.substringAfter("assemble")
|
||||||
return flavor
|
return flavor
|
||||||
}
|
}
|
||||||
|
|
||||||
taskName.contains("install") -> {
|
taskName.contains("install") -> {
|
||||||
flavor = taskName.substringAfter("install")
|
flavor = taskName.substringAfter("install")
|
||||||
return flavor
|
return flavor
|
||||||
}
|
}
|
||||||
|
|
||||||
taskName.contains("bundle") -> {
|
taskName.contains("bundle") -> {
|
||||||
flavor = taskName.substringAfter("bundle")
|
flavor = taskName.substringAfter("bundle")
|
||||||
return flavor
|
return flavor
|
||||||
@ -252,5 +254,8 @@ fun Project.setupApp() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sourceSets.getByName("main").apply {
|
||||||
|
jniLibs.srcDir("executableSo")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue
Block a user