1510tyのBlog

1510tyのサイト

Blog番号: 2


PaperPluginの罠にはめられた話

こんにちは。1510tyです。

突然ですが、「サンドボックス」って知ってますか?

砂場...じゃなくて、要は「アプリが許可されたもの以外に触れられないようにする」ってことです(たぶん)。

で、サンドボックスのメリットは

・アプリがシステムを壊すリスクを最小にできる

・アンインストール時にゴミが残らない

などのメリットがあります。いいことだからけのように見えますが、実際は

・なぜか外部のファイルが見えない

・よくわからんエラーが出る

・再インストールしようとしたらデータも一緒に消えた

・できることが少ない(主に開発者視点)

・パフォーマンスがネイティブに比べれば低い(重い)

などのデメリットもあります。これは主にUWPの視点ですがw

まあそんなサンドボックスですが、導入しているものは主に

・UWP

・Flatpak

・PaperPlugin

・Chromium

などがあげられます。それぞれのサンドボックスの特徴をみていきましょう。

UWP (UniversalWindowsPlatform)

※UWPについてはここでは解説しません。

・ビルド時の設定(appxmanifest)で指定した権限以外にアクセスできなくする。指定されていてもアプリ実行時に権限を使うと確認ウィンドウ?が出る。

・管理者権限として実行という概念がない。

・Win32のWindow埋め込みで捕まえられない。

・起動時にスプラッシュが出る

・中断という仕組みがある。

・デフォルトのウィンドウサイズが正方形風。

・クラッシュ/フリーズ時に「応答なし」などが出ない。

などです。

Flatpak

・ビルド時に指定した権限以外を利用できない。(ただし指定されていれば確認なく利用可能)

・Flatpakの中間層があるので勝手にIMEとWaylandに強くなる。

などです。

PaperPlugin

・他のプラグインのクラスにアクセスできない(paper-plugin.ymlで依存関係として設定すれば可能。)

これくらいです。依然System.exit();は叩けます。

Chromium

・他のタブに侵食できない。

・カメラ、マイク、通知などの権限が明確。(事前に指定する必要はなし。初めて利用した際に自動的に確認が出る。)

・1つのタブがクラッシュしても他のタブは無傷。(ただしこれはあくまでブラクラなどに対しての耐性。バグなどをつかれたら全体が落ちることも...)

などです。

...みたいな感じです。それぞれ特徴的ですね。一番制限が厳しいのはUWPだと思います。そのせいであんまりアプリが出回らなかったとか...

MicrosoftStoreはもともとUWPアプリ専用でした。が、数年前にWin32アプリなどもmsixでパッケージングすれば配布できるようになりました。

また、意外なことに設定や、電卓などもまだUWPです。

ちょっと昔の話ですが、Minecraft for WindowsもUWPでした。1.21.120でGDK(Win32ベース)に移行しましたが。その移行のせいでワールドデータ消失などが多発しました。

後バグも多発しました。移植開始から本番までは約1ヶ月ほどしか用意されてなかったようです。さらに品質管理メンバーも削減...

やっぱMicrosoft...ならぬマイクソソフトのやることはレベチですね...

また、最近は「Java Realms」とかいう不穏な文字が見つかったようです。Modで速攻で無効化されるだろうけど()

まあ、話を戻して、PaperPluginの罠にはめられたとはどういうことか。

最近、/flyで1秒○円つかってクリエ飛行ができるプラグインというのを開発してました。

で、その課金処理にはVaultを使っています。で、VaultAPIを叩こうとしたのですが、なぜかクラスが見つからないというエラーが発生。

VaultAPIを使う他の"Bukkit"プラグイン(ChestShop,Jeconなど)は正常に動いてるのになんで...

苦戦しました。

で、ふとpaper-plugin.ymlの依存関係の書き方をみました。すると...

他のプラグインクラスにアクセスするには依存関係を書かないといけないじゃないか!!

それもplugin.ymlとは大幅に違う書き方で。

で、ちゃんと依存関係を指定したらさっきまでのエラーが嘘のように消え去りました。

こういうことが起きるからサンドボックス思考は嫌いなんです。

まあ、なんか微妙な終わり方ですが、このBlogはここまでです。

最後に、正しいpaper-plugin.ymlの書き方の例を下に貼っておきます...