【YouTubeアプリパッチ:余談】ReVancedに何があったのか

⚠️注意⚠️私はMorphe(前RVX)ユーザーなこともあり、本件については特に解釈が偏っている可能性があります。というか十中八九偏っています

昨日投稿したMorpheについて、何故ReVancedから分裂したのかもう少し詳細に経緯を調べたいと思いました。

【YouTubeアプリパッチ】ReVancedの動きが何やら不穏らしいのでMorpheへ移行した
相変わらずブログは放置気味です。明けましたおめでとうございます。  ReVancedという(主にYouTubeアプリ向けに)様々なパッチを提供するツールをご存知…
blog.et0nia.me

とはいえ英語読める方なら以下の2つのReddit投稿を見れば大体状況がわかるかと思います。遅報of遅報ですが、日本語で本件に触れている記事が見当たらなかったのでざっくりとですがまとめました。

発端となったプルリク+立つ鳥跡を濁しまくった離脱方法

諸々の発端は以下の2つのPull Requestsです。ReVancedがパッチを当てる場所を探す際の処理(Fingerprints)について、本分裂騒動の中心となったLisoUseInAIKyrios氏(ReVanced開発初期からのコントリビュータ)とReVancedのメインメンテナであるoSumAtrIX氏の2人で今後の実装方針に関して大きな隔たりがあったのが原因となっています。

💉 ReVanced Patcher used to patch Android applications - feat: Match fingerprints…
github.com
💉 ReVanced Patcher used to patch Android applications - feat: Modernize APIs by …
github.com

技術的な詳細については私もちゃんと把握できていないためふんわりとした説明になりますが、おおよそ以下のような問題点・解決法を取っている様子でした。

  • 従来の問題点
    • アプリのアップデート等でパッチを当てるべき場所が変わった際、単純なパターンマッチでは探しきれない場合がある。そのため、アプリの構造が大きく変わったわけでもないのにバージョンアップごとにパッチを作成しなおす必要が生じる
  • LisoUseInAIKyrios氏のアプローチと主張(PR#329)
    • 命令フィルタ(Instruction Filters)を追加し、パッチ箇所の検索精度を上げる
    • フィルタによる分岐処理が増えてしまう(コードが冗長になってしまう)デメリットはあるものの、従来のReVanced同様に宣言的にパッチ箇所を記述することができるため開発が用意
    • LisoUseInAIKyrios氏自身も半年程度テスト済みであり、YouTubeの47回分のバージョンアップに耐えられた。従来の処理の延長線上として利用可能なため、パッチ開発者の移行コストも低い
  • oSumAtrIX氏のアプローチ(PR#385)
    • そもそもフィンガープリントの設計自体を見直し、パッチを当てたい箇所を明示的に宣言するのではなくパッチ個所を検索するロジック全体をラムダ式等で定義可能にする
    • 根本から概念が異なることもあり移行ハードルは高いが、パッチ処理自体に高度な柔軟性を持たせることが可能
    • やろうと思えばPR#329のような処理も本実装にて記述可能であり、こちらの方が上位互換である。PR#329のような「エレガントでない」設計はReVancedの根幹に持つべきではない

 これらに関する議論についてはGitHubやメール上で平行線をたどり続け、oSumAtrIX氏曰く「プロフェッショナルとして冷静な議論を呼びかけたものの、相手は感情的になり議論が成立しなかった(脅迫や侮辱めいた発言すらあった)」と言われる状態まで荒れたようです。上記のRedditにもoSumAtrIX氏側が開示したPDF資料がありますが、まあお互い結構荒っぽいことになっています(正直oSumAtrIX氏側も意固地になっている節があり、『プロフェッショナルとして冷静な議論を呼びかけた』かはちょっと怪しいです)。

 その結果LisoUseInAIKyrios氏+支持者はReVancedのプロジェクトのメンテナンスを止め、新規プロジェクトとしてMorpheを立ち上げたわけですが、その際に結構荒っぽいことをしておりそれがReVanced側からのBAN(ブラックリスト入り)の原因になりました。先程のPDF内にも色々と書いてありますがメインとなった理由は以下の2つです。

  • LisoUseInAIKyrios氏陣営が、自らが関わった過去のプルリク・Issueを勝手に閉鎖
  • ReVanced側に対する風評被害をReddit等で流布

さらにMorpheはコードのベース部分にReVancedからの流用があり、以下の点でGPLv3ライセンス違反ギリギリorライセンス違反をしているのではないか、というのがoSumAtrIX氏の主張になります。

  • フォーク元を明示しておらず、ReVanced側の過去のコミットログをわざと潰して(一つの履歴として)見せている
  • MorpheはGPLv3に以下の条項を追加しており、GPLv3で許可されていない「追加制約」に該当する

📜 License

Morphe Patches are licensed under the GNU General Public License v3.0, with additional conditions under GPLv3 Section 7:

  • Attribution (7b): Any use of this code, including derivatives, must display a visible notice: This app uses code from Morphe. To learn more, visit https://morphe.software
  • Name Restriction (7c): The name “Morphe” may not be used for derivative works.
    Derivatives must adopt a distinct identity unrelated to “Morphe.”

で、実際どうなのか(個人的解釈)

 LisoUseInAIKyrios氏が離脱時に行った所業は全く褒められたことではないですが、oSumAtrIX氏側にも多分に問題があるなあというのが正直な感想です。確かにPR#385のような設計は無限の柔軟性を持たせられますが、その結果パッチを作成する際の複雑さが増してしまったら元も子もありません。さらに言えば、ただでさえアングラでMaliciousなコードがどこに混ざって来るかわかったもんじゃないパッチアプリに余計な介入ができる余地を与えてしまうとリスクが無駄に増してしまいます。

 また本家ReVancedはメインであるYoutubeに対してでさえパッチの数が控えめで、RVXのような派生パッチで何とかなっていた部分がありました。本件でその辺りのパッチをアクティブにメンテナンスしていた面々が離脱したこと、およびPR#385のような実装でReVanced側のパッチ作成がより難しくなっていってしまうことを考えると、ユーザーとしてはReVancedから移行した方がメリットが大きそうです。

 ただ、oSumAtrIX氏が主張していたMorphe側のライセンス問題については割と事実であり、少なくともAttribution (7b)の追加項目は書き方が不味いです。ライセンスの表記を(Morpheがやったようにコメントアウトしてでも)保持させることはGPLv3の制約的にセーフですが、ライセンスを表示(display)せよというのは追加制約に該当する可能性が高いです。(7cについてはセーフですし、フォーク元の隠ぺいについてもお行儀は極めて悪いですが一応セーフです)その辺りが解決すればMorpheを安心して利用できるかもしれません。