LoginSignup
2
2

More than 5 years have passed since last update.

internal vs MobileSubstrate

Last updated at Posted at 2015-12-06

この記事は iOS Jailbreaking Advent Calendar 2015 の5日目の記事です。

なんのことかというとtheosを使った際にtweakのキモであるMethod swizzleをする手法をどちらにするかという話。

internal

ObjC黒魔術の源 objc/runtime.h よりmethod_getImplementation()method_setImplementation()を使ったswizzle
メソッドの追加にはclass_addMethod()が使用されます。

MobileSubstrate

substrate.hよりMSHookMessageEx()を使用したswizzle
メソッドの追加にはinternalと同様にclass_addMethod()が使用されます。

Theos generator

swizzleやaddMethodをするこの2種類を設定によって簡単に変更出来ます。
ファイル毎に変更が可能で、これがsubstrate。

Tweak.xm
%config(generator=MobileSubstrate)

これでinternalで生成されます。

Tweak.xm
%config(generator=internal)

またMakefileで記述する事も可能です。

Makefile
XXXX_LOGOSFLAGS = -c generator=internal
とか
ADDITIONAL_LOGOSFLAGS = -c generator=internal

このFLAGSは最終的にlogos.plの引数として渡されconfigに設定されます

logos.pl
GetOptions("config|c=s" => \%main::CONFIG);

上記の通り、long value --config generator=internal 形式でも可。

デフォルトはMobileSubstrateで、その後にFLAGSの設定があれば上書きされます。
ちなみにこのデフォルトは様々なtheos forkでは変わっていたりします。

で、どっちがいいの

その昔、saurik氏は有名なforkにおいてデフォルトがgenerator=internalになっている話の流れで「tweak側でアップデートをしなくともsubstrate側のアップデートでバグの修正等を得られる」(たしか)と言っていました。
それはそれで真実ですが、iOS 9から最近のアップデートがなされるまでsubstrateはなかなかバギーな状況で

  • generatorをinternalにしたらバグがなおる
  • substrate.dylibへのリンクをやめるとバグがなおる

私が経験しただけでこの2種類程の症状がありました。

どっちが正解という事もないと思いますが、これまでの開発のなかで「internalだとバグるけどMobileSubstrateにするとなおる」という事態には遭遇したことがないので、最近はinternalの方が良いのではないかなと感じています。

2
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2