JBDev - Theos下一代越獄開發工具
自越獄誕生以來,Theos一直是越獄開發的主流工具,大多數開發者使用Theos編譯代碼,再用lldb手動調試。JBDev簡化了這個過程,項目地址https://github.com/lich4/JBDev
簡介
JBDev用于Xcode越獄開發及巨魔開發,提供和普通App一樣的開發體驗,使用Xcode進行編譯——安裝——調試,已測試環境:
- Xcode12-15
- iOS12-16
- arm64/arm64e
- Checkra1n/Unc0ver/Taurine/Palera1n/Dopamine
- 有根/無根/隱根
主要功能
- 支持越獄(有根/無根/隱根)App開發&源碼級調試
- 支持巨魔App開發&源碼級調試
- 支持Xcode調試任意進程
注意事項
- JBDev只能用于越獄設備上調試
- 使用JBDev越獄開發時,打包功能依賴于Theos
- 使用JBDev巨魔開發時,確保已安裝TrollStore
常見項目類型調試方式一覽
項目類型 | Xcode調試 | 調試類型 |
---|---|---|
越獄App | JBDev | 啟動調試/附加調試/等待調試 |
越獄Tweak/Tool | JBDev | 附加調試/等待調試 |
巨魔App | JBDev | 啟動調試/附加調試/等待調試 |
非越獄App | MonkeyDev | 啟動調試/附加調試/等待調試 |
注:
- 啟動調試,使用Xcode啟動App并使其等待調試器附加
- 附加調試,進程已啟動情況下附加調試,lldb使用方式
debugserver --attach=[pid|name]
,Xcode同理 - 等待調試,等待進程啟動并自動附加調試,lldb使用方式
debugserver -waitfor=[name]
,Xcode同理
JBDev核心
JBDev核心文件
jbdev.plist
,控制JBDev在iOS端行為配置文件,開發階段需隨App一起打包,字段如下-
type
: 指定JBDev以何種方式打包安裝,可指定app/jailbreak/trollstore
jbdev.build.sh
,控制JBDev打包的腳本
JBDev核心設置(環境變量)
THEOS
,用于JBDev定位Theos以便打包JBDEV_PACKAGE
,應用于App類型Target,用于控制最終打包&安裝&調試
JBDev開發越獄項目
詳細實例見JBDevJBTest
建立項目
以下配置不依賴于iOSOpenDev/MonkeyDev
使用Xcode建立等同于
theos/application
的項目
- File - New - Target - iOS - App
- 此為主Target,用于JBDev交互打包/安裝/調試
使用Xcode建立等同于
theos/tweak
的項目
- File - New - Target - macOS - Library
- Build Settings -
Base SDK
設置為iOS
,同時部署Device設置為iOS設備
使用Xcode建立等同于
theos/tool
的項目
- File - New - Target - macOS - CommandLineTool
- Build Settings -
Base SDK
設置為iOS
,同時部署Device設置為iOS設備
配置文件
- 所有需要ldid簽名的Target在自身目錄下添加plist文件
- 將
jbdev.build.sh
放在.xcodeproj
同級目錄 - 將
jbdev.plist
放在.xcodeproj
同級目錄,設置type
為jailbreak
配置
Build Settings
- 所有Target調整
Installation Directory
- Project新增
CODE_SIGNING_ALLOWED
,設置為NO - Project新增
THEOS
,設置為theos路徑 - 主Target新增
JBDEV_PACKAGE
,設置為YES(此變量控制是否打包)
配置
Build Phase
- 所有Target添加
Run Script
最后執行,設置為bash jbdev.build.sh
- 主Target將其他項目設置為依賴項
無根/隱根配置
Theos支持為有根/無根/隱根提供layout擴展
layout_root
目錄,存放有根與無根/隱根文件difflayout_rootless
目錄,存放無根與有根/隱根文件difflayout_roothide
目錄,存放隱根與有根/無根文件diff
常用diff文件如下
layout*/DEBIAN/control
,-
- 有根
Architecture
為iphoneos-arm
- 有根
-
- 無根
Architecture
為iphoneos-arm64
- 無根
-
- 隱根
Architecture
為iphoneos-arm64e
- 隱根
layout*/DEBIAN/{preinst,postinst,extrainst_,prerm,postrm}
layout*/Library/LaunchDaemons/*.plist
注意事項
layout/DEBIAN/control
的Architecture
和Xcode Build Settings
的Architecture
沒有關系,有根包的實際arch可以為armv7/arm64/arm64e
,無根包/隱根包的實際arch可以為arm64/arm64e
- 必須在
layout/DEBIAN
的postinst
或extrainst_
中執行uicache
否則因系統App未注冊而安裝失敗
有根/無根/隱根編譯切換
此方式每次可編譯有根/無根/隱根中的一種,操作方式如下
通用
- Tweak設置
Runpath Search Paths
Header Search Paths
Framework Search Paths
- Tweak鏈接
libsubstrate.tbd
有根
- 所有Target的
Build Settings
的THEOS_PACKAGE_SCHEME
刪除
無根
- 所有Target的
Build Settings
的THEOS_PACKAGE_SCHEME
設置為rootless
Preprocessor Macros
中設置THEOS_PACKAGE_SCHEME_ROOTLESS
隱根
- 所有Target的
Build Settings
的THEOS_PACKAGE_SCHEME
設置為roothide
Preprocessor Macros
中設置THEOS_PACKAGE_SCHEME_ROOTHIDE
- Tweak鏈接
libroothide.tbd
單獨啟動調試Tweak
詳細實例見JBDevTweakTest。由于JBDev可以調試任意App,因此可以源碼級調試注入App的Tweak。原理如下:
- 建立一個和目標App的BundleID相同的空App(
FakeApp
) - Xcode執行打包安裝調試,JBDev跳過安裝
- 目標App啟動,開始調試Tweak
使用Xcode建立
FakeApp
- File - New - Target - iOS - App
配置文件
- 將
jbdev.build.sh
放在.xcodeproj
同級目錄 - 將
jbdev.plist
放在.xcodeproj
同級目錄,設置type
為jailbreak
配置
Build Settings
- 所有Target新增
CODE_SIGNING_ALLOWED
,設置為NO FakeApp
新增JBDEV_PACKAGE
,設置為YES(此變量控制是否打包)FakeApp
新增JBDEV_NO_COPY
,防止安裝FakeApp本身
配置
Build Phase
- 所有Target添加
Run Script
最后執行,設置為bash jbdev.build.sh
FakeApp
將Tweak設置為依賴項
注意
SpringBoard
不屬于App類型,不可調試- 由于Xcode不支持非源碼下斷點,因此不支持調試logos語法的Tweak,如果誰有黑科技可以實現強制下斷點請在issue里提交
JBDev開發巨魔項目
詳細實例見JBDevTSTest。前置條件:iOS系統需要能越獄且能使用巨魔
使用Xcode建立普通iOS-App的項目
- File - New - Target - iOS - App
配置文件
- 在自身Target目錄下添加需要簽名的plist文件
- 將
jbdev.build.sh
放在.xcodeproj
同級目錄 - 將
jbdev.plist
放在.xcodeproj
同級目錄,設置type
為trollstore
配置
Build Settings
- Target新增
CODE_SIGNING_ALLOWED
,設置為NO - Target新增
JBDEV_PACKAGE
,設置為YES(此變量控制是否打包)
配置
Build Phase
- 所有Target添加
Run Script
最后執行,設置為bash jbdev.build.sh
注意事項
- 巨魔App開發,由于純巨魔環境與越獄環境有較大差異,因此后續需要在純巨魔環境進一步測試
JBDev編譯
cd JBDev
make clean; make package
make clean; make package THEOS_PACKAGE_SCHEME=rootless
make clean; make package THEOS_PACKAGE_SCHEME=roothide