文章目录
一、安装签名工具ldid
-
先确保安装了brew
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
-
利用 brew 安装 ldid
$ brew install ldid
二、修改环境变量
-
编辑用户的配置文件
$ vim ~/.bash_profile
-
在.bash_profile文件后面加入配置信息
- 说明:
:
代表和的意思, 可以用echo $PATH
打印配置信息
export THEOS=/opt/theos export PATH=$THEOS/bin:$PATH
- 说明:
-
让
.bash_profile
配置信息的环境变量立即生效(或者重新打开终端)$ source ~/.bash_profile
三、下载theos
- 建议在$THEOS目录下载代码(也就是刚才配置的/opt/theos目录)
- 建议使用git clone方式, 因为这个项目包含一些相关的子项目,使用
--recursive
可以递归下载$ git clone --recursive https://github.com/theos/theos.git $THEOS
四、新建tweak项目
-
cd到一个存放项目代码的文件夹(比如 桌面)
$ cd ~/Desktop $ nic.pl
-
选择[11.] iphone/tweak
-
填写项目信息
- Project Name
- 项目名称
- Package Name
- 项目ID (随便写)
- Author/Maintainer Name
- 作者
- 直接敲回车按照默认做法就行(默认是Mac上的用户名)
- [iphone/tweak] MobileSubstrate Bundle filter
- 需要修改的APP的Bundle ldentifier (喜马拉雅FM的是com.gemd.iting)
- 可以通过Cycript查看 APP的Bundle ldentifier
- [iphone/tweak] List of applications to terminate upon installation
- 直接敲回车按照默认做法就行
- 直接敲回车按照默认做法就行
- Project Name
五、编辑Makefile
- 在前面加入环境变量,写清楚通过哪个IP和端口访问手机
- THEOS_ DEVICE_ IP
- THEOS_ DEVICE_ PORT
- 如果不希望每个项目的Makefile都编写IP和端口环境变量,也可以添加到用户配置文件中
- 编辑完毕后,$ source ~/.bash_ _profile让配置生效 (或者重启终端)
- 编辑完毕后,$ source ~/.bash_ _profile让配置生效 (或者重启终端)
六、编写代码
- 打开Tweak.xm文件
七、编译-打包-安装
-
编译
make
-
打包成deb
make package // 包含了make编译的操作了
-
安装(默认会自动重启SpringBoard)
make install
八、可能遇到的问题
8.1 make的错误
- 是因为多个xcode导致路径(有 可能安装了好几个Xcode), 需要指定一下Xcode
- 是因为之前已经编译过,有缓存导致的,clean一下即可
$ make clean
$ make
- Any relevant logs, error output, etc?
xcrun: error: unable to find utility "llvm-dsymutil", not a developer tool or in PATH
-
Where has this been tested?
- Operating System: macOS Mojave 10.14.4
- Platform: macOS
- Target Platform: iOS
- Toolchain Version: Xcode 10.2
-
[darwin] Fix the handling of detecting llvm-dsymutil vs dsymutil.
- Xcode 10.2 removed llvm-dsymutil for some reason, so when we checked for
llvm-dsymutil withxcrun -f llvm-dsymutil
, an error was being printed.
- Xcode 10.2 removed llvm-dsymutil for some reason, so when we checked for
-
solution
- 修改文件
makefiles/targets/_common/darwin_head.mk
- 修改文件来源
- 修改文件
8.2 make package的错误
- 是因为打包压缩方式有问题,改成gzip压缩就行
- 修改dm.pI文件, 用#号注释掉下面两句
- 修改deb.mk文件第6行的压缩方式为gzip
- 修改dm.pI文件, 用#号注释掉下面两句
- solution
- 包名中不能含有特殊字符
_
- 包名中不能含有特殊字符
九、theos资料查询
- 目录结构: https://github.com/theos/theos/wiki/Structure
- 环境变量: http://iphonedevwiki.net/index.php/Theos
- Logo语法: http://iphonedevwiki.net/index.php/Logos
- %hook. %end : hook一个类的开始和结束
- %log : 打印方法调用详情
- 可以通过Xcode -> Window -> Devices and Simulators査看日志
- HBDebugLog : 跟NSLog类似
- %new : 添加一个新的方法
- 如果发现还是报错, 那就需要先声明一下方法
- 如果发现还是报错, 那就需要先声明一下方法
- %c(className) : 生成一个Class对象, 比如%c(NSObject), 类似于
NSStringFromClass(). objc_getClass() - %оrіg : 函数原来的代码逻辑
- %ctor : 在加载动态库时调用
- %dtor : 在程序退出时调用
- logify.pl : 可以将一个头文件快速转换成已经包含打印信息的xm文件
logify.pl xx.h > XX.xm
- 如果有额外的资源文件(比如图片),放在项目的layout文件夹中,对应着手机的根路径/
十、logify.pl注意点
- logify.pl生成的xm文件,有很多时候是编译不通过的,需要进行一些处理
- 删掉__weak
- 删掉inout
- 删掉协议,比如
- 或者声明一下协议信息@protocol XXTestDelegate
- 删掉 - (void).cxx_destruct { %log; %orig; }
- 删除 HBLogDebug(@" = 0x%x’ , (unsigned int)r);
- 替换类名为
void
, 比如将XXPerson *
替换为void *
- 或者声明一下类信息@class XXPerson