dynamic-code-injection
dynamic-code-injection
dynamic-code-injection
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
!<br />
// Dynamic Code Injection!<br />
// in iOS Applications!<br />
//!<br />
// Created by Paul Taykalo on 14-03-13.!<br />
//!<br />
#import !<br />
Dynamic Code Injection !
Dynamic Code Injection!<br />
А что это?!
Dynamic Code Injection!<br />
! !
Dynamic Code Injection!<br />
!<br />
Debugging!<br />
Hot fixes!<br />
Hacks!<br />
Tweaks!
Dynamic Code Injection!<br />
!<br />
J!
Как<br />
исправляются<br />
баги?*!
Как исправляются баги!
Как исправляются баги!
Как исправляются баги!
Как исправляются баги!
Как исправляются баги!
Как исправляются баги!
Как исправляются баги!
Как исправляются баги!
Как исправляются баги!
На что тратится<br />
время?!
На что тратится время?!<br />
Сборка!<br />
Компиляция!<br />
Ресурсы!<br />
Зависимости!
На что тратится время?!
На что тратится время?!<br />
Запуск!<br />
Воспроизведение !<br />
!<br />
Чаще всего -<br />
ручная работа!
Как воспроизвести<br />
ситуацию, в<br />
которой возникают<br />
ошибки?!
Как уменьшить<br />
время на<br />
воспроизведение<br />
ошибки?!
Code !<br />
Injection !
А ведь можно<br />
было просто …!
• Тесты!<br />
• Модульность!<br />
• Mock’и!<br />
• 1001 способ!
Code !<br />
Injection !
DCI Tools!<br />
DYCI!<br />
Injection !<br />
for X<strong>code</strong>!
DCI Tools!<br />
DYCI!<br />
Injection !<br />
for X<strong>code</strong>!
DCI Tools!<br />
Как это<br />
работает?!
Как это работает?!
Как это работает?!<br />
!
Как это работает?!<br />
!<br />
!
Как это работает?!<br />
!<br />
!<br />
!
Подмена!
Подмена!<br />
class_replaceMethod(!<br />
!originalClass, !<br />
!selector, !<br />
!injectedImplementation, !<br />
!types!<br />
);!
Подмена!<br />
ресурсов!
Инъекция!
Инъекция!
Инъекция!
Инъекция!<br />
FileSystem Watchers!<br />
!<br />
HTTP Server/Sockets!
Перекомпиляция!
Перекомпиляция!<br />
!
Перекомпиляция!<br />
!<br />
!
Перекомпиляция!<br />
!<br />
!<br />
!
Строка компиляции!
-x!<br />
objective-c!<br />
-arch!<br />
i386!<br />
-fmessage-length=0!<br />
-std=gnu99!<br />
-Wno-trigraphs!<br />
-fpascal-strings!<br />
-O0!<br />
-Wno-missing-field-initializers!<br />
-Wmissing-prototypes!<br />
-Wreturn-type!<br />
-Wno-implicit-atomic-properties!<br />
-Wno-receiver-is-weak!<br />
-Wformat!<br />
-Wno-missing-braces!<br />
-Wparentheses!<br />
-Wswitch!<br />
-Wno-unused-function!<br />
-Wno-unused-label!<br />
-Wno-unused-parameter!<br />
-Wunused-variable!<br />
-Wunused-value!<br />
-Wno-empty-body!<br />
-Wno-uninitialized!<br />
-Wno-unknown-pragmas!<br />
-Wno-shadow!<br />
-Wno-four-char-constants!<br />
-Wno-conversion!<br />
-Wno-constant-conversion!<br />
-Wno-int-conversion!<br />
-Wno-enum-conversion!<br />
-Wno-shorten-64-to-32!<br />
-Wpointer-sign!<br />
-Wno-newline-eof!<br />
-Wno-selector!<br />
-Wno-strict-selector-match!<br />
-Wno-undeclared-selector!<br />
-Wno-deprecated-implementations!<br />
-DDEBUG=1!<br />
-DSIDEBUG=1!<br />
-DTTMAXLOGLEVEL=5!<br />
-isysroot!<br />
/Applications/X<strong>code</strong>.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk!<br />
-fexceptions!<br />
-fasm-blocks!<br />
-fstrict-aliasing!<br />
-Wprotocol!<br />
-Wdeprecated-declarations!<br />
-g!<br />
-Wno-sign-conversion!<br />
-fobjc-abi-version=2!<br />
-fobjc-legacy-dispatch!<br />
-mios-simulator-version-min=3.0!<br />
-iquote!<br />
/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/FHR-generated-files.hmap!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/FHR-own-target-headers.hmap!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/FHR-all-target-headers.hmap!<br />
-iquote!<br />
/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/FHR-project-headers.hmap!<br />
-iquote/Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Libs/Three20/src/Three20UI/** /Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Libs/Three20/src/Three20Style!<br />
-iquoteLibs/core/Libs/Three20/src/Three20Style!<br />
-iquoteLibs/core/Libs/Three20/src/Three20Style/Configurations!<br />
-iquoteLibs/core/Libs/Three20/src/Three20Style/Headers!<br />
-iquoteLibs/core/Libs/Three20/src/Three20Style/Sources!<br />
-iquoteLibs/core/Libs/Three20/src/Three20Style/UnitTests!<br />
-iquoteLibs/core/Libs/Three20/src/Three20Style/UnitTests/Resources!<br />
-iquoteLibs/core/Libs/Three20/src/Three20Style/UnitTests/Resources/PropertyLists!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator/include!<br />
-I/Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Libs/socials-library/build/Products/socials!<br />
-I/Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Libs/cookbook-library/build/Products/cookbook!<br />
-I/Applications/X<strong>code</strong>.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk/usr/include/libxml2!<br />
-I/Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Libs/Three20/Build/Products/three20!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Products/socials!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Products/cookbook!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/three20!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/../three20!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/../IntermediateBuildFilesPath/Products/cookbook!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/../IntermediateBuildFilesPath/Products/socials!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator/../../Headers/socials!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator/../../Headers/cookbook!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator/../Headers/socials!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator/../Headers/cookbook!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/DerivedSources/i386!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/DerivedSources!<br />
-F/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator!<br />
-include!<br />
/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/PrecompiledHeaders/MobileNews-Prefix-aiinsfqqjeowvmdibiqscpcwsbet/MobileNews-Prefix.pch!<br />
-MMD!<br />
-MT!<br />
dependencies!<br />
-MF!<br />
/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/Objects-normal/i386/MN2HTMLNavigationContent.d!<br />
--serialize-diagnostics!<br />
/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/Objects-normal/i386/MN2HTMLNavigationContent.dia!<br />
-c!<br />
/Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Classes/v2/config/view/html/MN2HTMLNavigationContent.m!<br />
-o!<br />
/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/Objects-normal/i386/MN2HTMLNavigationContent.o!<br />
/Users/paultaykalo/Projects/_OLD/FHR/MobileNews!<br />
Строка компиляции!
-x!<br />
objective-c!<br />
-arch!<br />
i386!<br />
-fmessage-length=0!<br />
-std=gnu99!<br />
-Wno-trigraphs!<br />
-fpascal-strings!<br />
-O0!<br />
-Wno-missing-field-initializers!<br />
-Wmissing-prototypes!<br />
-Wreturn-type!<br />
-Wno-implicit-atomic-properties!<br />
-Wno-receiver-is-weak!<br />
-Wformat!<br />
-Wno-missing-braces!<br />
-Wparentheses!<br />
-Wswitch!<br />
-Wno-unused-function!<br />
-Wno-unused-label!<br />
-Wno-unused-parameter!<br />
-Wunused-variable!<br />
-Wunused-value!<br />
-Wno-empty-body!<br />
-Wno-uninitialized!<br />
-Wno-unknown-pragmas!<br />
-Wno-shadow!<br />
-Wno-four-char-constants!<br />
-Wno-conversion!<br />
-Wno-constant-conversion!<br />
-Wno-int-conversion!<br />
-Wno-enum-conversion!<br />
-Wno-shorten-64-to-32!<br />
-Wpointer-sign!<br />
-Wno-newline-eof!<br />
-Wno-selector!<br />
-Wno-strict-selector-match!<br />
-Wno-undeclared-selector!<br />
-Wno-deprecated-implementations!<br />
-DDEBUG=1!<br />
-DSIDEBUG=1!<br />
-DTTMAXLOGLEVEL=5!<br />
-isysroot!<br />
/Applications/X<strong>code</strong>.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk!<br />
-fexceptions!<br />
-fasm-blocks!<br />
-fstrict-aliasing!<br />
-Wprotocol!<br />
-Wdeprecated-declarations!<br />
-g!<br />
-Wno-sign-conversion!<br />
-fobjc-abi-version=2!<br />
-fobjc-legacy-dispatch!<br />
-mios-simulator-version-min=3.0!<br />
-iquote!<br />
/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/FHR-generated-files.hmap!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/FHR-own-target-headers.hmap!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/FHR-all-target-headers.hmap!<br />
-iquote!<br />
/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/FHR-project-headers.hmap!<br />
-iquote/Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Libs/Three20/src/Three20UI/** /Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Libs/Three20/src/Three20Style!<br />
-iquoteLibs/core/Libs/Three20/src/Three20Style!<br />
-iquoteLibs/core/Libs/Three20/src/Three20Style/Configurations!<br />
-iquoteLibs/core/Libs/Three20/src/Three20Style/Headers!<br />
-iquoteLibs/core/Libs/Three20/src/Three20Style/Sources!<br />
-iquoteLibs/core/Libs/Three20/src/Three20Style/UnitTests!<br />
-iquoteLibs/core/Libs/Three20/src/Three20Style/UnitTests/Resources!<br />
-iquoteLibs/core/Libs/Three20/src/Three20Style/UnitTests/Resources/PropertyLists!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator/include!<br />
-I/Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Libs/socials-library/build/Products/socials!<br />
-I/Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Libs/cookbook-library/build/Products/cookbook!<br />
-I/Applications/X<strong>code</strong>.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk/usr/include/libxml2!<br />
-I/Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Libs/Three20/Build/Products/three20!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Products/socials!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Products/cookbook!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/three20!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/../three20!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/../IntermediateBuildFilesPath/Products/cookbook!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/../IntermediateBuildFilesPath/Products/socials!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator/../../Headers/socials!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator/../../Headers/cookbook!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator/../Headers/socials!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator/../Headers/cookbook!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/DerivedSources/i386!<br />
-I/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/DerivedSources!<br />
-F/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Products/Debug-iphonesimulator!<br />
-include!<br />
/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/PrecompiledHeaders/MobileNews-Prefix-aiinsfqqjeowvmdibiqscpcwsbet/MobileNews-Prefix.pch!<br />
-MMD!<br />
-MT!<br />
dependencies!<br />
-MF!<br />
/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/Objects-normal/i386/MN2HTMLNavigationContent.d!<br />
--serialize-diagnostics!<br />
/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/Objects-normal/i386/MN2HTMLNavigationContent.dia!<br />
-c!<br />
/Users/paultaykalo/Projects/_OLD/FHR/MobileNews/Libs/core/Classes/v2/config/view/html/MN2HTMLNavigationContent.m!<br />
-o!<br />
/Users/paultaykalo/Library/Developer/X<strong>code</strong>/DerivedData/FHR-gsnowpqwtpcjfkgrubnvlwotkpov/Build/Intermediates/MobileNews.build/Debug-iphonesimulator/MobileNews.build/Objects-normal/i386/MN2HTMLNavigationContent.o!<br />
/Users/paultaykalo/Projects/_OLD/FHR/MobileNews!<br />
Строка компиляции!<br />
~100 строк!<br />
~7 Kb!
Перекомпиляция в DYCI!<br />
!
Перекомпиляция в DYCI!<br />
!<br />
!
Перекомпиляция в DYCI!<br />
!<br />
!
Перекомпиляция в DYCI!<br />
!<br />
!<br />
!
Перекомпиляция в DYCI!<br />
!<br />
! !<br />
!
Инъекция в DYCI!
Инъекция в DYCI!
Инъекция в DYCI!
Инъекция в DYCI!
Инъекция в DYCI!<br />
!
Инъекция в DYCI!<br />
!
Инъекция в DYCI!<br />
!
Подмена в DYCI!
Подмена в DYCI!<br />
class_replaceMethod(!<br />
!originalClass, !<br />
!selector, !<br />
!injectedImplementation, !<br />
!types!<br />
);!
Profit!!
“Example”!
- (void)updateOnClassInjection {!<br />
[self setBackgroundColor:!<br />
[UIColor redColor]!<br />
];!<br />
}!
^X!<br />
- (void)updateOnClassInjection {!<br />
[self setBackgroundColor:!<br />
[UIColor redColor]!<br />
];!<br />
}!
^X!<br />
- (void)updateOnClassInjection {!<br />
[self setBackgroundColor:!<br />
[UIColor redColor]!<br />
];!<br />
}!
На практике чаще всего!<br />
Работа с UI!<br />
цвета, шрифты, тени, !<br />
сложный layout, !<br />
сложная анимация!
На практике реже!<br />
XIB UI!<br />
Мелкий тюнинг!<br />
Поиск причин ошибок!<br />
Logging OFF / Logging ON!
На практике время от времени!<br />
Работа с UI : !<br />
цвета, шрифты, тени,<br />
сложный layout, сложная<br />
анимация!
На практике!
Ресурсы!
UIImage Cache!<br />
NSBundle Cache!
Update On !<br />
Class/Resource!<br />
Injection!
!<br />
!
dyci<br />
Видео :)<br />
http://www.youtube.com/watch?<br />
v=8nyEpAqUug4
Спасибо за<br />
внимание!<br />
Павел Тайкало!<br />
Компания : Stanfy!<br />
ptaykalo@stanfy.com.ua !
Dynamic Code Injection<br />
Павел Тайкало!<br />
Компания : Stanfy!<br />
ptaykalo@stanfy.com.ua !