首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在不公开所有符号的情况下为iOS创建静态库

基础概念

静态库(Static Library)是一种包含可重用代码的文件格式,通常用于iOS开发中。它包含了编译后的目标文件(.o文件),可以在编译时链接到应用程序中。静态库的优点是可以减少应用程序的体积,因为代码被直接嵌入到应用程序中。

相关优势

  1. 减少应用体积:静态库中的代码被直接嵌入到应用程序中,不需要额外的运行时库。
  2. 简化部署:不需要担心运行时库的兼容性问题,因为所有需要的代码都在应用程序中。
  3. 提高性能:由于代码被直接嵌入到应用程序中,运行时不需要动态加载库,可以提高性能。

类型

  • 框架(Framework):一种特殊的静态库,包含资源文件和头文件,结构类似于应用程序包。
  • 普通静态库:只包含编译后的目标文件。

应用场景

  • 代码复用:将常用的功能封装成静态库,可以在多个项目中复用。
  • 模块化开发:将应用程序拆分成多个模块,每个模块可以单独开发和测试。

创建不公开所有符号的静态库

在不公开所有符号的情况下创建静态库,可以通过以下步骤实现:

  1. 创建静态库项目
    • 打开Xcode,选择创建一个新的Cocoa Touch Static Library项目。
  • 配置编译选项
    • 在项目的Build Settings中,找到Other Linker Flags,添加-ObjC-all_load选项。
    • 找到Enable Bitcode,将其设置为NO
  • 编写代码
    • 编写你想要封装的代码,并将其放在静态库项目中。
  • 隐藏符号
    • 在项目的Build Settings中,找到Symbols Hidden by Default,将其设置为YES
    • 使用__attribute__((visibility("hidden")))属性来隐藏特定的符号。例如:
    • 使用__attribute__((visibility("hidden")))属性来隐藏特定的符号。例如:
  • 构建静态库
    • 选择Product -> Build,构建静态库。
  • 使用静态库
    • 将生成的静态库文件(.a文件)和头文件添加到你的应用程序项目中。
    • 在应用程序项目的Build Settings中,找到Library Search Paths,添加静态库的路径。
    • 在应用程序项目的Build Phases中,添加静态库文件到Link Binary With Libraries

示例代码

假设你有一个简单的静态库项目,包含一个隐藏的函数:

代码语言:txt
复制
// MyLibrary.h
#import <Foundation/Foundation.h>

@interface MyLibrary : NSObject
+ (void)publicFunction;
@end

// MyLibrary.m
#import "MyLibrary.h"

__attribute__((visibility("hidden")))
void hiddenFunction() {
    NSLog(@"This function is hidden");
}

@implementation MyLibrary
+ (void)publicFunction {
    NSLog(@"This is a public function");
    hiddenFunction();
}
@end

参考链接

通过以上步骤,你可以创建一个不公开所有符号的静态库,并在你的iOS应用程序中使用它。

相关搜索:如何在不触及每个JSP文件的情况下为所有JSP设置pageEncoding?如何在不丢失列名的情况下为row_to_json的输入创建行?如何在不指定列名的情况下为任何查询动态创建下拉菜单Laravel -如何在没有数据库的情况下为API创建身份验证如何在不更改tomcat-users.xml的情况下为静态tomcat webapps提供基本的http身份验证?如何在不创建新的单独文件的情况下为页面的链接添加密码保护?如何在不为iphone和ipad创建单独的xib的情况下为所有ipad和iphone创建通用的xib?不是故事板Typescript :如何在不传递所有属性的情况下创建类型化对象如何在不声明所有参数的情况下在mySQL中创建存储过程?Scala -如何在不包装所有方法的情况下创建包装器类如何在不使用所有子节点中的XNamespace的情况下为子节点创建具有默认命名空间的XElement如何在不命名列的情况下,在所有其他列的函数中创建新列如何在不丢弃数据库本身的情况下删除数据库中的所有表?如何在不创建新环境的情况下使用yml文件安装python库列表如何在不更改源文件的情况下重新生成exe时自动链接新的静态库?如何在不访问存储库的情况下创建生成定义(在visual studio online中)如何在不创建文件的情况下通过外部库获取写入ostream的原始字节如何在mySql中不指定数据库名称的情况下获取当前数据库的所有列如何在不指定名称的情况下创建一个通用shell来运行所有C程序如何在不指定ID的情况下创建Loopback4模型、存储库和控制器
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

大型IM稳定性监测实践:手Q客户端性能防劣化系统建设之路

大概运行机制如下:此方案优点:1)性能测试和性能报告创建审批左移到开发阶段;2)覆盖场景可拓展:测试用例云端独立管理派发;3)性能维度可拓展:支持 Instruments 所有模板;4)静态检查可拓展...[2] 原生符号扫描:原生符号扫描工具,帮助扫描工程所有依赖中存在重复库函数(符号) (主要关注 C 符号重复问题)。...这些实用方法库通常是广泛使用基础实用 FishHook、zip、libffi 等。...若有多个业务静态都集成了同源基础实用,在链接 (ld) 生成可执行程序时,链接器会选择其中一份链接 (取决于链接先后顺序等因素,可以通过 LinkMap 确认选用实现),它们虽然具有相同符号...工具工作流程是解析链接 (ld) 参数,遍历每一个参与链接静态,使用 nm 工具等工具读取它们包含对外导出 (External & Defined) 符号

9810

iOS 静态详解与开发

导入头文件 导入UIKit头文件,这是创建一个所需要。当你在创建不同组成类时,你将会为它们添加到这个文件中,确保它们能够被使用者获取到。...33.png 如果结合头文件,静态是没有用静态编译一组文件,在这些文件中类和方法都以二进制数据形式存在。 在静态中类分为两类,一类是公开public,一类是私有的只能内部访问使用。...接下来,需要在build栏中添加新phase,来包含所有头文件。...55.png 把FBYSDKDemo.h从项目中拖到Copy Headers下Public部分。 这里是要保证用户可以使用公开类或者接口。 ?...77.png 因为你创建静态文件供他人使用,最好禁掉无效代码和debug符号,让用户自己选择对自己项目有利部分使用。

73020
  • .NET周刊【12月第1期 2023-12-06】

    文章首先指出了之前方案不足,如不同平台 URL 统一、音视频文件无法播放、Windows 上大文件显示限制和 iOS/Mac 跨域问题。...通过数字和特殊字符定义执行时间,"*"代表所有值,"-"定义范围。...其次,要启用源代码单步执行,包括取消选择"启用仅我代码",选择"启用源链接支持",并在"符号"下选择"Microsoft 符号服务器"。配置后,首次启动应用时会有符号加载时间。...如何在实际设备(例如 iPhone)上从仅在 Windows 上 Visual Studio 调试和执行 .NET MAUI iOS 应用程序。...-jsinterop 了解如何在 .NET 8 中将静态服务器渲染 (SSR) 与 Blazor 结合使用时实现和运行自定义 JavaScript。

    25810

    Crash之防测漏篇

    1 APP闪退背后秘密 以下画面相信负责过APP项目一定见过,它是怎么出现呢? ? 以下为基于Android源码分析完整代码调用关系: ?...日志信息中,比较关键信是错误类型。这里带大家了解一下目前移动端关于异常整体分类情况。 对Android来说主要有以下几种: ? iOS下crash大致可如下划分: ?...如图,栈信息及代码行可以很容易定位到出问题子模块,排查起来难度不大。 ? 比较复杂问题可能集中在crash栈都是系统信息或者第三方,或者多个模块存在耦合代码,排查起来难度比较大。...以下是crash跟进总结过程中一些可深入点,: 1 体验类问题 体验类问题,保证异常后恢复无明显异常: ?...调试之 crash log分析 http://www.jianshu.com/p/12a2402b29c2 12、 分析iOS Crash文件:符号iOS Crash文件3种方法 http://www.cocoachina.com

    1.4K81

    【腾讯TMQ】Crash 之防测漏篇

    日志信息中,比较关键信是错误类型。这里带大家了解一下目前移动端关于异常整体分类情况。...如图,栈信息及代码行可以很容易定位到出问题子模块,排查起来难度不大。 比较复杂问题可能集中在crash栈都是系统信息或者第三方,或者多个模块存在耦合代码,排查起来难度比较大。...以下是crash跟进总结过程中一些可深入点,: 1.体验类问题 体验类问题,保证异常后恢复无明显异常: 2.代码质量提升 crash分析总结中,可以把常见坑,提取成静态扫描规则加入到代码扫描中...://woshijpf.github.io/2016/06/14/Android-NDK-Tombstone-Crash-分析/ 8、 分析iOS Crash文件:符号iOS Crash文件3种方法...调试之 crash log分析 http://www.jianshu.com/p/12a2402b29c2 12、 分析iOS Crash文件:符号iOS Crash文件3种方法 http://www.cocoachina.com

    2K00

    iOS开发静态SDK指南: 搭建一个提高开发效率静态工程、混淆带有bitcode sectname 静态

    文章目录 引言 I、搭建一个提高开发效率静态工程 II、采用 `pod lib` 开发并打包静态 III、iOS逆向与安全相关知识 3.1 iOS安全【Confusing static libraries...with Bitcode Sectname】 3.2 iOS逆向【动态注入原理】 IV、制作静态注意点 4.1 静态中包含了Category注意事项 4.2 合并真机和模拟器.a文件...根据源代码公开情况可以分为2种类型:1、开源公开源代码,能看到具体实现,比如SDWebImage、AFNetworking);2、闭源(不公开源代码,是经过编译后二进制文件,看不到具体实现...with Bitcode Sectname】 iOS安全:【混淆带有bitcode sectname 静态】 【代码混淆】1、基于编译器混淆静态(StaticLib)2、字符串加密:使用clang-c...可以直接使用 多文件处理:如果静态需要暴露出来 .h 比较多,可以考虑创建一个主头文件(一般 主头文件 和 静态 同名)在主头文件中包含所有其他需要暴露出来 .h 文件,使用静态时,只需要#import

    96320

    iOS Class Guard github用法、工作原理和安装详解及使用经验总结

    在编译期间内,所有定义在头文件内symbol都会用对应生成不同符号替换并编译。iOS-Class-Guard也提供了对cocoapod混淆。...注意 iOS-Class-Guard混淆system symbol,所有如果在自定义类中某些属性和方法与system symbol有相同名字,则不会被混淆。...输出头文件路径,使用 -O参数, -O SWTableView/symbols.hclass过滤ios-class-guard能够过滤出 希望混淆类。...比如,预编译静态iOS编码风格假定每个类都使用2-3个字符前缀,可以利用这一点过滤进 或者 过滤出整个命名空间。举例,过滤出所有APH MC命名空间 -F '!APH*' -F '!...使用--dsym参数,iOS Class Guard会替换提供dSYM文件内符号和混淆符号

    31010

    iOS15 安全漏洞分析:价值10万美元漏洞曝光

    设备使用信息(不同情况设备取货、推送通知计数和用户操作等) 所有具有各自 bundle ID 应用程序屏幕使用时间信息和会话计数 有关设备配件及其制造商、型号、固件版本和用户分配名称信息 应用程序崩溃时带有...),以及一些附件(URL和文本)) 完整文件系统读取对 Speed Dial 数据和 Address Book(通讯录) 数据访问,包括联系人头像和其他元数据,创建和修改日期(我刚刚在 iOS...作者在公开漏洞源代码中,示例了动态调用苹果认为是私人 API 一部分 C 函数,以免被静态分析检测到。...) (OpaquePointer, @escaping (OpaquePointer) -> Void) -> Void).self) 其中 dlopen 和 dlsym 系统库函数,它们允许加载动态并解析其中符号...因为每个 iOS 二进制文件都会有一个名为 dyld_stub_binder 符号,它是从与 dlopen 和 dlsym 相同中导入

    1.3K20

    Android开发快速入门iOS开发(概览)

    ) 静态与动态区别主要在于在打包链接时操作不一样; 4.3.1 静态 静态在打包生成可执行目标文件时,会把汇编生成目标文件.o与引用一起链接打包到目标文件中,静态特点: 在编译期完成对函数链接...运行时与函数不再有关,可独立运行; 会比较占用空间(如果有函数被多个静态依赖,则这个函数库里会有多份拷贝) 更新麻烦,如果静态A更新了,则所有依赖静态A都需要重新编译,更新; 加载速度较动态快...4.3.2 动态 动态静态类似,只是在打包时不用把所链接文件全部拷贝进目标文件中,只是拷贝一些重定位和符号信息,这些信息在运行时可完成真正链接,动态特点: 在运行时完成对函数链接(...不同应用程序调用相同,在内存里只需要有一份该实例); 运行时与函数有关,需要依赖对应函数才可运行; 会比较省空间(只需要拷贝少量符号与链接信息) 更新简单,只需要更新对应动态就可以了...在创建一个Helloword Demo时可直接利用Xcode创建项目的选项,一步步按照操作进行就可以了;虽然iOS也可以在.storyboard文件里进行界面的编写,但绝大部分时候都是需要使用代码来创建界面的

    1K20

    iOS Human Interface Guidelines》——Table View表视图

    NOTE 所有四个标准表单元格风格都允许额外表视图元素,比如勾选符号和扩展指示器。添加这些元素会减少标题和子标题可使用单元格宽度。 清晰而有效地使用表视图来显示大量或少量信息。...查看UITableViewHeaderFooterView Class Reference来学习如何在代码中使用页眉页脚视图。...用户期待当他们点击列表条目时表中行能简短地高亮一下。在点击之后,用户期待一个新视图出现(或者行显示一个勾选符号)来表示条目被选中了。 如果表内容是冗长或复杂,不要等到所有数据都获取之后再显示。...即使这个技术推荐用户那些频繁处理数据变更app,它仍然可以帮助更多静态app立即给用户一些静态信息。当你决定这样做之前,计量数据改变有多频繁以及有多少用户依赖于快速看到新数据。...如果数据加载很慢或很复杂,告诉用户处理仍在继续。如果一个表只包含复杂数据,也许很难立即显示有用数据。在这种情况下,避免显示空行很重要,因为空行表示你app停止了。

    2.4K20

    iOS客户端启动速度优化实践

    动态链接包括:iOS 中用到所有系统 framework,加载OC runtime方法libobjc,系统级别的libSystem,例如libdispatch(GCD)和libsystem_blocks...dylib 动态链接 framework就是动态链接和相应资源包含在一起一个文件夹结构。 bundle 资源文件 只能用dlopen加载,推荐使用这种方式加载。...所有动态链接和我们App中静态.a和所有类文件编译后.o文件最终都是由dyld(the dynamic link editor),Apple动态链接器来加载到内存中。...C++静态全局变量创建(通常是类或结构体)(non-trivial initializer) 比如一个全局静态结构体构建,如果在构造函数中有繁重工作,那么会拖慢启动速度 Objcload函数和C...pods中代码,包含主端业务逻辑代码,一次典型冷启动基本接近2s iPhone6 iOS9.3.5系统测试主要时间在加载动态,类/方法初始化还有符号地址绑定阶段。

    1.8K10

    咋设计SDK?看这个基础教程攻略!

    我们会根据调用方法分为“静态”和“动态”两种: 静态连接:一般是指在创建应用程序时候,将集成进去,这样做好处就是应用程序包自身可以独立运行,而不好地方就是包会略显臃肿,不能共享(静态经常以....a 结尾); 动态连接:创建应用时候只约定好与之间调用关系,而彻底将包集成进应用。...优劣与静态相反,动态链接需要环境,但由于本身集成库内容,会比较小,同时也为和其他应用共享使用提供了可能(常见动态是 Windows 下 .dll,Linux 下 .so,Mac 下...,所以如果两个程序都用了某个静态,那么每个二进制可执行文件里面,都会含有这份静态代码; 动态:链接时不复制,而是在程序启动后动态加载,然后再进行符号决议(符号绑定)。...了解 iOS 动态(即被阉割动态) 有一个背景知识需要注意,iOS 官方规定不允许存在动态,并且所有的 IPA 都需要经过 Apple 私钥加密后才能用,即使你用了动态也会因为签名错误而无法加载

    96350

    CMake简易指南

    :描述本地处理器类型为了跨平台差分使用方便,一般会在一个地方检测当前需要编译平台变量,:# 检测当前编译平台# iOS没有官方工具链,三方工具链部分设置名称为iOS,部分为IOS,此处统一改成小写...链接选项有CMAKE_STATIC_LINKER_FLAGS / CMAKE_SHARED_LINKER_FLAGS / CMAKE_EXE_LINKER_FLAGS分别指静态、动态、可执行文件链接选项...PRIVATE-隐式依赖:表示仅当前目标生效,依赖目标生效。INTERFACE:用于INTERFACE类型目标(:导入库,空),依赖目标生效,继承方式等同PUBLIC。..._ 开头属性设置均适用该继承方式,一般来说,INTERFACE使用情况较少,通常用于符号导出等特殊场景。...几乎包含交叉编译中涉及所有改动,iOS 由于没有 Apple 没有提供官方支持,仅有开源项目 ios-cmake 可用,下文为 Linux 下 ARM 编译工具链样例:# 指定目标系统名称,指定时取

    81050

    iOS静态SDK开发指南

    根据源代码公开情况可以分为2种类型: 1、开源公开源代码,能看到具体实现,比如SDWebImage、AFNetworking);2、闭源(不公开源代码,是经过编译后二进制文件,看不到具体实现...本身已经包含了 .h 和 其它资源文件,可以直接使用 多文件处理:如果静态需要暴露出来 .h 比较多,可以考虑创建一个主头文件(一般 主头文件 和 静态 同名)在主头文件中包含所有其他需要暴露出来...https://kunnan.blog.csdn.net/article/details/73872024 III、采用 pod lib 开发并打包静态 比我之前自己搭建模板更方便,可利用iOS CocoaPods...with Bitcode Sectname】 iOS安全:【混淆带有bitcode sectname 静态】 不需要源代码就可以进行混淆https://blog.csdn.net/z929118967.../article/details/76671425 4.2 iOS逆向【动态注入原理】 (基于修改Mach-O Load Command、利用环境变量DYLD_INSERT_LIBRARIES、在挂载进程上创建一个挂起线程

    1.1K50

    如何设计编写一个 SDK

    我们会根据调用方法分为“静态”和“动态”两种: 静态连接:一般是指在创建应用程序时候,将集成进去,这样做好处就是应用程序包自身可以独立运行,而不好地方就是包会略显臃肿,不能共享(静态经常以....a 结尾); 动态连接:创建应用时候只约定好与之间调用关系,而彻底将包集成进应用。...优劣与静态相反,动态链接需要环境,但由于本身集成库内容,会比较小,同时也为和其他应用共享使用提供了可能(常见动态是 Windows 下 .dll,Linux 下 .so,Mac 下...,所以如果两个程序都用了某个静态,那么每个二进制可执行文件里面,都会含有这份静态代码; 动态:链接时不复制,而是在程序启动后动态加载,然后再进行符号决议(符号绑定)。...了解 iOS 动态(即被阉割动态) 有一个背景知识需要注意,iOS 官方规定不允许存在动态,并且所有的 IPA 都需要经过 Apple 私钥加密后才能用,即使你用了动态也会因为签名错误而无法加载

    1.3K50

    静态拦截iOS对象方法调用简易实现

    最近出现了几篇关于二进制重排启动优化文章。所有方案中都需要事先统计所有的函数调用情况,并根据函数调用频次来进行代码重排。 这些函数调用中,OC对象方法调用最多。...因为静态其实只是一个编译阶段中间产物,静态目标文件中所有引用外部符号会保存到一张字符串表中,所有函数调用都只是记录了函数名称在字符串表索引位置,在链接时会才会根据符号名称来替换为真实函数调用指令...实现静态符号替换Run Script脚本。 这是最为关键一步,我们可以实现一个符号替换程序,然后在Run Script脚本中 执行这个符号替换程序。...符号替换程序输入参数就是主工程中所链接所有静态路径。至于这个符号替换程序如何编写则没有限制,你可以用ruby编写也可以用python也可以用C语言编写。...无论用何种方法实现,你都需要首先了解一下静态.a文件结构。你可以从:《深入iOS系统底层之静态》一文中掌握到一个静态文件组成结构。

    1.8K30

    QQ 客户端性能稳定性防劣化系统 Hodor 技术方案

    原生符号扫描: 原生符号扫描工具,帮助扫描工程所有依赖中存在重复库函数(符号) (主要关注 C 符号重复问题)。...这些实用方法库通常是广泛使用基础实用 FishHook、zip、libffi 等。...若有多个业务静态都集成了同源基础实用,在链接 (ld) 生成可执行程序时,链接器会选择其中一份链接 (取决于链接先后顺序等因素,可以通过 LinkMap 确认选用实现),它们虽然具有相同符号...通过原生符号扫描工具,扫描出重复库函数,有助于标识出上述这样"存在多份重复选其一兼容"潜在风险。...工具工作流程是解析链接 (ld) 参数,遍历每一个参与链接静态,使用 nm 工具等工具读取它们包含对外导出 (External & Defined) 符号

    71612

    GN语言和操作

    或.so只能在运行时加载source_set个轻量级虚拟静态(通常比真正静态更可取,因为它构建速度会更快)static_library.lib或.a文件(通常你会想要一个source_set)...component源集或共享,取决于构建类型test测试可执行文件 在移动设备上,这将为测试创建适当本机应用程序类型app可执行文件或Mac / iOS应用程序android_apk制作一个APK。...您希望这些设置既适用于第三方本身编译,也适用于使用该所有目标。...您.gni文件可以定义导出到文件临时变量,通过使用名称中前面的下划线来包含它,就像_this。 2. 路径处理 通常情况下,您需要创建一个文件名或相对于不同目录文件名列表。...gn与Blaze区别和相似之处 Blaze是Google内部构建系统,现在已经作为Bazel公开发布。它启发了一些其他系统,Pants和Buck。

    1.6K10

    保姆级教程:写出自己移动应用和小程序(篇二)

    我们会根据调用方法分为“静态”和“动态”两种: 静态连接:一般是指在创建应用程序时候,将集成进去,这样做好处就是应用程序包自身可以独立运行,而不好地方就是包会略显臃肿,不能共享(静态经常以....a 结尾); 动态连接:创建应用时候只约定好与之间调用关系,而彻底将包集成进应用。...优劣与静态相反,动态链接需要环境,但由于本身集成库内容,会比较小,同时也为和其他应用共享使用提供了可能(常见动态是 Windows 下 .dll,Linux 下 .so,Mac 下...,所以如果两个程序都用了某个静态,那么每个二进制可执行文件里面,都会含有这份静态代码; 动态:链接时不复制,而是在程序启动后动态加载,然后再进行符号决议(符号绑定) 。...了解 iOS 动态(即被阉割动态) 有一个背景知识需要注意,iOS 官方规定不允许存在动态,并且所有的 IPA 都需要经过 Apple 私钥加密后才能用,即使你用了动态也会因为签名错误而无法加载

    71600

    Linux共享静态、动态详解

    介绍 使用GNU工具我们如何在Linux下创建自己程序函数?...这个选项在创建ELF格式文件时候,会将所有符号加入到动态符号表中。可以参考ld帮助获得更详细说明。 3.5. 安装和使用共享函数 一旦你定义了一个共享函数,你还需要安装它。...ldconfig设置链接器名称; 通常这是在库安装期间完成,链接器名称简单地创建为“最新”soname或最新真实名称符号链接。...-Wl选项将选项传递给链接器(在这种情况下为-soname链接器选项) - -Wl之后逗号不是打字错误,并且您不能在选项中包含未转义空格。...此选项(创建ELF文件时)将所有符号添加到动态符号表(有关详细信息,请参阅ld(1))。

    8.9K11
    领券