PackUtils.mm 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. //
  2. // PackUtils.m
  3. // UUTUtils
  4. //
  5. // Created by zhuge on 2017/12/27.
  6. // Copyright © 2017年 zhuge. All rights reserved.
  7. //
  8. #import "PackUtils.h"
  9. #import "ProjectInfo.h"
  10. #import "ZGApkToolUtils.h"
  11. #import "ZGApk.h"
  12. #import "ZGApkFixUtils.h"
  13. #import "ZGFileUtils.h"
  14. #import "ZGImageUtils.h"
  15. #include "JoinFileDir.h"
  16. #include "JoinFile.h"
  17. @interface PackUtils()
  18. @property (strong) ZGApkFixUtils *fixUtils;
  19. @end
  20. @implementation PackUtils
  21. - (PackUtils *)initWithProjectInfo:(ProjectInfo *)projectInfo {
  22. self.projectInfo = projectInfo;
  23. return self;
  24. }
  25. - (void)pack {
  26. self.fixUtils = [[ZGApkFixUtils alloc] initWithApk:self.projectInfo.apk configs:self.projectInfo.fixConfigs];
  27. // [self unpackTheApk]; // 解压原始Apk
  28. [self changeIcon]; // 替换icon图标
  29. [self changeStringValues]; // 更换各种的id
  30. [self replacePackage]; // 替换包名
  31. [self encrytAssets];
  32. [self.fixUtils fix]; // 进行混淆操作
  33. [self.projectInfo.apk save]; // 保存所有的更改
  34. // 打包操作
  35. [ZGApkToolUtils pack:self.projectInfo.path.apkCode];
  36. [ZGApkToolUtils sign:self.projectInfo.path.apkCode keyPath:self.projectInfo.path.config.keystore];
  37. [ZGApkToolUtils align:self.projectInfo.path.apkCode];
  38. [ZGFileUtils copyFileFromPath:self.projectInfo.apk.okApkPath toPath:self.projectInfo.outputApkFilePath];
  39. }
  40. #pragma mark fix
  41. - (void) encrytAssets {
  42. JoinFileDir *_joinFileDir = [JoinFileDir shared];
  43. NSString * dir = [NSString stringWithFormat:@"%@/assets", self.projectInfo.apk.path];
  44. [_joinFileDir dealAssetsYt:dir isAndroid:true packgeName:self.projectInfo.apk.manifest.package typeAddDic:@{}];
  45. }
  46. #pragma mark pack
  47. - (void) replacePackage {
  48. // NSString *oldPackage = self.projectInfo.apk.manifest.package;
  49. NSString *newPackage = self.projectInfo.package;
  50. [self.projectInfo.apk.manifest replacePackage:newPackage];
  51. // NSString *package_old = [@"id=" stringByAppendingString:oldPackage];
  52. // NSString *package_new = [@"id=" stringByAppendingString:newPackage];
  53. // NSString *oldPackageId2 = [NSString stringWithFormat:@"android:targetPackage=\"%@\"", oldPackage];
  54. // NSString *newPackageId2 = [NSString stringWithFormat:@"android:targetPackage=\"%@\"", newPackage];
  55. // NSString *oldPackageId5 = [NSString stringWithFormat:@"provider android:authorities=\"%@", oldPackage];
  56. // NSString *newPackageId5 = [NSString stringWithFormat:@"provider android:authorities=\"%@", newPackage];
  57. // self.fixUtils.mdChangeString[package_old] = package_new;
  58. // self.fixUtils.mdChangeString[oldPackageId2] = newPackageId2;
  59. // self.fixUtils.mdChangeString[oldPackageId5] = newPackageId5;
  60. }
  61. - (void) changeStringValues {
  62. // umeng
  63. self.projectInfo.apk.string.umengKey = self.projectInfo.local.sdkKeys.umengKey;
  64. self.projectInfo.apk.string.umengChannel = @"";
  65. // facebook
  66. self.projectInfo.apk.string.facebookAppId = self.projectInfo.local.sdkKeys.facebookKey;
  67. // app name
  68. self.projectInfo.apk.string.appName = self.projectInfo.local.translate.appName;
  69. }
  70. - (void) changeIcon {
  71. NSString *iconFilePath = self.projectInfo.path.config.icon;
  72. NSDictionary *toSizes = @{
  73. @"mipmap-hdpi": @"72",
  74. @"mipmap-hdpi-v4": @"72",
  75. @"mipmap-mdpi": @"48",
  76. @"mipmap-mdpi-v4": @"48",
  77. @"mipmap-xhdpi": @"96",
  78. @"mipmap-xhdpi-v4": @"96",
  79. @"mipmap-xxhdpi": @"144",
  80. @"mipmap-xxhdpi-v4": @"144",
  81. };
  82. for (NSString *dirName in toSizes) {
  83. NSString *toSize = [toSizes objectForKey:dirName];
  84. NSString *toPath = [NSString stringWithFormat:@"%@/res/%@/%@.%@", self.projectInfo.path.apkCode, dirName, [self.projectInfo.apk.manifest.iconName stringByReplacingOccurrencesOfString:@"@mipmap/" withString:@""], [iconFilePath pathExtension]];
  85. [ZGImageUtils resizePng:iconFilePath toWidth:[toSize intValue] toHeight:[toSize intValue] toPath:toPath];
  86. }
  87. }
  88. - (void) unpackTheApk {
  89. [ZGFileUtils deleteFileOrDirectoryAtPath:self.projectInfo.path.apkCode];
  90. [ZGApkToolUtils unpack:self.projectInfo.upload.oriApkPath toPath:self.projectInfo.path.apkCode];
  91. }
  92. @end