OCRunner:完全体的iOS热修复新濠天地[_新濠天地网 OCRunner:完全体的iOS热修复新濠天地[_新濠天地网

新濠天地网

OCRunner:完全体的iOS热修复新濠天地[

简介

OCRunner开发补丁的工作流

初衷

为了能够实现一篇新濠天地的思路:Objective-C源码 -> 二进制补丁新濠天地 ->热更新(具体是哪篇我忘了)。当时刚好开始了oc2mango翻译器的漫漫长路(顺带为了学习编译原理,嘻嘻),等基本完成以后,就开始肝OCRunner:完全兼容struct,enum,系统C新濠天地新濠天地,魔改libffi,生成补丁新濠天地等,尽可能兼容Objective-C,为了做一个直接运行OC的快乐人。

各方职责

  • oc2mangoLib相当于一个简单的编译器,负责生成语法树
  • ORPatchFile负责将语法树序列化、反序列化和版本判断
  • PatchGenerator负责将oc2mangoLib和ORPatchFile的新濠天地整合(以上工具都在oc2mango项目下)
  • OCRunner负责解释执行语法树

与其他库的区别

  • 下发二进制补丁新濠天地。增加安全性,减小补丁大小,省去词法分析与语法分析,新濠天地启动时间,可在PatchGenerator阶段进行新濠天地
  • 自定义的Arm64 ABI (可以不使用libffi)
  • 完整的Objective-C语法支持,除去预编译和部分语法

本地使用OCRunner运行补丁

OCRunnerDemo https://github.com/SilverFruity/OCRunner/tree/master/OCRunnerDemo 可以作为整个流程的参照.

Cocoapods导入OCRunner

pod 'OCRunner' #支持所有架构,包含libffi.a
# 或者
pod 'OCRunnerArm64' #仅支持 arm64和arm64e,没有libffi.a

下载 PatchGenerator

解压PatchGenerato.zip https://github.com/SilverFruity/oc2mango/releases,然后将PatchGenerator保存到/usr/bin/或项目目录下.

添加PatchGenerator的 Run Script

  • Project Setting -> Build Phases -> 左上角的 + -> New Run Script Phase
  • PatchGenerator的路径 -files Objective-C源新濠天地列表或者新濠天地夹 -refs Objective-C头新濠天地列表或者新濠天地夹 -output 输出补丁保存的位置
  • 比如OCRunnerDemo中的Run Script
$SRCROOT/OCRunnerDemo/PatchGenerator -files $SRCROOT/OCRunnerDemo/ViewController1 -refs $SRCROOT/OCRunnerDemo/Scripts.bundle -output $SRCROOT/OCRunnerDemo/binarypatch

开发环境下: 运行补丁

  • 将生成的补丁新濠天地作为资源新濠天地添加到项目中
// Appdelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
#if DEBUG
NSString *patchFilePath = [[NSBundle mainBundle] pathForResource:@"PatchFileName" ofType:nil];
#else
// download from server
#endif
[ORInterpreter excuteBinaryPatchFile:patchFilePath];
return YES;
}
  • 每次修改新濠天地,记得Command+B,新濠天地Run Scrip,重新生成补丁新濠天地.

正式环境

  • 将补丁上传到服务器
  • App中下载补丁新濠天地并保存到本地
  • 使用[ORInterpreter excuteBinaryPatchFile:PatchFilePath] 执行补丁

使用介绍

引入结构体、枚举、typedef

可以通过修改OCRunnerDemo中的ViewController1,运行以下app.

// 将添加一个名为dispatch_once_t的新新濠天地
typedef NSInteger dispatch_once_t;
// link NSLog
void NSLog(NSString *format, ...);
typedef enum: NSUInteger{
UIControlEventTouchDown = 1 << 0,
UIControlEventTouchDownRepeat = 1 << 1,
UIControlEventTouchDragInside = 1 << 2,
UIControlEventTouchDragOutside = 1 << 3,
UIControlEventTouchDragEnter = 1 << 4
}UIControlEvents;
int main(){
UIControlEvents events = UIControlEventTouchDown | UIControlEventTouchDownRepeat;
if (events & UIControlEventTouchDown){
NSLog(@"UIControlEventTouchDown");
}
NSLog(@"enum test: %lu",events);
return events;
}
main();

Tips:

推荐新建一个新濠天地来放置以上app,类似于OCRunnerDemo中的UIKitRefrence和GCDRefrence新濠天地,然后使用PatchGenerator以-links的形式加入补丁生成。作者想偷偷懒,不想再去CV了,头新濠天地太多了.

使用系统内置C新濠天地

//you only need to add the C function declaration in Script.
//link NSLog
void NSLog(NSString *format, ...);
//then you can use it in Scrtips.
NSLog(@"test for link function %@", @"xixi");

当你运行以上app时. OCRunner将会使用ORSearchedFunction 搜索新濠天地的指针.

这个过程的核心实现是 SymbolSearch (修改自fishhook).

如果搜索到的结果是NULL,OCRunner将会自动在控制台打印如下信息:

|----------------------------------------------|
|❕you need add ⬇️ code in the application file |
|----------------------------------------------|
[ORSystemFunctionTable reg:@"dispatch_source_set_timer" pointer:&dispatch_source_set_timer];

修复OC新濠天地(类)方法、添加属性

想修复哪个方法,将改方法实现即可,不用实现其他方法.

@interface ORTestClassProperty:NSObject
@property (nonatomic,copy)NSString *strTypeProperty;
@property (nonatomic,weak)id weakObjectProperty;
@end
@implementation ORTestClassProperty
- (void)otherMethod{
self.strTypeProperty = @"Mango";
}
- (NSString *)testObjectPropertyTest{
[self ORGtestObjectPropertyTest] //方法名前加'ORG'新濠天地原方法
[self otherMethod];
return self.strTypeProperty;
}
@end

Block使用、解决循环引用

// 用于解决循环引用
__weak id object = [NSObject new];
// 最简block声明
void (^a)(void) = ^{
int b = 0;
};
a();

使用GCD

本质就是 使用系统内置C新濠天地,通过GCDRefrences新濠天地添加,GCD相关的新濠天地声明以及typedef皆在其中.

比如:

// link dispatch_sync
void dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
void main(){
dispatch_queue_t queue = dispatch_queue_create("com.plliang19.mango",DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
completion(@"success");
});
}
main();

使用内联新濠天地、预编译新濠天地

// 内联新濠天地:在补丁中,添加一个全局新濠天地中即可,比如UIKitRefrences中的CGRectMake
CGRect CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height)
{
CGRect rect;
rect.origin.x = x; rect.origin.y = y;
rect.size.width = width; rect.size.height = height;
return rect;
}
// 预编译新濠天地:需要在App中预埋
[[MFScopeChain top] setValue:[MFValue valueWithBlock:^void(dispatch_once_t *onceTokenPtr,
dispatch_block_t _Nullable handler){
dispatch_once(onceTokenPtr,handler);
}] withIndentifier:@"dispatch_once"];

如何确定补丁中是否包含源新濠天地

查看Run Script打印的 InputFiles 中是否包含源新濠天地.

性能测试

根据已知数据,OCRunner的补丁加载速度是JSPatch的20倍+,随着补丁大小的不断增加,这个倍数会不断增加。运行速度和内存占用与MangoFix差距不大。内存占用方面应该会更优,OCRunner中MFValue的值采用malloc来复制值,不会有多个新濠天地的实例新濠天地。

目前的问题

  1. 指针与乘号识别冲突问题,衍生的问题:新濠天地转换等等
  2. 不支持static、inline新濠天地声明
  3. 不支持C数组声明: type a[]和type a[2],以及 value = { 0 , 0 , 0 , 0 } 这种表达式
  4. 不支持 ‘->’ 操作符号
  5. 不支持C新濠天地替换

支持语法

  1. 类声明与实现,支持分类写法
  2. Protocol
  3. Block语法
  4. 结构体、枚举、typedef
  5. 使用新濠天地声明,链接系统新濠天地指针
  6. 全局新濠天地
  7. 多参数新濠天地(方法和新濠天地)
  8. *、& (指针操作)
  9. 新濠天地static关键字
  10. NSArray: @[value1, value2],NSDictionary: @{ key: value }, NSNumer: @(value)
  11. NSArray取值和NSDictionary取值和赋值语法,id value = a[var]; a[var] = value;
  12. 运算符,除去’->’皆已实现

… 等

想到了再加吧

目标

  • 完善当前的语法支持
  • 更多的单元测试覆盖(尽管目前新濠天地是84%)
  • PatchGenerator阶段进行新濠天地:未被新濠天地的新濠天地声明、结构体、枚举等,不会在补丁中,减少包大小以及加载时间等
  • 尝试Swift热更新(新建库吧,哈哈)

https://mp.weixin.qq.com/s/cHepcupQdxnVpWIIw82tXw

2021 给 iOS 开发者的一些建议

发布于:6天以前  |  37次官网  |  新濠天地app »

iOS 新濠天地篇 - 启动新濠天地之Clang插桩实现二进制重排

发布于:22天以前  |  80次官网  |  新濠天地app »

抖音品质建设 - iOS启动新濠天地《实战篇》

发布于:22天以前  |  63次官网  |  新濠天地app »

iOS APP 图标版本化

在我们的项目开发过程中,需要频繁打包给测试人员去测试,有时候我们都不知道测试机上安装的版本是否是最新的,这样会造成很多不必要的麻烦和成本。因此我们需要将buildNumber以水印的方式打在APPIcon上,可以很直观的知道当前是哪一个版本。

发布于:1月以前  |  77次官网  |  新濠天地app »

如何实现一个HTTP请求库——axios源码官网与分析

在前端开发过程中,我们经常会遇到需要发送异步请求的情况。而使用一个新濠天地齐全,接口完善的HTTP请求库,能够在很大程度上减少我们的开发成本,提高我们的开发效率。

发布于:1月以前  |  85次官网  |  新濠天地app »

老司机 iOS 周报 #144 | 2021-01-14

发布于:1月以前  |  104次官网  |  新濠天地app »

快手,快影 iOS App反调试

发布于:1月以前  |  112次官网  |  新濠天地app »

优酷iOS插件化页面架构方法

随着新濠天地不停地迭代,优酷 APP 用于分发视频资源的 UI 控件越写越多,也越来越复杂,并且同时相似相近的app也非常多。

发布于:3月以前  |  217次官网  |  新濠天地app »

iOS中的内嵌汇编

写一篇在iOS上使用汇编的新濠天地的想法在脑袋里面停留了很久了,但是迟迟没有动手。虽然早前在做启动耗时新濠天地的工作中,也做过通过拦截objc_msgSend并插入汇编指令来统计方法新濠天地耗时的工作,但也只仅此而已。刚好最近的时间项目在做安全加固,需要写更多的汇编来提高安全性(新濠天地内汇编使用指令集为ARM64),也就有了本文

发布于:3月以前  |  222次官网  |  新濠天地app »

77.9K 的 Axios 项目有哪些值得借鉴的地方

Axios 是一个基于 Promise 的 HTTP 客户端,同时支持浏览器和 Node.js 环境。它是一个优秀的 HTTP 客户端,被广泛地应用在大量的 Web 项目中。

发布于:3月以前  |  206次官网  |  新濠天地app »

不会吧,这也行?iOS后台锁屏监听摇一摇

一般情况下,出于省电、新濠天地、合理性等因素考虑,给人的感觉是很多奇怪的需求安卓可以实现,但是iOS就无法实现!今天要介绍的需求也有这种感觉,就是“当 APP 处于后台或锁屏状态时,依旧可以监听到摇一摇,进而触发某些新濠天地,比如:语音播报”。

发布于:4月以前  |  348次官网  |  新濠天地app »

iOS 稳定性:App 被终止的原因

本次 session 主要app如下: 介绍了后台应用终止的常见原因,并提供了一些新濠天地建议 介绍了 MetricsKit 提供的在app中获取诊断和性能数据的方法 介绍了 Xcode Metrics Ogranizer 提供的关于线上用户性能数据的可视化报告

发布于:4月以前  |  515次官网  |  新濠天地app »

优酷iOS插件化页面架构方法

随着新濠天地不停地迭代,优酷 APP 用于分发视频资源的 UI 控件越写越多,也越来越复杂,并且同时相似相近的app也非常多。

发布于:4月以前  |  362次官网  |  新濠天地app »

Vue中Axios的封装和API接口的管理

在vue项目中,和后台交互获取数据这块,我们通常使用的是axios库,它是基于promise的http库,可运行在浏览器端和node.js中。他有很多优秀的特性,例如拦截请求和响应、取消请求、转换json、客户端防御XSRF等。所以我们的尤大大也是果断放弃了对其官方库vue-resource的维护,直接推荐我们使用axios库。如果还对axios不了解的,可以移步axios文档。

发布于:4月以前  |  333次官网  |  新濠天地app »

iOS 持续集成:更完备的 App Store Connect API

时隔两年 App Store Connect API 有了更新,WWDC 2018 推出了 App Store Connect API ,用于自动化一些 App Store Connect 后台操作。这次更新包含了 app 元数据相关的API,补上了原来缺失的重要一环, 使得几乎可以通过 App Store Connect API 完成 App Store Connect 上的所有操作。今后开发、证书配置、用户管理、测试、发布全流程都可以通过 API 完成。

发布于:4月以前  |  421次官网  |  新濠天地app »

iOS 性能新濠天地:新濠天地 App 启动速度

苹果是一家特别注重用户体验的公司,过去几年一直在新濠天地 App 的启动时间,特别是去年的 WWDC 2019 keynote[1] 上提到,在过去一年苹果开发团队对启动时间提升了 200%

发布于:4月以前  |  373次官网  |  新濠天地app »

iOS圆角的离屏新濠天地,你真的弄明白了吗

发布于:4月以前  |  352次官网  |  新濠天地app »

iOS导航栏整体滑动解决新濠天地[(类似淘宝)

发布于:4月以前  |  419次官网  |  新濠天地app »

让你的应用远离越狱:iOS 14 App Attest 防护新濠天地

当越狱在 iOS 设备第一次流行起来时,iOS 开发人员会尝试各种方法来保护自己的应用程序,以让应用免受盗版等不确定因素的困扰。有许多方法可以做到这一点,包括检查 Cydia 是否存在、检测应用程序是否可读取自身沙箱之外的新濠天地、在检测到调试器时让应用程序崩溃等等。

发布于:4月以前  |  389次官网  |  新濠天地app »

探秘 iOS 14 的 WidgetKit

Widget Extension 提供了 small, medium, large 三个尺寸,不同尺寸可以展示不同的数据、不同的界面,开发者也可以锁定自己APP的 Widget 只有某类尺寸,相同的widget也能重复添加。作为添加在主新濠天地上的控件,苹果用了 “At a glance” 来形容 widget ,所以 widget extension 是无法交互的,它能做的只有展示一些信息与点击两个作用,点击后就会引导至app,同时为了性能与耗电量的考虑,Widget extension 也不能展示视频和动态图像。

发布于:4月以前  |  428次官网  |  新濠天地app »

最多官网

快速配置 Sign In with Apple 1年以前  |  3876次官网
开篇 关于iOS越狱开发 1年以前  |  2609次官网
APP适配iOS11 1年以前  |  2583次官网
使用 GPUImage 实现一个简单相机 1年以前  |  2575次官网
给数组NSMutableArray排序 1年以前  |  2522次官网
在越狱的iPhone设置上使用lldb调试 1年以前  |  2503次官网
App Store 审核指南[2017年最新版本] 1年以前  |  2395次官网
UITableViewCell高亮效果实现 1年以前  |  2357次官网
所有iPhone设备尺寸汇总 1年以前  |  2317次官网
使用ssh访问越狱iPhone的两种方式 1年以前  |  2234次官网
关于Xcode不能打印崩溃日志 1年以前  |  2157次官网
使用ssh 访问越狱iPhone的两种方式 1年以前  |  2051次官网
UIDevice的简单使用 1年以前  |  1834次官网
使用最高新濠天地操作iPhone手机 1年以前  |  1782次官网

qy77千亿国际富爸爸娱乐官网qy77千亿国际