def batch_check(app_folder, excel_path): ''' 批量检测多个ipa,并产生excel报告 ''' #遍历folder,找出.ipa文件 if not app_folder or not excel_path: return False check_results = [] ipa_list = os.listdir(app_folder) for ipa in ipa_list: result = {} #每个app的检查结果 print 'start check :', ipa if ipa.endswith('.ipa'): ipa_path = os.path.join(app_folder, ipa) pid = utils.get_unique_str() #获得ipa信息和静态检查 # ipa_parse = IpaParse.IpaParse(ipa_path) # result['name'] = ipa_parse.app_name() # result['version'] = ipa_parse.version() # result['bundle_id'] = ipa_parse.bundle_identifier() # result['tar_version'] = ipa_parse.target_os_version() # result['min_version'] = ipa_parse.minimum_os_version() result['md5'] = get_file_md5(ipa_path) print result['md5'] rsts = check_app_info_and_provision(ipa_path) for key in rsts.keys(): result[key] = rsts[key] #检查ios私有api app = get_executable_path(ipa_path, pid) methods_in_app, methods_not_in_app, private = check_private_api(app, pid) result['private_apis'] = methods_in_app result['private_frameworks'] = list(private) #检查ipa 64支持情况 arcs = check_architectures(app) result['arcs'] = arcs #检查ghost情况 ghost = check_xcode_ghost(app) result['ghost'] = ghost #检查codesign codesign = check_codesign(app) result['codesign'] = codesign check_results.append(result) cur_dir = os.getcwd() #删除检查临时目录 dest_tmp = os.path.join(cur_dir, 'tmp/' + pid) if os.path.exists(dest_tmp): shutil.rmtree(dest_tmp) #将结果转化成excel报告 report_utils.excel_report(check_results, excel_path) return excel_path
def batch_check(app_folder, excel_path): ''' 批量检测多个ipa,并产生excel报告 ''' #遍历folder,找出.ipa文件 if not app_folder or not excel_path: return False check_results = [] ipa_list = os.listdir(app_folder) for ipa in ipa_list: result = {} #每个app的检查结果 print 'start check :', ipa if ipa.endswith('.ipa'): ipa_path = os.path.join(app_folder, ipa) pid = utils.get_unique_str() #获得ipa信息和静态检查 # ipa_parse = IpaParse.IpaParse(ipa_path) # result['name'] = ipa_parse.app_name() # result['version'] = ipa_parse.version() # result['bundle_id'] = ipa_parse.bundle_identifier() # result['tar_version'] = ipa_parse.target_os_version() # result['min_version'] = ipa_parse.minimum_os_version() result['md5'] = get_file_md5(ipa_path) print result['md5'] rsts = check_app_info_and_provision(ipa_path) for key in rsts.keys(): result[key] = rsts[key] #检查ios私有api app = get_executable_path(ipa_path, pid) methods_in_app, methods_not_in_app, private = check_private_api( app, pid) result['private_apis'] = methods_in_app result['private_frameworks'] = list(private) #检查ipa 64支持情况 arcs = check_architectures(app) result['arcs'] = arcs #检查ghost情况 ghost = check_xcode_ghost(app) result['ghost'] = ghost #检查codesign codesign = check_codesign(app) result['codesign'] = codesign check_results.append(result) cur_dir = os.getcwd() #删除检查临时目录 dest_tmp = os.path.join(cur_dir, 'tmp/' + pid) if os.path.exists(dest_tmp): shutil.rmtree(dest_tmp) #将结果转化成excel报告 report_utils.excel_report(check_results, excel_path) return excel_path
def check_ipa(ipa_path): result = {} #每个app的检查结果 pid = utils.get_unique_str() print '1.', '+' * 10, 'get_file_md5' result['md5'] = get_file_md5(ipa_path) print '2.', '+' * 10, 'check_app_info_and_provision' rsts = check_app_info_and_provision(ipa_path) for key in rsts.keys(): result[key] = rsts[key] #检查ios私有api print '3.', '+' * 10, 'check_private_api' app = get_executable_path(ipa_path, pid) if not app: #找不到math-o文件,说明不是正常的ipa,忽略 return False methods_in_app, _, private = check_private_api(app, pid) result['private_apis'] = methods_in_app # result['private_apis_not'] = _ result['private_frameworks'] = list(private) #检查ipa 64支持情况 print '4.', '+' * 10, 'check_architectures' arcs = check_architectures(app) result['arcs'] = arcs if len(arcs) < 2: result['error'].append({ 'label': 'Architecture:', 'description': 'app may be not support 64-bit' }) #检查ghost情况 print '5.', '+' * 10, 'check_xcode_ghost' ghost = check_xcode_ghost(app) result['ghost'] = ghost #检查codesign print '6.', '+' * 10, 'check_private_api' codesign = check_codesign(app) result['codesign'] = codesign print '7.', '+' * 10, 'remove tmp files' cur_dir = os.getcwd() #删除检查临时目录 dest_tmp = os.path.join(cur_dir, 'tmp/' + pid) # print 'tmp:', dest_tmp if os.path.exists(dest_tmp): shutil.rmtree(dest_tmp) return result
def export_excel_report(ipa_list): excel_dir = PathUtil.excel_dir() excel_path = os.path.join(excel_dir + utils.get_unique_str() + '.xlsx') ipa_folder = PathUtil.upload_dir() check_results = [] for ipa in ipa_list: if ipa.endswith('.ipa'): ipa_path = os.path.join(ipa_folder, ipa) # 单个app的检查结果 try: r = check_ipa(ipa_path) if r: check_results.append(r) except Exception, e: print e continue
def check_ipa(ipa_path): result = {} #每个app的检查结果 pid = utils.get_unique_str() print '1.', '+' * 10, 'get_file_md5' result['md5'] = get_file_md5(ipa_path) print '2.', '+' * 10, 'check_app_info_and_provision' rsts = check_app_info_and_provision(ipa_path) for key in rsts.keys(): result[key] = rsts[key] #检查ios私有api print '3.', '+' * 10, 'check_private_api' app = get_executable_path(ipa_path, pid) if not app: #找不到math-o文件,说明不是正常的ipa,忽略 return False methods_in_app, _, private = check_private_api(app, pid) result['private_apis'] = methods_in_app # result['private_apis_not'] = _ result['private_frameworks'] = list(private) #检查ipa 64支持情况 print '4.', '+' * 10, 'check_architectures' arcs = check_architectures(app) result['arcs'] = arcs if len(arcs) < 2: result['error'].append({'label': 'Architecture:', 'description': 'app may be not support 64-bit'}) #检查ghost情况 print '5.', '+' * 10, 'check_xcode_ghost' ghost = check_xcode_ghost(app) result['ghost'] = ghost #检查codesign print '6.', '+' * 10, 'check_private_api' codesign = check_codesign(app) result['codesign'] = codesign print '7.', '+' * 10, 'remove tmp files' cur_dir = os.getcwd() #删除检查临时目录 dest_tmp = os.path.join(cur_dir, 'tmp/' + pid) # print 'tmp:', dest_tmp if os.path.exists(dest_tmp): shutil.rmtree(dest_tmp) return result
# for aa in a: # print aa # print >>private_1, aa # print "=" * 50 # print len(b), "Private Methods not in App, May in Framework Used:" # print "*" * 50 # for bb in b: # print >>private_2, bb # print "=" * 50 # print len(c), "Private Framework in App:" # print "*" * 50 ########## #test batch check ipa cwd = os.getcwd() excel_path = os.path.join(cwd, 'tmp/' + utils.get_unique_str() + '.xlsx') # excel_path = os.path.join(cwd, 'tmp/test.xlsx') # for test print excel_path ipa_folder = '/Users/netease/Downloads/ipas/mg/' # ipa_folder = '/Users/netease/Music/iTunes/iTunes Media/Mobile Applications/' # ipa_folder = '/Users/netease/Music/iTunes/iTunes Media/' print batch_check(ipa_folder, excel_path) ######### #test check arcs # app_path = '/Users/netease/Downloads/ipas/mg/Payload' # app = app_utils.get_executable_file(app_path) # print check_architectures(app)
# print "*" * 50 # for aa in a: # print aa # print >>private_1, aa # print "=" * 50 # print len(b), "Private Methods not in App, May in Framework Used:" # print "*" * 50 # for bb in b: # print >>private_2, bb # print "=" * 50 # print len(c), "Private Framework in App:" # print "*" * 50 ########## #test batch check ipa cwd = os.getcwd() excel_path = os.path.join(cwd, 'tmp/' + utils.get_unique_str() + '.xlsx') # excel_path = os.path.join(cwd, 'tmp/test.xlsx') # for test print excel_path ipa_folder = '/Users/netease/Downloads/ipas/mg/' print batch_check(ipa_folder, excel_path) ######### #test check arcs # app_path = '/Users/netease/Downloads/ipas/mg/Payload' # app = app_utils.get_executable_file(app_path) # print check_architectures(app)