欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

iOS代碼瘦身實(shí)踐之怎么刪除無用的類-創(chuàng)新互聯(lián)

這篇文章將為大家詳細(xì)講解有關(guān)iOS代碼瘦身實(shí)踐之怎么刪除無用的類,小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

創(chuàng)新互聯(lián)建站公司2013年成立,先為山海關(guān)等服務(wù)建站,山海關(guān)等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為山海關(guān)企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

前言

本文將提供一種靜態(tài)分析的方式,用于查找可執(zhí)行文件Mach-o中未使用的類,源碼鏈接:xuezhulian/classunref (本地下載)。

Mach-o文件中__DATA __objc_classrefs段記錄了引用類的地址,__DATA __objc_classlist段記錄了所有類的地址,取差集可以得到未使用的類的地址,然后進(jìn)行符號化,就可以得到未被引用的類信息。

引用類地址

可以通過Mac自帶的工具otool打印Mach-o中的段信息,需要注意的是模擬器和真機(jī)對應(yīng)的可執(zhí)行文件,數(shù)據(jù)的存儲方式不同需要加以區(qū)分。

可以通過file命令獲取到arch。

#binary_file_arch: distinguish Big-Endian and Little-Endian
#file -b output example: Mach-O 64-bit executable arm64
binary_file_arch = os.popen('file -b ' + path).read().split(' ')[-1].strip()

在取類地址的時候區(qū)分x86_64和arm。

def pointers_from_binary(line, binary_file_arch):
 line = line[16:].strip().split(' ')
 pointers = set()
 if binary_file_arch == 'x86_64':
  #untreated line example:00000001030cec80	d8 75 15 03 01 00 00 00 68 77 15 03 01 00 00 00
  pointers.add(''.join(line[4:8][::-1] + line[0:4][::-1]))
  pointers.add(''.join(line[12:16][::-1] + line[8:12][::-1]))
  return pointers
 #arm64 confirmed,armv7 arm7s unconfirmed
 if binary_file_arch.startswith('arm'):
  #untreated line example:00000001030bcd20	03138580 00000001 03138878 00000001
  pointers.add(line[1] + line[0])
  pointers.add(line[3] + line[2])
  return pointers
 return None

通過otool -v -s __DATA __objc_classrefs獲取到引用類的地址。

def class_ref_pointers(path, binary_file_arch):
  ref_pointers = set()
  lines = os.popen('/usr/bin/otool -v -s __DATA __objc_classrefs %s' % path).readlines()
  for line in lines:
    pointers = pointers_from_binary(line, binary_file_arch)
    ref_pointers = ref_pointers.union(pointers)
  return ref_pointers

所有類地址

通過otool -v -s __DATA __objc_classlist獲取所有類的地址。

def class_list_pointers(path, binary_file_arch):
  list_pointers = set()
  lines = os.popen('/usr/bin/otool -v -s __DATA __objc_classlist %s' % path).readlines()
  for line in lines:
    pointers = pointers_from_binary(line, binary_file_arch)
    list_pointers = list_pointers.union(pointers)
  return list_pointers

取差集

用所有類信息減去引用類的信息,此時我們可以拿到未使用類的地址信息。

unref_pointers = class_list_pointers(path, binary_file_arch) - class_ref_pointers(path, binary_file_arch)

符號化

通過nm -nm命令可以得到地址和對應(yīng)的類名字。

def class_symbols(path):
  symbols = {}
  #class symbol format from nm: 0000000103113f68 (__DATA,__objc_data) external _OBJC_CLASS_$_EpisodeStatusDetailItemView
  re_class_name = re.compile('(\w{16}) .* _OBJC_CLASS_\$_(.+)')
  lines = os.popen('nm -nm %s' % path).readlines()
  for line in lines:
    result = re_class_name.findall(line)
    if result:
      (address, symbol) = result[0]
      symbols[address] = symbol
  return symbols

過濾

在實(shí)際分析的過程中發(fā)現(xiàn),如果一個類的子類被實(shí)例化,父類未被實(shí)例化,此時父類不會出現(xiàn)在__objc_classrefs這個段里,在未使用的類中需要將這一部分父類過濾出去。使用otool -oV可以獲取到類的繼承關(guān)系。

def filter_super_class(unref_symbols):
  re_subclass_name = re.compile("\w{16} 0x\w{9} _OBJC_CLASS_\$_(.+)")
  re_superclass_name = re.compile("\s*superclass 0x\w{9} _OBJC_CLASS_\$_(.+)")
  #subclass example: 0000000102bd8070 0x103113f68 _OBJC_CLASS_$_TTEpisodeStatusDetailItemView
  #superclass example: superclass 0x10313bb80 _OBJC_CLASS_$_TTBaseControl
  lines = os.popen("/usr/bin/otool -oV %s" % path).readlines()
  subclass_name = ""
  superclass_name = ""
  for line in lines:
    subclass_match_result = re_subclass_name.findall(line)
    if subclass_match_result:
      subclass_name = subclass_match_result[0]
    superclass_match_result = re_superclass_name.findall(line)
    if superclass_match_result:
      superclass_name = superclass_match_result[0]

    if len(subclass_name) > 0 and len(superclass_name) > 0:
      if superclass_name in unref_symbols and subclass_name not in unref_symbols:
        unref_symbols.remove(superclass_name)
      superclass_name = ""
      subclass_name = ""
  return unref_symbols

為了防止一些三方庫的誤傷,還可以去過濾一些前綴,或者是是僅保留帶有某些前綴的類。

 for unref_pointer in unref_pointers:
    if unref_pointer in symbols:
      unref_symbol = symbols[unref_pointer]
      if len(reserved_prefix) > 0 and not unref_symbol.startswith(reserved_prefix):
        continue
      if len(filter_prefix) > 0 and unref_symbol.startswith(filter_prefix):
        continue
      unref_symbols.add(unref_symbol)

最終結(jié)果保存在腳本目錄下。

script_path = sys.path[0].strip()
f = open(script_path+"/result.txt","w")
f.write( "unref class number:  %d\n" % len(unref_symbles))
f.write("\n")
for unref_symble in unref_symbles:
  f.write(unref_symble+"\n")
f.close()

這個思路在一定程度上能夠減少代碼的冗余,減小包的體積。因?yàn)槭庆o態(tài)分析,不能包括動態(tài)調(diào)用的情況,對于需要刪除的類需要進(jìn)一步的確認(rèn)。

關(guān)于“iOS代碼瘦身實(shí)踐之怎么刪除無用的類”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站chinadenli.net,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

文章名稱:iOS代碼瘦身實(shí)踐之怎么刪除無用的類-創(chuàng)新互聯(lián)
鏈接地址:http://chinadenli.net/article42/cdjeec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)網(wǎng)站設(shè)計(jì)、做網(wǎng)站App開發(fā)、自適應(yīng)網(wǎng)站網(wǎng)站營銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管
中国少妇精品偷拍视频| 日本最新不卡免费一区二区| 午夜精品福利视频观看| 沐浴偷拍一区二区视频| 欧美精品一区二区三区白虎| 久久热九九这里只有精品| 国产精品一区日韩欧美| 人妻中文一区二区三区| 国产精品国产亚洲看不卡| 伊人久久五月天综合网| 亚洲高清中文字幕一区二三区| 亚洲一区二区三在线播放| 久久机热频这里只精品| 国产精品一区二区丝袜| 九九久久精品久久久精品| 欧美日本精品视频在线观看| 国产精品日韩欧美一区二区| 精品日韩av一区二区三区| 99少妇偷拍视频在线| 欧美日韩综合免费视频| 精品久久久一区二区三| 亚洲天堂有码中文字幕视频| 99久久精品视频一区二区| 少妇视频一区二区三区| 国产欧美一区二区三区精品视| 老司机亚洲精品一区二区| 亚洲综合伊人五月天中文| 黑色丝袜脚足国产一区二区| 久久精品亚洲欧美日韩| 午夜国产福利在线播放| 久久偷拍视频免费观看| 91亚洲精品国产一区| 欧美成人黄色一级视频| 精品香蕉一区二区在线| 91精品蜜臀一区二区三区| 字幕日本欧美一区二区| 色婷婷国产熟妇人妻露脸| 欧美国产日产在线观看| 久草精品视频精品视频精品 | 欧美三级精品在线观看| 日韩国产传媒在线精品|