框架解析及底层iOS

下载objc4787.1源码并调试TestDemo项目

2020-12-03  本文已影响0人  iOS虞
  1. 找到苹果源码网址:https://opensource.apple.com/
QQ20201202-094028.png
  1. 找到objc4点击下载

    QQ20201202-094343.png
    3.下载一些依赖的文件
    QQ20201202-104952@2x.png
    其中除了launchd-842.92.1需要在Mac OSX 10.9.5中下载,其它均可在最新的里面下载到
  2. 下载解压打开objc.xcodeproj,编译一下发现报错
    错误一: unable to find sdk 'macosx.internal'

    QQ20201202-095408@2x.png
QQ20201202-095801@2x.png QQ20201202-100307@2x.png

解决:Build Settings中搜索macosx.internal,选择macOS

错误二:sys/reson.hfile not found

QQ20201202-101029@2x.png

解决:首先在objc4-787.1根目录下创建ZKCommon文件,同时在ZKCommon文件中创建sys文件,在事先下载的xnu-6153.141.1/bsd/sys/reason.h把reason.h拷贝到我们自己创建的ZKCommon/sys/

QQ20201202-110931@2x.png
选择target -> objc -> Build Settings找到Header Serach Paths 添加路径$(SRCROOT)/ZKCommon QQ20201202-111252@2x.png

错误三:mach-o/dyld_priv.hfile not found

QQ20201202-111849@2x.png

解决:在ZKCommon文件中创建mach-o文件 dyld-750.6/include/mach-o/dyld_priv.h拷贝到自己创建的ZKCommon/mach-o

QQ20201202-113333@2x.png
拷贝后还要修改dyld_priv.h文件顶部添加宏
#define DYLD_MACOSX_VERSION_10_11 0x000A0B00
#define DYLD_MACOSX_VERSION_10_12 0x000A0C00
#define DYLD_MACOSX_VERSION_10_13 0x000A0D00
#define DYLD_MACOSX_VERSION_10_14 0x000A0E00

错误四:os/lock_private.h file not found

QQ20201202-121249@2x.png

解决:在ZKCommon文件中创建os文件,libplatform-220.100.1/private/os/lock_private.h , libplatform-220.100.1/private/os/base_private.h 2个都拷贝到os文件中

QQ20201202-122302@2x.png

错误五:bridgeos(3.0), bridgeos(4.0)

QQ20201202-122717@2x.png
解决:在dyld_priv.h文件中搜索bridgeson(3.0)删除(可以用空格全部代替)
lock_private.h文件中搜索bridgeos(4.0)删除

错误六:pthread/tsd_private.h file not found
pthread/spinlock_private.h file not found

QQ20201202-123753@2x.png QQ20201202-145201@2x.png

解决:在ZKCommon文件中创建pthread文件,libpthread-416.100.3/private/tsd_private.h, libpthread-416.100.3/private/spinlock_private,h 2个文件都拷贝到pthread

QQ20201202-145615@2x.png

错误七:System/machine/cpu_capabilities.h file not found

QQ20201202-125129@2x.png
解决:在ZKCommon中创建System文件,再创建machine文件,xnu-6753.141.1/osfmk/machine/cpu_capabilities.h拷贝到创建的machine文件夹中 QQ20201202-144925@2x.png

错误八:os/tsd.h file not found

QQ20201202-144227@2x.png
解决:xnu-6153.141.1/libsyscall/os/tsd.h 复制到先前ZKCommon中创建的os文件中
QQ20201202-145016@2x.png

错误九:System/pthread_machdep.h file not found

QQ20201202-145757@2x.png

解决:https://opensource.apple.com/tarballs/Libc/ 下载Libc-583版本,Libc-583/pthreads/pthread_machdep.h文件拷贝到ZKCommon/System/

QQ20201202-152218@2x.png

错误十:CrashReporterClient.h file not found

QQ20201202-152755@2x.png QQ20201202-154717@2x.png

解决:https://opensource.apple.com/tarballs/Libc/ 下载Libc-825,24版本 Libc-825.24/include/CrashReporterClient.h 拷贝到ZKCommon/
如果还是报错需要Build Settings -> Preprocessor Macros 加入:LIBC_NO_LIBCRASHREPORTERCLIENT

QQ20201202-154033@2x.png

错误十一:kern/restartable.h file not found

QQ20201202-155122@2x.png

解决:在ZKCommon中创建kern文件,xnu-6153.141.1/osfmk/kern/restartable.h 拷贝到ZKCommon/kern/

QQ20201202-155702@2x.png

错误十二:_simple.h file not found

QQ20201202-160202@2x.png

解决:libplatform-220.100.1/private/_simple.h 拷贝到ZKCommon/

QQ20201202-160837@2x.png

错误十三:typedef int pthread_lock_t
inline static int _pthread_has_direct_tsd(void)
inline static void * _pthread_getspecific_direct(unsigned long slot)

QQ20201202-161711@2x.png

解决:注释掉报错的地方不要有漏掉地方

错误十四:mismatch in debug-ness macros

QQ20201202-162751@2x.png

解决:注释掉objc-runtime.mm中的#error mismatch in debug-ness macros即可

错误十五:objc-shared-cache.h file not found

QQ20201202-163155@2x.png

解决:将dyld-750.6/include/objc-shared-cache,h 拷贝到ZKCommon/

QQ20201202-163607@2x.png

错误十六:Block_prrivate.h file not found

QQ20201202-163833@2x.png

解决:libclosure-74/Block_private.h 拷贝到ZKCommon/

QQ20201202-164200@2x.png

错误十七:can't open order file: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.0.sdk/AppleInternal/OrderFiles/libobjc.order 路径问题

QQ20201202-164536@2x.png

解决:target -> objc -> Build Settings Order File添加搜索路径$(SRCROOT)/libobjc.order

错误十八:library not found for -lCrashReporterClient

QQ20201202-165956@2x.png

解决:TARGETS -> objc -> Build Settings 搜索Other Linker Flags找到lCrashReporterClient删除掉

QQ20201202-170543@2x.png

错误十九:objc-runtime-new.h

static_assert(bucketsMask >= MACH_VM_MAX_ADDRESS, "Bucket field doesn't have enough bits for arbitrary pointers.")
STATIC_ASSERT((~ISA_MASK & MACH_VM_MAX_ADDRESS) == 0  ||  
              ISA_MASK + sizeof(void*) == MACH_VM_MAX_ADDRESS);
QQ20201202-171042@2x.png QQ20201202-171619@2x.png

解决:断言错误,网上找了好久没有找到解决办法,最后只能注释掉了,查看以前老的版本没有发现这个错误,有知道解决办法的可以留言告诉我一下

错误二十:shell脚本问题

QQ20201202-172043@2x.png

解决:targets -> Build Phases -> Run Scriptmacosx.internal改成macosx

QQ20201202-172414@2x.png

到这里我把报错都解决了


QQ20201202-172714@2x.png

5.创建TestDemo

QQ20201203-095926.png QQ20201203-095543.png QQ20201203-100126.png

给TestDemo绑定依赖关系,TestDemo -> Build Phases -> Dependencies 添加objc

QQ20201203-100701@2x.png QQ20201203-100912@2x.png

给TestDemo添加库,TestDemo -> Build Phases -> Link Binary With Libraries添加libobjc.A.dylib

QQ20201203-101601@2x.png QQ20201203-101447@2x.png

6.开始调试了


QQ20201203-102155@2x.png

打印了Hello,World!,成功运行

QQ20201203-102356@2x.png

7.接下来就可以各种调试了,创建Person

QQ20201203-103331@2x.png

8.我们打断点调试发现断点无效


QQ20201203-104207.png

解决办法:TestDemo -> Build Phases -> Compile Sourcesmain.m拖到最上面

QQ20201203-104453.png QQ20201203-105014.png
  1. 结束,虽然解决办法是在网上搜的,但也算是自己重头到尾做了一遍。

参考:
https://www.jianshu.com/p/d2f589e3e1ef
https://www.jianshu.com/p/3db5d0bde015

上一篇下一篇

猜你喜欢

热点阅读