main.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  1. package main
  2. import (
  3. "bytes"
  4. "fmt"
  5. "github.com/BurntSushi/toml"
  6. "log"
  7. "os"
  8. "os/exec"
  9. "reflect"
  10. "strings"
  11. "sync"
  12. )
  13. var wg sync.WaitGroup
  14. var config Config
  15. var ConfigPath string = "./conf.toml"
  16. func reflectFn(x interface{}){
  17. v := reflect.TypeOf(x)
  18. fmt.Println(v)
  19. }
  20. func ConnectAdbShell(PackageName string){
  21. str, _ := os.Getwd()
  22. str = strings.Replace(str, "\\", "/", -1)
  23. in := bytes.NewBuffer(nil)
  24. path := str + "/tools/adb.exe"
  25. backUpPath := str + "/backup"
  26. cmd := exec.Command(path,"shell")
  27. cmd.Stdin = in
  28. cmd.Stderr = os.Stderr
  29. cmd.Stdout= os.Stdout
  30. go func() {
  31. in.WriteString("cd /data/data\n")
  32. in.WriteString("ls\n")
  33. pull := path + " pull " + "/data/data/" + PackageName + " " + backUpPath + "/" + PackageName
  34. fmt.Println(pull)
  35. in.WriteString("cd /\n")
  36. in.WriteString("exit\n")
  37. in.WriteString(pull + "\n")
  38. }()
  39. if err := cmd.Run(); err != nil {
  40. fmt.Println(err)
  41. return
  42. }
  43. }
  44. func CmdPull(PackageName string, DirPath string){
  45. str, _ := os.Getwd()
  46. str = strings.Replace(str, "\\", "/", -1)
  47. path := str + "/tools/adb.exe"
  48. backUpPath := str + "/backup"
  49. cmd := exec.Command(path, "pull", "/" + DirPath +"/" + PackageName, backUpPath + "/" + PackageName)
  50. fmt.Println(cmd)
  51. // 执行命令,并返回结果
  52. cmd.Stderr = os.Stderr
  53. output,err := cmd.Output()
  54. if err != nil{
  55. fmt.Println(err)
  56. }
  57. // 因为结果是字节数组,需要转换成string
  58. fmt.Print(string(output))
  59. }
  60. func CmdPush(PackageName string, DirPath string) {
  61. str, _ := os.Getwd()
  62. str = strings.Replace(str, "\\", "/", -1)
  63. path := str + "/tools/adb.exe"
  64. backUpPath := str + "/backup"
  65. cmd := exec.Command(path, "push", backUpPath+"/"+DirPath+"/"+PackageName, "/"+DirPath+"/"+PackageName)
  66. fmt.Println(cmd)
  67. // 执行命令,并返回结果
  68. cmd.Stderr = os.Stderr
  69. output, err := cmd.Output()
  70. if err != nil {
  71. fmt.Println(err)
  72. }
  73. // 因为结果是字节数组,需要转换成string
  74. fmt.Print(string(output))
  75. wg.Done()
  76. }
  77. func tar(PackageName string, DirPath string) bool {
  78. str, _ := os.Getwd()
  79. str = strings.Replace(str, "\\", "/", -1)
  80. path := str + "/tools/adb.exe"
  81. cmd := exec.Command(path, "shell", "tar", "-vcf", "/" + DirPath +"/" + PackageName + DirPath[0:1] + ".tar", "/" + DirPath +"/" + PackageName)
  82. fmt.Println(cmd)
  83. // 执行命令,并返回结果
  84. cmd.Stderr = os.Stderr
  85. output,err := cmd.Output()
  86. if err != nil{
  87. fmt.Println(err)
  88. return false
  89. }
  90. // 因为结果是字节数组,需要转换成string
  91. fmt.Print(string(output))
  92. return true
  93. }
  94. func DeleteDir(DirPath string){
  95. str, _ := os.Getwd()
  96. str = strings.Replace(str, "\\", "/", -1)
  97. path := str + "/tools/adb.exe"
  98. cmd := exec.Command(path, "shell", "rm", "-r", DirPath)
  99. fmt.Println(cmd)
  100. // 执行命令,并返回结果
  101. cmd.Stderr = os.Stderr
  102. output,err := cmd.Output()
  103. if err != nil{
  104. fmt.Println(err)
  105. }
  106. // 因为结果是字节数组,需要转换成string
  107. fmt.Print(string(output))
  108. }
  109. func DeleteFile(FilePath string){
  110. str, _ := os.Getwd()
  111. str = strings.Replace(str, "\\", "/", -1)
  112. path := str + "/tools/adb.exe"
  113. cmd := exec.Command(path, "shell", "rm", FilePath)
  114. fmt.Println(cmd)
  115. // 执行命令,并返回结果
  116. cmd.Stderr = os.Stderr
  117. output,err := cmd.Output()
  118. if err != nil{
  119. fmt.Println(err)
  120. }
  121. // 因为结果是字节数组,需要转换成string
  122. fmt.Print(string(output))
  123. }
  124. func Release(PackageName string) {
  125. str, _ := os.Getwd()
  126. str = strings.Replace(str, "\\", "/", -1)
  127. path := str + "/tools/7-Zip/7z.exe"
  128. backUpPath := str + "/backup/"
  129. cmd := exec.Command(path, "x", backUpPath + PackageName, "-o" + backUpPath)
  130. fmt.Println(cmd)
  131. // 执行命令,并返回结果
  132. cmd.Stderr = os.Stderr
  133. output,err := cmd.Output()
  134. if err != nil{
  135. fmt.Println(err)
  136. }
  137. // 因为结果是字节数组,需要转换成string
  138. fmt.Print(string(output))
  139. }
  140. func PullGameFile(PackageName string, Device bool){
  141. //压缩游戏包
  142. if tar(PackageName, "data/data"){
  143. if !Device{
  144. //删除游戏包 /data/data
  145. DeleteDir("/data/data/" + PackageName)
  146. }
  147. }
  148. if tar(PackageName, "sdcard/Android/data"){
  149. if !Device{
  150. //删除游戏包 /sdcard/Android/data
  151. DeleteDir("/sdcard/Android/data/" + PackageName)
  152. }
  153. }
  154. //拉取游戏压缩包
  155. CmdPull(PackageName + "d.tar", "data/data")
  156. CmdPull(PackageName + "s.tar", "sdcard/Android/data")
  157. //删除压缩包
  158. DeleteFile( "/data/data/" + PackageName + "d.tar")
  159. DeleteFile("/sdcard/Android/data/" + PackageName + "s.tar")
  160. //解压
  161. Release(PackageName + "d.tar")
  162. Release(PackageName + "s.tar")
  163. }
  164. func DeleteGameFile(PackageName string){
  165. // 获取安装包路径
  166. str, _ := os.Getwd()
  167. str = strings.Replace(str, "\\", "/", -1)
  168. DataPath := str + "/backup/data/data/" + PackageName
  169. Sdcard := str + "/backup/sdcard/Android/data/" + PackageName
  170. fmt.Println("DeleteGameFile:", DataPath)
  171. err := os.RemoveAll(DataPath)
  172. if err != nil{
  173. fmt.Println("DeleteGameFile:", err)
  174. }
  175. fmt.Println("DeleteGameFile:", Sdcard)
  176. os.RemoveAll(Sdcard)
  177. err = os.RemoveAll(DataPath)
  178. if err != nil{
  179. fmt.Println("DeleteGameFile:", err)
  180. }
  181. }
  182. func PackageIsExist(PackageName string, Device bool) bool {
  183. // 获取安装包路径
  184. str, _ := os.Getwd()
  185. str = strings.Replace(str, "\\", "/", -1)
  186. packagePath := str + "/backup/package/"
  187. if Device{
  188. packagePath = packagePath + PackageName + "_pc.apk"
  189. return PathExists(packagePath)
  190. }else {
  191. packagePath = packagePath + PackageName + "_arm.apk"
  192. return PathExists(packagePath)
  193. }
  194. }
  195. func PullGamePackage(PackageName string, Device bool) {
  196. // 获取安装包路径
  197. str, _ := os.Getwd()
  198. str = strings.Replace(str, "\\", "/", -1)
  199. path := str + "/tools/adb.exe"
  200. packagePath := str + "/backup/package/"
  201. in := bytes.NewBuffer(nil)
  202. cmd := exec.Command(path,"shell")
  203. cmd.Stdin = in
  204. cmd.Stderr = os.Stderr
  205. out := bytes.NewBuffer(nil)
  206. cmd.Stdout = out
  207. in.WriteString("pm path " + PackageName + "\n")
  208. if err := cmd.Run(); err != nil {
  209. fmt.Println(err)
  210. return
  211. }
  212. packagePathAdb := strings.Split(out.String(),":")[1]
  213. packagePathAdb = strings.Replace(packagePathAdb, "\n", "", -1)
  214. packagePathAdb = strings.Replace(packagePathAdb, "\r", "", -1)
  215. if Device{
  216. packagePath = packagePath + PackageName + "_pc.apk"
  217. }else {
  218. packagePath = packagePath + PackageName + "_arm.apk"
  219. }
  220. Chmod(packagePathAdb, Device)
  221. //拉取安装包
  222. cmd = exec.Command(path, "pull", string(packagePathAdb), packagePath)
  223. // 执行命令,并返回结果
  224. cmd.Stderr = os.Stderr
  225. output, err := cmd.Output()
  226. if err != nil {
  227. fmt.Println(err)
  228. }
  229. // 因为结果是字节数组,需要转换成string
  230. fmt.Print(string(output))
  231. wg.Done()
  232. }
  233. func Chmod(dir string, DeviceIsPc bool) {
  234. str, _ := os.Getwd()
  235. str = strings.Replace(str, "\\", "/", -1)
  236. path := str + "/tools/adb.exe"
  237. //安装安装包
  238. if DeviceIsPc{
  239. cmd := exec.Command(path, "shell", "chmod","-R","777", dir)
  240. fmt.Println(cmd)
  241. // 执行命令,并返回结果
  242. cmd.Stderr = os.Stderr
  243. output, err := cmd.Output()
  244. if err != nil {
  245. fmt.Println(err)
  246. return
  247. }
  248. // 因为结果是字节数组,需要转换成string
  249. fmt.Print(string(output))
  250. fmt.Println("chmod is Ok")
  251. }else {
  252. cmd := exec.Command(path, "shell", "su","-c", "chmod","-R","777", dir)
  253. fmt.Println(cmd)
  254. // 执行命令,并返回结果
  255. cmd.Stderr = os.Stderr
  256. output, err := cmd.Output()
  257. if err != nil {
  258. fmt.Println(err)
  259. return
  260. }
  261. // 因为结果是字节数组,需要转换成string
  262. fmt.Print(string(output))
  263. fmt.Println("chmod is Ok")
  264. }
  265. }
  266. func PushGamePackage(PackageName string, Device bool) {
  267. str, _ := os.Getwd()
  268. str = strings.Replace(str, "\\", "/", -1)
  269. path := str + "/tools/adb.exe"
  270. var packagePath string
  271. if Device{
  272. packagePath = str + "/backup/package/" + PackageName + "_pc.apk"
  273. }else {
  274. packagePath = str + "/backup/package/" + PackageName + "_arm.apk"
  275. }
  276. //安装安装包
  277. cmd := exec.Command(path, "install", "-r", packagePath)
  278. fmt.Println(cmd)
  279. // 执行命令,并返回结果
  280. cmd.Stderr = os.Stderr
  281. output, err := cmd.Output()
  282. if err != nil {
  283. fmt.Println(err)
  284. }
  285. // 因为结果是字节数组,需要转换成string
  286. fmt.Print(string(output))
  287. }
  288. func UninstallGamePackage(PackageName string){
  289. str, _ := os.Getwd()
  290. str = strings.Replace(str, "\\", "/", -1)
  291. path := str + "/tools/adb.exe"
  292. //卸载安装包
  293. cmd := exec.Command(path, "uninstall", PackageName)
  294. fmt.Println(cmd)
  295. // 执行命令,并返回结果
  296. cmd.Stderr = os.Stderr
  297. output, err := cmd.Output()
  298. if err != nil {
  299. fmt.Println(err)
  300. }
  301. // 因为结果是字节数组,需要转换成string
  302. fmt.Print(string(output))
  303. }
  304. func PushGameFile(PackageName string) {
  305. wg.Add(1)
  306. go CmdPush(PackageName, "data/data")
  307. wg.Add(1)
  308. go CmdPush(PackageName, "sdcard/Android/data")
  309. wg.Done()
  310. }
  311. func CreateFile(folderPath string){
  312. str, _ := os.Getwd()
  313. str = strings.Replace(str, "\\", "/", -1)
  314. path := str + "/" + folderPath
  315. if _, err := os.Stat(path); os.IsNotExist(err) {
  316. // 必须分成两步
  317. // 先创建文件夹
  318. os.Mkdir(path, 0777)
  319. // 再修改权限
  320. os.Chmod(path, 0777)
  321. }
  322. }
  323. func Init(PackageName string,tasksChan chan string, Device bool)bool{
  324. /**
  325. 创建必要文件夹:
  326. backup:存放备份的文件
  327. backup/data/data:存放/data/data下的游戏文件
  328. backup/sdcard/Android/data:存放/sdcard/Android/data下的游戏文件
  329. backup/package:游戏安装包
  330. */
  331. CreateFile("backup")
  332. CreateFile("backup/data")
  333. CreateFile("backup/data/data")
  334. CreateFile("backup/sdcard")
  335. CreateFile("backup/sdcard/Android")
  336. CreateFile("backup/sdcard/Android/data")
  337. CreateFile("backup/package")
  338. fmt.Println("init Ok!")
  339. //执行操作
  340. for{
  341. select {
  342. case operation := <- tasksChan:
  343. if operation == "backup" {
  344. fmt.Println("backup:")
  345. if config.BackupPackage{
  346. //拉取备份apk
  347. if !PackageIsExist(PackageName, Device){
  348. wg.Add(1)
  349. go PullGamePackage(PackageName, Device)
  350. }
  351. if config.Debug{
  352. fmt.Println("输入任意键继续,input Enter continue")
  353. fmt.Scanln()
  354. }
  355. }
  356. //拉取手机游戏包名文件
  357. //赋予权限
  358. Chmod("/data/data/" + PackageName, Device)
  359. if config.Debug{
  360. fmt.Println("输入任意键继续,input Enter continue")
  361. fmt.Scanln()
  362. }
  363. Chmod("/sdcard/Android/data/" + PackageName, Device)
  364. if config.Debug{
  365. fmt.Println("输入任意键继续,input Enter continue")
  366. fmt.Scanln()
  367. }
  368. //删除以前的游戏包文件
  369. DeleteGameFile(PackageName)
  370. if config.Debug{
  371. fmt.Println("输入任意键继续,input Enter continue")
  372. fmt.Scanln()
  373. }
  374. PullGameFile(PackageName, Device)
  375. if config.Debug{
  376. fmt.Println("输入任意键继续,input Enter continue")
  377. fmt.Scanln()
  378. }
  379. wg.Wait()
  380. }
  381. if operation == "recovery" {
  382. //上传已备份的游戏包
  383. //判断游戏包是否存在
  384. fmt.Println("recovery:")
  385. if FileExists(PackageName){
  386. //上传
  387. PushGamePackage(PackageName, Device)
  388. if config.Debug{
  389. fmt.Println("输入任意键继续,input Enter continue")
  390. fmt.Scanln()
  391. }
  392. fmt.Println("chmod get:")
  393. //赋予权限
  394. Chmod("/data/data/" + PackageName, Device)
  395. if config.Debug{
  396. fmt.Println("输入任意键继续,input Enter continue")
  397. fmt.Scanln()
  398. }
  399. Chmod("/sdcard/Android/data/" + PackageName, Device)
  400. if config.Debug{
  401. fmt.Println("输入任意键继续,input Enter continue")
  402. fmt.Scanln()
  403. }
  404. wg.Add(1)
  405. go PushGameFile(PackageName)
  406. wg.Wait()
  407. if config.Debug{
  408. fmt.Println("输入任意键继续,input Enter continue")
  409. fmt.Scanln()
  410. }
  411. //赋予权限
  412. Chmod("/data/data/" + PackageName, Device)
  413. if config.Debug{
  414. fmt.Println("输入任意键继续,input Enter continue")
  415. fmt.Scanln()
  416. }
  417. Chmod("/sdcard/Android/data/" + PackageName, Device)
  418. if config.Debug{
  419. fmt.Println("输入任意键继续,input Enter continue")
  420. fmt.Scanln()
  421. }
  422. }else {
  423. fmt.Println("fail")
  424. return false
  425. }
  426. }
  427. if operation == "uninstall"{
  428. //卸载安装包
  429. UninstallGamePackage(PackageName)
  430. //如果有本地游戏文件卸载
  431. }
  432. if operation == "all" {
  433. tasksChan <- "backup"
  434. tasksChan <- "uninstall"
  435. tasksChan <- "recovery"
  436. }
  437. default:
  438. wg.Wait()
  439. return true
  440. }
  441. }
  442. }
  443. func FileExists(PackageName string)bool{
  444. str, _ := os.Getwd()
  445. str = strings.Replace(str, "\\", "/", -1)
  446. backUpPath := str + "/backup"
  447. dataPath := backUpPath + "/data/data/" + PackageName
  448. sdcardPath := backUpPath + "/sdcard/Android/data/" + PackageName
  449. data := PathExists(dataPath)
  450. sdcard := PathExists(sdcardPath)
  451. if !data{
  452. fmt.Println(dataPath + " Not Exists")
  453. return false
  454. }
  455. if !sdcard{
  456. fmt.Println(sdcardPath + " Not Exists")
  457. return false
  458. }
  459. return true
  460. }
  461. func PathExists(path string) bool {
  462. _, err := os.Stat(path)
  463. if err == nil {
  464. return true
  465. }
  466. if os.IsNotExist(err) {
  467. return false
  468. }
  469. return false
  470. }
  471. type Config struct {
  472. PackageName string
  473. Operation string
  474. Debug bool
  475. Device bool
  476. BackupPackage bool
  477. }
  478. func main() {
  479. if _, err := toml.DecodeFile(ConfigPath, &config); err != nil {
  480. log.Fatal(err)
  481. }
  482. fmt.Printf("PackageName:%v\tOperation:%v\n", config.PackageName, config.Operation)
  483. //设置包名
  484. var PackageName = config.PackageName
  485. tasksChan := make(chan string, 5)
  486. tasksChan <- config.Operation
  487. //初始化程序, 程序入口
  488. if Init(PackageName, tasksChan, config.Device){
  489. fmt.Println("Complete!")
  490. }else {
  491. fmt.Println("Error")
  492. }
  493. if config.Debug{
  494. fmt.Println("输入回车退出程序,input Enter quit program")
  495. }
  496. }