sdk.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package main
  2. import (
  3. "os"
  4. "path/filepath"
  5. "runtime"
  6. "sort"
  7. "strconv"
  8. "strings"
  9. "github.com/sagernet/sing-box/log"
  10. "github.com/sagernet/sing/common"
  11. "github.com/sagernet/sing/common/rw"
  12. )
  13. var (
  14. androidSDKPath string
  15. androidNDKPath string
  16. )
  17. func findSDK() {
  18. searchPath := []string{
  19. "$ANDROID_HOME",
  20. "$HOME/Android/Sdk",
  21. "$HOME/.local/lib/android/sdk",
  22. "$HOME/Library/Android/sdk",
  23. }
  24. for _, path := range searchPath {
  25. path = os.ExpandEnv(path)
  26. if rw.FileExists(path + "/licenses/android-sdk-license") {
  27. androidSDKPath = path
  28. break
  29. }
  30. }
  31. if androidSDKPath == "" {
  32. log.Fatal("android SDK not found")
  33. }
  34. if !findNDK() {
  35. log.Fatal("android NDK not found")
  36. }
  37. os.Setenv("ANDROID_HOME", androidSDKPath)
  38. os.Setenv("ANDROID_SDK_HOME", androidSDKPath)
  39. os.Setenv("ANDROID_NDK_HOME", androidNDKPath)
  40. os.Setenv("NDK", androidNDKPath)
  41. os.Setenv("PATH", os.Getenv("PATH")+":"+filepath.Join(androidNDKPath, "toolchains", "llvm", "prebuilt", runtime.GOOS+"-x86_64", "bin"))
  42. }
  43. func findNDK() bool {
  44. if rw.FileExists(androidSDKPath + "/ndk/25.1.8937393") {
  45. androidNDKPath = androidSDKPath + "/ndk/25.1.8937393"
  46. return true
  47. }
  48. ndkVersions, err := os.ReadDir(androidSDKPath + "/ndk")
  49. if err != nil {
  50. return false
  51. }
  52. versionNames := common.Map(ndkVersions, os.DirEntry.Name)
  53. if len(versionNames) == 0 {
  54. return false
  55. }
  56. sort.Slice(versionNames, func(i, j int) bool {
  57. iVersions := strings.Split(versionNames[i], ".")
  58. jVersions := strings.Split(versionNames[j], ".")
  59. for k := 0; k < len(iVersions) && k < len(jVersions); k++ {
  60. iVersion, _ := strconv.Atoi(iVersions[k])
  61. jVersion, _ := strconv.Atoi(jVersions[k])
  62. if iVersion != jVersion {
  63. return iVersion > jVersion
  64. }
  65. }
  66. return true
  67. })
  68. for _, versionName := range versionNames {
  69. if rw.FileExists(androidSDKPath + "/ndk/" + versionName) {
  70. androidNDKPath = androidSDKPath + "/ndk/" + versionName
  71. return true
  72. }
  73. }
  74. return false
  75. }