// // TAAnnotation.m // Pods // // Created by wwango on 2022/10/8. // #import "TAAnnotation.h" #include #include #include #include #import #import #include #import "TAModuleManager.h" #import "TAServiceManager.h" NSArray* _TAReadConfiguration(char *sectionName,const struct mach_header *mhp); static void dyld_callback(const struct mach_header *mhp, intptr_t vmaddr_slide) { //register mods NSArray *mods = _TAReadConfiguration(ThinkingModSectName, mhp); for (NSString *modName in mods) { Class cls; if (modName) { cls = NSClassFromString(modName); if (cls) { [[TAModuleManager sharedManager] registerDynamicModule:cls]; } } } //register services NSArray *services = _TAReadConfiguration(ThinkingServiceSectName,mhp); for (NSString *map in services) { NSData *jsonData = [map dataUsingEncoding:NSUTF8StringEncoding]; NSError *error = nil; id json = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; if (!error) { if ([json isKindOfClass:[NSDictionary class]] && [json allKeys].count) { NSString *protocol = [json allKeys][0]; NSString *clsName = [json allValues][0]; if (protocol && clsName) { [[TAServiceManager sharedManager] registerService:NSProtocolFromString(protocol) implClass:NSClassFromString(clsName)]; } } } } } NSArray* _TAReadConfiguration(char *sectionName,const struct mach_header *mhp) { NSMutableArray *configs = [NSMutableArray array]; unsigned long size = 0; #ifndef __LP64__ uintptr_t *memory = (uintptr_t*)getsectiondata(mhp, SEG_DATA, sectionName, &size); #else const struct mach_header_64 *mhp64 = (const struct mach_header_64 *)mhp; uintptr_t *memory = (uintptr_t*)getsectiondata(mhp64, SEG_DATA, sectionName, &size); #endif unsigned long counter = size/sizeof(void*); for(int idx = 0; idx < counter; ++idx){ char *string = (char*)memory[idx]; NSString *str = [NSString stringWithUTF8String:string]; if(!str)continue; NSLog(@"config = %@", str); if(str) [configs addObject:str]; } return configs; } __attribute__((constructor)) void __ta_init_dyld_addImage() { _dyld_register_func_for_add_image(dyld_callback); } @implementation TAAnnotation @end