예제 #1
0
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
예제 #2
0
    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__)
예제 #3
0
  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)
예제 #4
0
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
예제 #5
0
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)
예제 #6
0
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)
예제 #7
0
 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__)
예제 #8
0
 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)
예제 #9
0
파일: archive.py 프로젝트: aixliu/chromium
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