// // ZGApk_Manifest.m // UUTUtils // // Created by zhuge on 2017/12/28. // Copyright © 2017年 zhuge. All rights reserved. // #import "ZGApk_Manifest.h" #import "ZGApk.h" @implementation ZGApk_Manifest - (ZGApk_Manifest *)initWithApk:(ZGApk *)apk { self.apk = apk; self.path = [NSString stringWithFormat:@"%@/AndroidManifest.xml", self.apk.path]; return self; } #pragma mark operation - (void)repaireShortPackage { // application GDataXMLNode *nodeName = [self.application attributeForName:@"android::name"]; NSString *name = nodeName.stringValue; if ([name hasPrefix:@"."]) { // 以点开头 nodeName.stringValue = [NSString stringWithFormat:@"%@%@", self.package, name]; } if (![name containsString:@"."]) { // 没有点 nodeName.stringValue = [NSString stringWithFormat:@"%@.%@", self.package, name]; } // 所有的类都补足包名 NSMutableArray *ma = [NSMutableArray arrayWithCapacity:0]; [ma addObjectsFromArray:self.maReceivers]; [ma addObjectsFromArray:self.maActivities]; [ma addObjectsFromArray:self.maServices]; for (GDataXMLElement *ele in ma) { GDataXMLNode *nodeName = [[ele elementsForName:@"android:name"] firstObject]; NSString *name = nodeName.stringValue; if ([name hasPrefix:@"."]) { // 以点开头 nodeName.stringValue = [NSString stringWithFormat:@"%@%@", self.package, name]; } if (![name containsString:@"."]) { // 没有点 nodeName.stringValue = [NSString stringWithFormat:@"%@.%@", self.package, name]; } } [self save]; } - (void)replacePackage:(NSString *)newPackage { [self.root attributeForName:@"package"].stringValue = newPackage; // 替换预置的字符串 NSString *fileContent = [[NSString alloc] initWithData:[self.doc XMLData] encoding:NSUTF8StringEncoding]; fileContent = [fileContent stringByReplacingOccurrencesOfString:self.package withString:newPackage]; fileContent = [fileContent stringByReplacingOccurrencesOfString:@"RE_PACKAGE" withString:newPackage]; NSString *s1 = [NSString stringWithFormat:@"android:authorities=\"%@.", self.package]; NSString *s2 = [NSString stringWithFormat:@"android:authorities=\"%@.", self.package]; fileContent = [fileContent stringByReplacingOccurrencesOfString:s1 withString:s2]; // 替换完成后,重置所有的xml缓存 self.doc = [[GDataXMLDocument alloc] initWithXMLString:fileContent error:nil]; self.root = self.doc.rootElement; self.application = [[self.doc.rootElement elementsForName:@"application"] firstObject]; } - (void) save { [[self.doc XMLData] writeToFile:self.path atomically:YES]; } #pragma mark getter - (GDataXMLDocument *)doc { if (_doc) { return _doc; } else { NSData *xmlData = [NSData dataWithContentsOfFile:self.path]; self.doc = [[GDataXMLDocument alloc] initWithData:xmlData error:nil]; return _doc; } } - (GDataXMLElement *)root { if (_root) { return _root; } else { return self.doc.rootElement; } } - (GDataXMLElement *)application { if (_application) { return _application; } else { return [[self.doc.rootElement elementsForName:@"application"] firstObject]; } } - (NSMutableArray *)maActivities { if (_maActivities) { return _maActivities; } else { self.maActivities = [NSMutableArray arrayWithArray:[self.application elementsForName:@"activity"]]; return _maActivities; } } - (NSMutableArray *)maServices { if (_maServices) { return _maServices; } else { self.maServices = [NSMutableArray arrayWithArray:[self.application elementsForName:@"service"]]; return _maServices; } } - (NSMutableArray *)maReceivers { if (_maReceivers) { return _maReceivers; } else { self.maReceivers = [NSMutableArray arrayWithArray:[self.application elementsForName:@"receiver"]]; return _maReceivers; } } - (NSString *)package { if (_package) { return _package; } else { GDataXMLNode *packageNode = [self.root attributeForName:@"package"]; self.package = packageNode.stringValue; return _package; } } - (NSString *)iconName { if (_iconName) { return _iconName; } else { NSString *iconString = [self.application attributeForName:@"android:icon"].stringValue; self.iconName = [iconString stringByReplacingOccurrencesOfString:@"@drawable/" withString:@""]; return _iconName; } } - (NSString *)appNameName { if (_appNameName) { return _appNameName; } else { NSString *name = [self.application attributeForName:@"android:label"].stringValue; _appNameName = [name stringByReplacingOccurrencesOfString:@"@string/" withString:@""]; return _appNameName; } } - (NSString *)mainActivityName { if (_mainActivityName) { return _mainActivityName; } else { for (GDataXMLElement *ele in self.maActivities) { if ([ele.XMLString rangeOfString:@"android.intent.action.MAIN" ].length != 0 && [ele.XMLString rangeOfString:@"android.intent.category.LAUNCHER"].location != NSNotFound) { _mainActivityName = [[ele attributeForName:@"android:name"] stringValue]; return _mainActivityName; } } } return @""; } @end