// // ZGApkToolUtils.m // UUTUtils // // Created by zhuge on 2017/12/27. // Copyright © 2017年 zhuge. All rights reserved. // #import "ZGApkToolUtils.h" #import "WordUtils.h" #import "ZGShellUtils.h" #import "ZGApkToolPath.h" @implementation ZGApkToolUtils #pragma mark keystore + (NSString *)genRandomKeystoreFile:(NSString *)toPath { NSMutableString *msKeyword = [NSMutableString stringWithCapacity:0]; for (int i = 0; i < 3; i++) { [msKeyword appendString:[WordUtils randomKeyword]]; } [ZGApkToolUtils genKeystoreFile:msKeyword toPath:toPath]; return msKeyword; } + (void)genKeystoreFile:(NSString *)keyName toPath:(NSString *)toPath { [ZGShellUtils execSync:[ZGApkToolPath shared].key args:@[[ZGApkToolPath shared].key_in, keyName, toPath]]; } #pragma mark unpack + (void)unpack:(NSString *)apkFilePath { NSString *toPath = [apkFilePath stringByDeletingLastPathComponent]; toPath = [toPath stringByAppendingFormat:@"/%@", [toPath lastPathComponent]]; [ZGApkToolUtils unpack:apkFilePath toPath:toPath]; } + (void)unpack:(NSString *)apkFilePath toPath:(NSString *)toPath { [ZGShellUtils execSync:[ZGApkToolPath shared].apktool args:[NSArray arrayWithObjects:@"d", apkFilePath, @"-o", toPath, nil]]; } #pragma mark pack + (void)pack:(NSString *)apkCodePath { [ZGShellUtils execSync:[ZGApkToolPath shared].apktool args:@[@"b", apkCodePath]]; } +(void)sign:(NSString *)apkCodePath keyPath:(NSString *)keyPath { NSString *distPath = [apkCodePath stringByAppendingString:@"/dist/"]; NSString *apkName = [ZGApkToolUtils apkNameInApkCodePath:apkCodePath]; NSString *from = [NSString stringWithFormat:@"%@/%@.apk", distPath, apkName]; NSString *to = [NSString stringWithFormat:@"%@/%@_sign.apk", distPath, apkName]; NSString *alias = [keyPath lastPathComponent]; NSString *password = [alias stringByDeletingPathExtension]; NSData *data = [[NSString stringWithFormat:@"%@\n", password] dataUsingEncoding:NSUTF8StringEncoding]; [ZGShellUtils execSync:[ZGApkToolPath shared].sign_in args:@[keyPath, from, to, alias] data:data]; } +(NSString *)align:(NSString *)apkPath { NSString *distPath = [apkPath stringByAppendingString:@"/dist/"]; NSString *apkName = [ZGApkToolUtils apkNameInApkCodePath:apkPath]; NSString *from = [NSString stringWithFormat:@"%@/%@_sign.apk", distPath, apkName]; NSString *to = [NSString stringWithFormat:@"%@/%@_ok.apk", distPath, apkName]; [ZGShellUtils execSync:[ZGApkToolPath shared].align args:@[@"-f", @"-v", @"4", from, to]]; return to; } #pragma mark install & uninstall +(void)uninstall:(NSString *)package { [ZGShellUtils execSync:[ZGApkToolPath shared].adb args:@[@"uninstall", package]]; } + (void)uninstallButKeepData:(NSString *)package { [ZGShellUtils execSync:[ZGApkToolPath shared].adb args:@[@"shell", @"pm", @"uninstall", @"-k", package]]; } +(void)install:(NSString *)apkFilePath { [ZGShellUtils execSync:[ZGApkToolPath shared].adb args:@[@"install", apkFilePath]]; } +(void) run:(NSString *)package activity:(NSString *)mainActivity { NSString *runString = [NSString stringWithFormat:@"%@/%@", package, mainActivity]; [ZGShellUtils execSync:[ZGApkToolPath shared].adb args:@[@"shell", @"am", @"start", @"-n", runString]]; } #pragma mark private + (NSString*) apkNameInApkCodePath:(NSString*) apkCodePath { NSString *toolPath = [apkCodePath stringByAppendingString:@"/apktool.yml"]; NSString *toolString = [NSString stringWithContentsOfFile:toolPath encoding:NSUTF8StringEncoding error:nil]; NSArray *toolStringLines = [toolString componentsSeparatedByString:@"\n"]; NSString *apkName = @""; for (NSString *line in toolStringLines) { if ([line rangeOfString:@"apkFileName"].location != NSNotFound) { apkName = [line stringByReplacingOccurrencesOfString:@"apkFileName: " withString:@""]; apkName = [apkName stringByDeletingPathExtension]; break; } } return apkName; } @end