
RiP DevがPseudoSubstrate 1.0をリリース
- Lamiyi
- 0
- rhahw
MobileSubstrate (Cydia で利用可能) の代替である PseudoSubstrate が Installer.app で利用できるようになりました。これにより、MobileSubstrate を使用するパッケージをホストして使用できるようになります。
RiP Dev は、PseudoSubstrate が MobileSubstrate よりも優れていると考える理由について詳細な説明を掲載しており、以下に転載します。詳細については、以下の「続きを読む」リンクを使用して RiP Dev サイトにアクセスしてください。
-----
PseudoSubstrateは、Cydiaがインストールされていない場合や、Cydiaよりもインストーラーを優先する場合に使用でき、開発者側の追加作業は不要です。また、動作も高速です。最初のパッケージ「MySMS」も現在利用可能です。
好奇心旺盛な方のために、少し背景を説明しましょう。多くのユーティリティの役割は、SpringBoardやSMSなど、既存のアプリケーションの機能を拡張することです。もちろん、アプリケーションを拡張するには、サードパーティが作成した追加コードをアプリケーションメモリにロードし、アプリケーションの動作を変更する必要があります。これはどのように行われるのでしょうか?変更は、アプリケーション内で変更したいタスク(例えば、SMSメッセージを送信する関数)を実行する共通関数の1つを見つけることで行われます。次に、元の関数と同じパラメータを受け入れる代替の「パッチ」関数を作成し、元の関数と「スワップ」します。通常、これらのパッチは何か処理を行ってから元の関数を呼び出すため、機能的には基本的に何も失われません。
Mobile Enhancer と MobileSubstrate はどちらも、基本的にはブートストラップであり、パッチモジュールが拡張対象のホストアプリケーションにロードするのを支援します。また、共通インターフェースを提供することで、元の関数をパッチ適用済みの関数に置き換え、その後元の関数を呼び出すための機能を提供することで、関数のパッチ適用を支援します。これらは、パッチモジュールのリストを反復処理し、起動中のアプリケーションにそれらを1つずつロードし、モジュールが作業を完了できるように支援するヘルパーを提供します(同じ関数にパッチを適用しようとする他のモジュールと競合しないようにします)。
もちろん、開発者が独自のブートストラップを作成することを妨げるものは何もありませんし、実際にそうしている開発者もいます。しかし、単一のプラットフォームを採用してそれを使用する方が合理的です。
Mobile Enhancerは2007年9月から存在し、UnsanityのApplication Enhancer(Mac OS Xライブラリで同じ機能を持つ)の直系(実際にはARM移植版)です。MobileSubstrateは今年中に誕生しましたが、どうやら作者はMobile Enhancerがクローズドソース(ただし無料)であることを気に入らなかったようです。私の推論が間違っているかもしれませんので、作者自身からコメントをいただけるかもしれません。
よくあることですが、無料だからといって必ずしも優れているわけではありません。MobileSubstrateは、他の手軽な仕事と同じように、本来の目的を果たしますが、そのやり方は効率的とは程遠いものです。でも、オープンソースなので、誰でも改良できるはずですよね?
私が偏見を持っていると思われるかもしれませんが、事実を見てみましょう。
- MobileSubstrateは、同じ関数に複数のパッチを適用すると競合するC関数にパッチを適用する簡単な方法を使用しています。
- MobileSubstrateが使用するObjective Cメソッドにパッチを適用する方法が私には理解できません。関数のIMPアドレスを交換するだけでなく、それに加えてクラスメソッドリストに新しいメソッドを追加します。理由は理解できますが(開発者にとっては[self orig_patchedFunction:arg1]と書く方がgPatchedFunction(obj, sel, arg1);と書くよりも簡単だからです)、最終的にはobjc_msgSendが別々に呼び出され、元の関数を呼び出すためだけに50~400の余分な命令が実行されることになります。スピードについて話しましょう。
- MobileSafetyの動作方法(SpringBoardでよく見られるセーフモードを制御する)は、UN*Xの熱狂的なファンにとっては問題ありませんが、依存すべきではないいくつかの仮定に依存しています。たとえば、アプリがクラッシュしたときに送信される一般的なシグナル (SIGSEGV、SIGBUS など) をトラップしますが、チェーン内の次のハンドラーに追加情報を渡しません。こんにちは、これは 21 世紀の話です。ここで話しているのはコマンド ライン ツールではありません。これは本格的な GUI アプリ内で行われるため、MobileSafety が破棄する追加情報が役に立つかどうかはわかりません。わかりません!
- ローダー自体は Objective C で記述されているため、純粋な C で記述されたものと比べてはるかに遅く、アプリケーションの起動ごとに影響します。
まあ、それでも十分に機能しているので、あまり責められないですね。素晴らしいコンセプトなのに、実装がかなりまずかったのは理解できます。作者は日中は仕事を抱えていて、こういうハックをする時間も知識もほとんどなかったのでしょう(繰り返しますが、UN*XはMac OS Xではありません)。
いずれにせよ、MobileSubstrate は Mobile Enhancer より劣っているため、MobileSubstrate ライブラリをロードするラッパー (純粋な C を使用しているため、処理速度が速い) を作成し、MobileSubstrate によって提供される機能 (いくつかの側面ではより正確に動作する) を提供するのは非常に簡単でした。そのため、MobileSubstrate を使用する開発者はアプリケーションを変更する必要がなく、魔法のように動作します
。-----
続きを読む
