def _FindPakSymbolsFromApk(apk_path, output_directory, knobs): with zipfile.ZipFile(apk_path) as z: pak_zip_infos = (f for f in z.infolist() if f.filename.endswith('.pak')) apk_info_name = os.path.basename(apk_path) + '.pak.info' pak_info_path = os.path.join(output_directory, 'size-info', apk_info_name) res_info = _ParsePakInfoFile(pak_info_path) symbols_by_id = {} total_compressed_size = 0 total_uncompressed_size = 0 for zip_info in pak_zip_infos: contents = data_pack.ReadDataPackFromString(z.read(zip_info)) compression_ratio = 1.0 if zip_info.compress_size < zip_info.file_size: total_compressed_size += zip_info.compress_size total_uncompressed_size += zip_info.file_size compression_ratio = knobs.pak_compression_ratio _ComputePakFileSymbols( os.path.relpath(zip_info.filename, output_directory), contents, res_info, symbols_by_id, compression_ratio=compression_ratio) if total_uncompressed_size > 0: actual_ratio = ( float(total_compressed_size) / total_uncompressed_size) logging.info('Pak Compression Ratio: %f Actual: %f Diff: %.0f', knobs.pak_compression_ratio, actual_ratio, (knobs.pak_compression_ratio - actual_ratio) * total_uncompressed_size) return symbols_by_id
def testReadWriteDataPackV5(self): expected_data = ( '\x05\x00\x00\x00' # version '\x01\x00\x00\x00' # encoding & padding '\x03\x00' # resource_count '\x01\x00' # alias_count '\x01\x00\x28\x00\x00\x00' # index entry 1 '\x04\x00\x28\x00\x00\x00' # index entry 4 '\x06\x00\x34\x00\x00\x00' # index entry 6 '\x00\x00\x40\x00\x00\x00' # extra entry for the size of last '\x0a\x00\x01\x00' # alias table 'this is id 4this is id 6') # data input_resources = { 1: '', 4: 'this is id 4', 6: 'this is id 6', 10: 'this is id 4', } data = data_pack.WriteDataPackToString(input_resources, data_pack.UTF8) self.assertEquals(data, expected_data) expected_data_pack = data_pack.DataPackContents( { 1: '', 4: input_resources[4], 6: input_resources[6], 10: input_resources[4], }, data_pack.UTF8, 5, {10: 4}, data_pack.DataPackSizes(12, 24, 4, 24)) loaded = data_pack.ReadDataPackFromString(expected_data) self.assertDictEqual(expected_data_pack.__dict__, loaded.__dict__)
def testReadWriteDataPackV5(self): expected_data = ( '\x05\x00\x00\x00' # version '\x01\x00\x00\x00' # encoding & padding '\x03\x00' # resource_count '\x01\x00' # alias_count '\x01\x00\x28\x00\x00\x00' # index entry 1 '\x04\x00\x28\x00\x00\x00' # index entry 4 '\x06\x00\x34\x00\x00\x00' # index entry 6 '\x00\x00\x40\x00\x00\x00' # extra entry for the size of last '\x0a\x00\x01\x00' # alias table 'this is id 4this is id 6') # data expected_resources = { 1: '', 4: 'this is id 4', 6: 'this is id 6', 10: 'this is id 4', } data = data_pack.WriteDataPackToString(expected_resources, data_pack.UTF8) self.assertEquals(data, expected_data) expected_data_pack = data_pack.DataPackContents( expected_resources, data_pack.UTF8) loaded = data_pack.ReadDataPackFromString(expected_data) self.assertEquals(loaded, expected_data_pack)
def _FindPakSymbolsFromFiles(pak_files, pak_info_path, output_directory): """Uses files from args to find and add pak symbols.""" res_info = _ParsePakInfoFile(pak_info_path) symbols_by_id = {} for pak_file_path in pak_files: with open(pak_file_path, 'r') as f: contents = data_pack.ReadDataPackFromString(f.read()) _ComputePakFileSymbols( os.path.relpath(pak_file_path, output_directory), contents, res_info, symbols_by_id) return symbols_by_id
def AddPakSymbolsFromFiles( section_sizes, raw_symbols, pak_files, pak_info_path): """Uses files from args to find and add pak symbols.""" res_info = _ParsePakInfoFile(pak_info_path) symbols_by_name = {} for pak_file_path in pak_files: with open(pak_file_path, 'r') as f: contents = data_pack.ReadDataPackFromString(f.read()) _ComputePakFileSymbols( pak_file_path, os.path.getsize(pak_file_path), contents, res_info, symbols_by_name) _AddPakSymbols(section_sizes, raw_symbols, symbols_by_name)
def _AddPakSymbolsFromApk( section_sizes, raw_symbols, apk_path, output_directory): with zipfile.ZipFile(apk_path) as z: pak_zip_infos = [f for f in z.infolist() if f.filename.endswith('.pak')] apk_info_name = os.path.basename(apk_path) + '.pak.info' pak_info_path = os.path.join(output_directory, 'size-info', apk_info_name) res_info = _ParsePakInfoFile(pak_info_path) symbols_by_name = {} for pak_zip_info in pak_zip_infos: contents = data_pack.ReadDataPackFromString(z.read(pak_zip_info)) _ComputePakFileSymbols( pak_zip_info.filename, pak_zip_info.file_size, contents, res_info, symbols_by_name) _AddPakSymbols(section_sizes, raw_symbols, symbols_by_name)
def testReadDataPackV4(self): expected_data = ( '\x04\x00\x00\x00' # header(version '\x04\x00\x00\x00' # no. entries, '\x01' # encoding) '\x01\x00\x27\x00\x00\x00' # index entry 1 '\x04\x00\x27\x00\x00\x00' # index entry 4 '\x06\x00\x33\x00\x00\x00' # index entry 6 '\x0a\x00\x3f\x00\x00\x00' # index entry 10 '\x00\x00\x3f\x00\x00\x00' # extra entry for the size of last 'this is id 4this is id 6') # data expected_data_pack = data_pack.DataPackContents( { 1: '', 4: 'this is id 4', 6: 'this is id 6', 10: '', }, data_pack.UTF8, 4, {}, data_pack.DataPackSizes(9, 30, 0, 24)) loaded = data_pack.ReadDataPackFromString(expected_data) self.assertDictEqual(expected_data_pack.__dict__, loaded.__dict__)
def testReadDataPackV4(self): expected_data = ( '\x04\x00\x00\x00' # header(version '\x04\x00\x00\x00' # no. entries, '\x01' # encoding) '\x01\x00\x27\x00\x00\x00' # index entry 1 '\x04\x00\x27\x00\x00\x00' # index entry 4 '\x06\x00\x33\x00\x00\x00' # index entry 6 '\x0a\x00\x3f\x00\x00\x00' # index entry 10 '\x00\x00\x3f\x00\x00\x00' # extra entry for the size of last 'this is id 4this is id 6') # data expected_resources = { 1: '', 4: 'this is id 4', 6: 'this is id 6', 10: '', } expected_data_pack = data_pack.DataPackContents( expected_resources, data_pack.UTF8) loaded = data_pack.ReadDataPackFromString(expected_data) self.assertEquals(loaded, expected_data_pack)
def _FindPakSymbolsFromApk(apk_path, output_directory): with zipfile.ZipFile(apk_path) as z: pak_zip_infos = (f for f in z.infolist() if f.filename.endswith('.pak')) apk_info_name = os.path.basename(apk_path) + '.pak.info' pak_info_path = os.path.join(output_directory, 'size-info', apk_info_name) res_info = _ParsePakInfoFile(pak_info_path) symbols_by_id = {} for zip_info in pak_zip_infos: contents = data_pack.ReadDataPackFromString(z.read(zip_info)) compression_ratio = float( zip_info.compress_size) / zip_info.file_size _ComputePakFileSymbols(os.path.relpath(zip_info.filename, output_directory), contents, res_info, symbols_by_id, expected_size=zip_info.compress_size, compression_ratio=compression_ratio) return symbols_by_id