package libcore import ( "libcore/device" "os" "path/filepath" "runtime" "strings" _ "unsafe" "log" "github.com/matsuridayo/libneko/neko_common" "github.com/matsuridayo/libneko/neko_log" boxmain "github.com/sagernet/sing-box/cmd/sing-box" "github.com/sagernet/sing-box/nekoutils" ) //go:linkname resourcePaths github.com/sagernet/sing-box/constant.resourcePaths var resourcePaths []string func NekoLogPrintln(s string) { log.Println(s) } func NekoLogClear() { neko_log.LogWriter.Truncate() } func ForceGc() { go runtime.GC() } func InitCore(process, cachePath, internalAssets, externalAssets string, maxLogSizeKb int32, logEnable bool, if1 NB4AInterface, if2 BoxPlatformInterface, ) { defer device.DeferPanicToError("InitCore", func(err error) { log.Println(err) }) isBgProcess := strings.HasSuffix(process, ":bg") neko_common.RunMode = neko_common.RunMode_NekoBoxForAndroid intfNB4A = if1 intfBox = if2 useProcfs = intfBox.UseProcFS() // Working dir tmp := filepath.Join(cachePath, "../no_backup") os.MkdirAll(tmp, 0755) os.Chdir(tmp) // sing-box fs resourcePaths = append(resourcePaths, externalAssets) // Set up log if maxLogSizeKb < 50 { maxLogSizeKb = 50 } neko_log.LogWriterDisable = !logEnable neko_log.TruncateOnStart = isBgProcess neko_log.SetupLog(int(maxLogSizeKb)*1024, filepath.Join(cachePath, "neko.log")) boxmain.SetDisableColor(true) // nekoutils nekoutils.Selector_OnProxySelected = intfNB4A.Selector_OnProxySelected // Set up some component go func() { defer device.DeferPanicToError("InitCore-go", func(err error) { log.Println(err) }) device.GoDebug(process) externalAssetsPath = externalAssets internalAssetsPath = internalAssets // certs pem, err := os.ReadFile(externalAssetsPath + "ca.pem") if err == nil { updateRootCACerts(pem) } // bg if isBgProcess { extractAssets() } }() }