tools.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package aapt
  2. import (
  3. "archive/zip"
  4. "os"
  5. "path/filepath"
  6. "strings"
  7. "notabug.org/Umnik/GoAndroidSDK/common/utils"
  8. )
  9. func findApkSignature(apkFile string) ([]string, error) {
  10. zipReader, err := zip.OpenReader(apkFile)
  11. if err != nil {
  12. return nil, err
  13. }
  14. defer func(f *zip.ReadCloser) {
  15. }(zipReader)
  16. var (
  17. rsaFiles []string
  18. sfFiles []string
  19. otherFiles []string
  20. )
  21. for _, zf := range zipReader.File {
  22. switch {
  23. case zf.FileInfo().IsDir():
  24. continue
  25. case strings.HasPrefix(zf.Name, "META-INF"):
  26. f := strings.ToLower(zf.Name)
  27. switch {
  28. case strings.HasSuffix(f, ".rsa"):
  29. rsaFiles = append(rsaFiles, zf.Name)
  30. case strings.HasSuffix(f, ".sf"):
  31. sfFiles = append(sfFiles, zf.Name)
  32. case strings.HasSuffix(f, ".mf"):
  33. otherFiles = append(otherFiles, zf.Name)
  34. }
  35. }
  36. }
  37. return append(rsaFiles, append(sfFiles, otherFiles...)...), nil
  38. }
  39. func processPackageLine(line string) (result [3]string) {
  40. parts := strings.Split(utils.TwoSpotValue(line), " ")
  41. for _, part := range parts {
  42. part = strings.ReplaceAll(part, "=", ":")
  43. switch {
  44. case strings.HasPrefix(part, "name"):
  45. result[0] = utils.RemoveQuoteMark(utils.TwoSpotValue(part))
  46. case strings.HasPrefix(part, "versionCode"):
  47. result[1] = utils.RemoveQuoteMark(utils.TwoSpotValue(part))
  48. case strings.HasPrefix(part, "versionName"):
  49. result[2] = utils.RemoveQuoteMark(utils.TwoSpotValue(part))
  50. }
  51. }
  52. return
  53. }
  54. func extractPermission(line string) string {
  55. return utils.RemoveQuoteMark(strings.SplitN(line, "=", 2)[1])
  56. }
  57. func extractLabel(line string) (key, value string) {
  58. val := "application-label"
  59. parts := strings.SplitN(line, ":", 2)
  60. value = utils.RemoveQuoteMark(parts[1])
  61. if parts[0] == val {
  62. key = "NoLocale"
  63. return
  64. }
  65. key = parts[0][len(val)+1:]
  66. return
  67. }
  68. func extractLaunchActivity(line string) string {
  69. for _, part := range strings.Split(line, " ") {
  70. if strings.HasPrefix(part, "name='") {
  71. return strings.Split(part, "'")[1]
  72. }
  73. }
  74. return ""
  75. }
  76. func extractNativeCode(line string) map[string]struct{} {
  77. result := make(map[string]struct{})
  78. parts := strings.Split(utils.TwoSpotValue(line), " ")
  79. for _, val := range parts {
  80. result[utils.RemoveQuoteMark(val)] = struct{}{}
  81. }
  82. return result
  83. }
  84. func resArrName(line string) string {
  85. rawName := strings.SplitN(line, ":", 3)[1]
  86. return strings.SplitN(rawName, "/", 2)[1]
  87. }
  88. func resStringName(line string) string {
  89. return resArrName(line)
  90. }
  91. func resArrValues(source []string) [][2]string {
  92. result := make([][2]string, len(source))
  93. for i, val := range source {
  94. line := strings.TrimSpace(val)
  95. if !strings.HasPrefix(line, "#") {
  96. panic("output format was changed")
  97. }
  98. parts := strings.SplitN(line, " ", 4)
  99. values := [2]string{utils.RemoveBraces(parts[2]), utils.RemoveQuoteMark(parts[3])}
  100. result[i] = values
  101. }
  102. return result
  103. }
  104. func resStringValue(line string) (result [2]string) {
  105. line = strings.TrimSpace(line)
  106. if !strings.HasPrefix(line, "(") {
  107. panic("out format was changed")
  108. }
  109. parts := strings.SplitN(line, " ", 2)
  110. result[0] = utils.RemoveBraces(parts[0])
  111. result[1] = utils.RemoveQuoteMark(parts[1])
  112. return
  113. }
  114. func aaptFromPath(dirPath string) Aapt {
  115. binPath := filepath.Join(dirPath, "aapt")
  116. _, err := os.Stat(binPath)
  117. if err != nil {
  118. panic(err)
  119. }
  120. return Aapt{binPath: binPath}
  121. }