2022-10-25 12:55:00 +08:00
|
|
|
package build_shared
|
2022-12-11 14:38:01 +08:00
|
|
|
|
|
|
|
import (
|
2022-10-25 12:55:00 +08:00
|
|
|
"go/build"
|
2022-12-11 14:38:01 +08:00
|
|
|
"os"
|
|
|
|
"path/filepath"
|
2023-02-02 16:30:50 +08:00
|
|
|
"runtime"
|
2022-12-11 14:38:01 +08:00
|
|
|
"sort"
|
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/sagernet/sing-box/log"
|
|
|
|
"github.com/sagernet/sing/common"
|
2024-02-16 13:28:58 +08:00
|
|
|
E "github.com/sagernet/sing/common/exceptions"
|
2022-12-11 14:38:01 +08:00
|
|
|
"github.com/sagernet/sing/common/rw"
|
2024-02-16 13:28:58 +08:00
|
|
|
"github.com/sagernet/sing/common/shell"
|
2022-12-11 14:38:01 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
androidSDKPath string
|
|
|
|
androidNDKPath string
|
|
|
|
)
|
|
|
|
|
2022-10-25 12:55:00 +08:00
|
|
|
func FindSDK() {
|
2022-12-11 14:38:01 +08:00
|
|
|
searchPath := []string{
|
|
|
|
"$ANDROID_HOME",
|
|
|
|
"$HOME/Android/Sdk",
|
|
|
|
"$HOME/.local/lib/android/sdk",
|
|
|
|
"$HOME/Library/Android/sdk",
|
|
|
|
}
|
|
|
|
for _, path := range searchPath {
|
|
|
|
path = os.ExpandEnv(path)
|
2024-06-24 09:49:15 +08:00
|
|
|
if rw.IsFile(filepath.Join(path, "licenses", "android-sdk-license")) {
|
2022-12-11 14:38:01 +08:00
|
|
|
androidSDKPath = path
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if androidSDKPath == "" {
|
|
|
|
log.Fatal("android SDK not found")
|
|
|
|
}
|
|
|
|
if !findNDK() {
|
|
|
|
log.Fatal("android NDK not found")
|
|
|
|
}
|
|
|
|
|
2024-02-16 13:28:58 +08:00
|
|
|
javaVersion, err := shell.Exec("java", "--version").ReadOutput()
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(E.Cause(err, "check java version"))
|
|
|
|
}
|
|
|
|
if !strings.Contains(javaVersion, "openjdk 17") {
|
|
|
|
log.Fatal("java version should be openjdk 17")
|
|
|
|
}
|
|
|
|
|
2022-12-11 14:38:01 +08:00
|
|
|
os.Setenv("ANDROID_HOME", androidSDKPath)
|
|
|
|
os.Setenv("ANDROID_SDK_HOME", androidSDKPath)
|
|
|
|
os.Setenv("ANDROID_NDK_HOME", androidNDKPath)
|
|
|
|
os.Setenv("NDK", androidNDKPath)
|
2023-02-02 16:30:50 +08:00
|
|
|
os.Setenv("PATH", os.Getenv("PATH")+":"+filepath.Join(androidNDKPath, "toolchains", "llvm", "prebuilt", runtime.GOOS+"-x86_64", "bin"))
|
2022-12-11 14:38:01 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func findNDK() bool {
|
2024-11-07 19:55:37 +08:00
|
|
|
const fixedVersion = "26.3.11579264"
|
2024-02-26 22:49:48 +08:00
|
|
|
const versionFile = "source.properties"
|
2024-06-24 09:49:15 +08:00
|
|
|
if fixedPath := filepath.Join(androidSDKPath, "ndk", fixedVersion); rw.IsFile(filepath.Join(fixedPath, versionFile)) {
|
2024-02-26 22:49:48 +08:00
|
|
|
androidNDKPath = fixedPath
|
2022-12-11 14:38:01 +08:00
|
|
|
return true
|
|
|
|
}
|
2024-02-26 22:49:48 +08:00
|
|
|
ndkVersions, err := os.ReadDir(filepath.Join(androidSDKPath, "ndk"))
|
2022-12-11 14:38:01 +08:00
|
|
|
if err != nil {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
versionNames := common.Map(ndkVersions, os.DirEntry.Name)
|
|
|
|
if len(versionNames) == 0 {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
sort.Slice(versionNames, func(i, j int) bool {
|
|
|
|
iVersions := strings.Split(versionNames[i], ".")
|
|
|
|
jVersions := strings.Split(versionNames[j], ".")
|
|
|
|
for k := 0; k < len(iVersions) && k < len(jVersions); k++ {
|
|
|
|
iVersion, _ := strconv.Atoi(iVersions[k])
|
|
|
|
jVersion, _ := strconv.Atoi(jVersions[k])
|
|
|
|
if iVersion != jVersion {
|
|
|
|
return iVersion > jVersion
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
})
|
|
|
|
for _, versionName := range versionNames {
|
2024-02-26 22:49:48 +08:00
|
|
|
currentNDKPath := filepath.Join(androidSDKPath, "ndk", versionName)
|
2024-10-11 21:46:42 +08:00
|
|
|
if rw.IsFile(filepath.Join(currentNDKPath, versionFile)) {
|
2024-02-26 22:49:48 +08:00
|
|
|
androidNDKPath = currentNDKPath
|
|
|
|
log.Warn("reproducibility warning: using NDK version " + versionName + " instead of " + fixedVersion)
|
2022-12-11 14:38:01 +08:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
2022-10-25 12:55:00 +08:00
|
|
|
|
|
|
|
var GoBinPath string
|
|
|
|
|
|
|
|
func FindMobile() {
|
|
|
|
goBin := filepath.Join(build.Default.GOPATH, "bin")
|
2024-02-01 10:44:29 +08:00
|
|
|
if runtime.GOOS == "windows" {
|
2024-06-24 09:49:15 +08:00
|
|
|
if !rw.IsFile(filepath.Join(goBin, "gobind.exe")) {
|
2024-02-26 22:49:48 +08:00
|
|
|
log.Fatal("missing gomobile installation")
|
2024-02-01 10:44:29 +08:00
|
|
|
}
|
|
|
|
} else {
|
2024-06-24 09:49:15 +08:00
|
|
|
if !rw.IsFile(filepath.Join(goBin, "gobind")) {
|
2024-02-01 10:44:29 +08:00
|
|
|
log.Fatal("missing gomobile installation")
|
|
|
|
}
|
2022-10-25 12:55:00 +08:00
|
|
|
}
|
|
|
|
GoBinPath = goBin
|
|
|
|
}
|