ZGApkToolUtils.m 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. //
  2. // ZGApkToolUtils.m
  3. // UUTUtils
  4. //
  5. // Created by zhuge on 2017/12/27.
  6. // Copyright © 2017年 zhuge. All rights reserved.
  7. //
  8. #import "ZGApkToolUtils.h"
  9. #import "WordUtils.h"
  10. #import "ZGShellUtils.h"
  11. #import "ZGApkToolPath.h"
  12. @implementation ZGApkToolUtils
  13. #pragma mark keystore
  14. + (NSString *)genRandomKeystoreFile:(NSString *)toPath {
  15. NSMutableString *msKeyword = [NSMutableString stringWithCapacity:0];
  16. for (int i = 0; i < 3; i++) {
  17. [msKeyword appendString:[WordUtils randomKeyword]];
  18. }
  19. [ZGApkToolUtils genKeystoreFile:msKeyword toPath:toPath];
  20. return msKeyword;
  21. }
  22. + (void)genKeystoreFile:(NSString *)keyName toPath:(NSString *)toPath {
  23. [ZGShellUtils execSync:[ZGApkToolPath shared].key args:@[[ZGApkToolPath shared].key_in, keyName, toPath]];
  24. }
  25. #pragma mark unpack
  26. + (void)unpack:(NSString *)apkFilePath {
  27. NSString *toPath = [apkFilePath stringByDeletingLastPathComponent];
  28. toPath = [toPath stringByAppendingFormat:@"/%@", [toPath lastPathComponent]];
  29. [ZGApkToolUtils unpack:apkFilePath toPath:toPath];
  30. }
  31. + (void)unpack:(NSString *)apkFilePath toPath:(NSString *)toPath {
  32. [ZGShellUtils execSync:[ZGApkToolPath shared].apktool args:[NSArray arrayWithObjects:@"d", apkFilePath, @"-o", toPath, nil]];
  33. }
  34. #pragma mark pack
  35. + (void)pack:(NSString *)apkCodePath {
  36. [ZGShellUtils execSync:[ZGApkToolPath shared].apktool args:@[@"b", apkCodePath]];
  37. }
  38. +(void)sign:(NSString *)apkCodePath keyPath:(NSString *)keyPath {
  39. NSString *distPath = [apkCodePath stringByAppendingString:@"/dist/"];
  40. NSString *apkName = [ZGApkToolUtils apkNameInApkCodePath:apkCodePath];
  41. NSString *from = [NSString stringWithFormat:@"%@/%@.apk", distPath, apkName];
  42. NSString *to = [NSString stringWithFormat:@"%@/%@_sign.apk", distPath, apkName];
  43. NSString *alias = [keyPath lastPathComponent];
  44. NSString *password = [alias stringByDeletingPathExtension];
  45. NSData *data = [[NSString stringWithFormat:@"%@\n", password] dataUsingEncoding:NSUTF8StringEncoding];
  46. [ZGShellUtils execSync:[ZGApkToolPath shared].sign_in args:@[keyPath, from, to, alias] data:data];
  47. }
  48. +(NSString *)align:(NSString *)apkPath {
  49. NSString *distPath = [apkPath stringByAppendingString:@"/dist/"];
  50. NSString *apkName = [ZGApkToolUtils apkNameInApkCodePath:apkPath];
  51. NSString *from = [NSString stringWithFormat:@"%@/%@_sign.apk", distPath, apkName];
  52. NSString *to = [NSString stringWithFormat:@"%@/%@_ok.apk", distPath, apkName];
  53. [ZGShellUtils execSync:[ZGApkToolPath shared].align args:@[@"-f", @"-v", @"4", from, to]];
  54. return to;
  55. }
  56. #pragma mark install & uninstall
  57. +(void)uninstall:(NSString *)package {
  58. [ZGShellUtils execSync:[ZGApkToolPath shared].adb args:@[@"uninstall", package]];
  59. }
  60. + (void)uninstallButKeepData:(NSString *)package {
  61. [ZGShellUtils execSync:[ZGApkToolPath shared].adb args:@[@"shell", @"pm", @"uninstall", @"-k", package]];
  62. }
  63. +(void)install:(NSString *)apkFilePath {
  64. [ZGShellUtils execSync:[ZGApkToolPath shared].adb args:@[@"install", apkFilePath]];
  65. }
  66. +(void) run:(NSString *)package activity:(NSString *)mainActivity {
  67. NSString *runString = [NSString stringWithFormat:@"%@/%@", package, mainActivity];
  68. [ZGShellUtils execSync:[ZGApkToolPath shared].adb args:@[@"shell", @"am", @"start", @"-n", runString]];
  69. }
  70. #pragma mark private
  71. + (NSString*) apkNameInApkCodePath:(NSString*) apkCodePath {
  72. NSString *toolPath = [apkCodePath stringByAppendingString:@"/apktool.yml"];
  73. NSString *toolString = [NSString stringWithContentsOfFile:toolPath encoding:NSUTF8StringEncoding error:nil];
  74. NSArray *toolStringLines = [toolString componentsSeparatedByString:@"\n"];
  75. NSString *apkName = @"";
  76. for (NSString *line in toolStringLines) {
  77. if ([line rangeOfString:@"apkFileName"].location != NSNotFound) {
  78. apkName = [line stringByReplacingOccurrencesOfString:@"apkFileName: " withString:@""];
  79. apkName = [apkName stringByDeletingPathExtension];
  80. break;
  81. }
  82. }
  83. return apkName;
  84. }
  85. @end