Отслабването на приложението е основно за инсталационния пакет, а инсталационният пакет в iOS е компресиран пакет, завършващ с .ipa. Можем да го анализираме чрез ipa. След декомпресиране на ipa можете да получите .app файла и да щракнете с десния бутон на мишката, за да видите съдържанието на пакета (изпълним файл, перо, storyboardc, пакет с автомобилни ресурси и т.н.)
Отслабване на чанти, можете грубо да започнете от следните категории:

отслабване

Ресурсно ниво:
Assets.car: всички компресирани пакети от .xcassets в проекта
изображение: Файл с ресурс на изображението
Video && Audio: аудио или видео.
Xib && Storyboard: Компилирани файлове на Xib и Storyboard.

Кодово ниво:
изпълним файл на проекта
Рамки: Вградени рамки, динамични библиотеки, използвани в проекта

Можем да разделим ресурсите на отдалечени ресурси (отдалечени), местни ресурси (местни)
Отдалечено: Поставете ресурсния файл на сървъра и го изтеглете, ако е необходимо, след като потребителят изтегли приложението.
Local: Ресурсният файл е интегриран в инсталационния пакет.

Дистанционно
Можем да поставим всички несъществени ресурсни файлове на сървъра и да ги заредим при поискване

Местен
1. Компресирайте големи изображения и ги компресирайте с помощта на инструменти като tinypng, които трябва да постигнат най-подходящия ефект с най-малка заетост.
Единното използване на ресурсите за изображения. Xcassets също ще направят малко компресия за вас, намерете голямата картина:

2. Проверете за дублиращи се ресурси, които се отнасят до едно и също/подобно съдържание с различни имена. Можете да използвате инструмента fdupes, за да сканирате и намерите дублиращи се файлове в посочената директория и поддиректории. fdupes идентифицира дублирано съдържание чрез сравняване на MD5 подписи на файлове и сравняване на файлове по байт

3. Почистете местните безполезни ресурси. Безполезни ресурси се отнасят до ресурси в файла на проекта, но не са посочени в кода. Чрез премахване на безполезни ресурси и компресирани ресурси, ресурсите включват снимки, аудио и видео файлове за оптимизиране.
Проверете начина на мислене: използвайте ключовата дума ресурс (обикновено името на файла, ресурсът на изображението трябва да премахне @ 2x @ 3x), потърсете кода (обикновено m \ xib \ sb файл), не можете да намерите Не е цитиран.
Тук трябва да се отбележи, че ако ресурсът е в xcassets, името на ресурса, посочено от неговия код, не е непременно името на изображението, а името на папката на суфикса на изображението
Разбира се, някои ресурси се снаждат по време на употреба (като load_xxx.png) и трябва да бъдат филтрирани ръчно,
Пример за скрипт (py):

1. Повторете кода

Когато даден проект е в процес на непрекъснато развитие итерация и натрупване на функции, поради ротация на бизнеса, новодошлите и други причини могат да причинят проблема с повтарящите се колела, което води до излишен код.
Повтарящата се проверка на общия код е да сканира кода за същия код в рамките на посочения брой редове. За клиентския код, тъй като има две платформи, iOS и Android, е необходимо да се обмисли гъвкавостта на инструмента и той трябва да поддържа Objective-C и Java.
Поради горните причини последният избран инструмент е PMD-CPD (Детектор за копиране/поставяне на PMD). Този инструмент използва алгоритъм за съвпадение на низовете на Karp-Rabin, поддържа gui, команден ред и изходният формат поддържа текст, xml, csv и др.

  1. Първо изтеглете инструментариума pmd от официалния уебсайт http: //sourceforge.net/projects/pmd/files/pmd/ И разархивирайте
  2. cd в неговата bin директория, изпълнете ./run.sh cpd --language ObjectiveC --minimum-tokens
    120 --files/Users/xxx/Documents/Project directory

ps: посочете изходния формат

използвайте ./run.sh cpdgu и активирам инструмента за GUI интерфейс

За подробно използване на параметрите вижте официалния урок на уебсайта: https: //pmd.sourceforge.io/pmd-5.5.1/usage/cpd-usage.html

PS:
Освен това има много други инструменти за откриване като Simian

2. Намерете безполезни методи

LinkMap
За да намерите безполезни селектори, първо разберете LinkMap. Файлът LinkMap е информацията за връзката, генерирана от Xcode при генериране на изпълнимия файл. Използва се за описание на структурата на изпълнимия файл, включително кодовия сегмент (__TEXT) и разпределението на сегмента от данни (__DATA). Просто задайте Project-> Settings Settings-> Write Link Map File на YES и задайте Path to Link Map File. След изграждането можете да видите файла LinkMap в зададения път.
Всяка LinkMap се състои от 3 части:
1. Обектни файлове: Избройте всички .obj файлове в изпълнимия файл и номера на всеки файл, като [1]
/Users/luph/Library/Developer/Xcode/DerivedData/YYMobile-fpkgufbaoaunujctjgrwtzbylsll/Build/Intermediates.noindex/YYMobile.build/Debug-iphoneos/YYMobile.build/Objects-Nortal/YorgeBooner-By/Mobile-Byor-Booner-Byor-Booo
2. Раздели: е таблицата с раздели на изпълнимия файл, описваща позицията на изместване и размера на всяка секция в изпълнимия файл. Първата колона е отместването на сегмента, втората колона е заетият размер на сегмента, Адрес (n) = Адрес (n-1) + Размер (n-1); третата колона е типът сегмент, кодовият сегмент и сегментът от данни; Четвъртата колона е името на сегмента, като __text е изпълним машинен код, __cstring е низова константа. както следва:

  1. Символи:
    Опишете подробно разпределението на всеки obj файл във всеки сегмент, показано в реда на раздели на втората част, например файлът YYBootingProtection.o с пореден номер 1, + метод [YYBootingProtection isRepaired] в __TEXT Адресът на текстовия .__ е 0x100004FE0, а заетият размер е 36 байта. Натрупайте заетия размер на всеки obj файл във всеки сегмент според серийния номер, като по този начин изчислявате заетия размер на всеки obj файл в изпълнимия файл и след това изчислявайте заетия размер на всяка статична библиотека и всеки код на функционалния модул. Смисълът тук е, че тъй като __DATA .__ bbs е неинициализирана статична променлива, Size представлява размерът на купчината, зает от приложението по време на изпълнение, и не заема изпълнимия файл, така че когато изчислявате размера, зает от obj, трябва да изключите размера на този сегмент

Безполезни методи за откриване на идеи
В миналото, когато C ++ беше свързан, класовете и методите, които не бяха използвани, не бяха компилирани в изпълнимия файл. Но Objctive-C е различен. Поради своята динамична природа той може да получи този клас и метод за извикване чрез името на класа и името на метода, така че компилаторът ще компилира всички OC изходни файлове в проекта в изпълнимия файл, дори ако класът и методът не се използват.
комбиниран с __TEXT .__ текст на файла LinkMap, чрез регулярния израз [+ | -] \ [\ w + \ w + \], можем да извлечем всички методи на клас objc и методи на екземпляра (SelectorsAll) в текущия изпълним файл. След това използвайте командата otool otool -v -s __DATA __objc_selrefs, за да обърнете раздела __DATA .__ objc_selrefs, извлечете името на метода (UsedSelectorsAll), посочено в изпълнимия файл, можем грубо да анализираме кои методи в SelectorsAll не са препратени (SelectorsAll-UsedSelectorsAll),
Скрипт за сканиране (py):

3. Безполезен

4. Други

избор на език:Swift не се препоръчва, независимо дали е чист Swift или смесен, всяко приложение, което съдържа Swift код, има динамична колекция от библиотеки, за да поддържа Swift, около 10M. Ако използвате Objective-C, изобщо не ви трябват тези неща