【元記事をASCII.jpで読む】

 前回は、UWPアプリパッケージである、Appxに関する基礎的な情報を得る方法を紹介したが、今回は具体的にUWPアプリについて調べていくことにしよう。

 取り上げるのは「メッセージング」アプリとするが、もちろん、各自の好みで調べていただいて構わない。また、今後のバージョンアップなどで、インストール先フォルダー名などが変わる可能性もある。できるだけバージョンには依存しないように記述しているが、パスを含むコマンドは変更に対応する必要がある。

 まずは、インストール先を調べる。Powershell(管理者)で以下のコマンドを実行してみる

(get-appxpackage "*messaging*").installlocation

とすると、インストール先は、

C:\Program Files\WindowsApps\Microsoft.Messaging_4.1901.10241.1000_x64__8wekyb3d8bbwe

であることがわかる。しかし、実際にインストール先フォルダーを調べると名前のよく似た複数のフォルダーがある。

 インストール先フォルダーとは、途中部分が違うのみで、先頭と最後の部分が同じだ。これらは、分離されたリソースのフォルダーだ。このうち、「language-ja」という文字列が名前一部にあるフォルダーが日本語関係のリソースを含むフォルダーで、アプリケーション日本語名はここにある。

 アプリケーションの中では、自分自身の日本語表示名は自分のリソースなので簡単に得られ、スタートメニュータイルを登録したときに表示される日本語名も、アプリ自身がWindowsに通知して表示させている。ときどき「ms-resource:……」という名前のアプリを見かけるが、これは、名前の取り出しに失敗してリソースを指定するURIが表示されているものだ。この場合、UWPアプリが正しく動作できない状態にある。アプリリセットするか、再インストールすることで、正しく名前を表示できるようになる。

日本語ソースを取り出す

 さて、この日本語ソースフォルダーを調べてみよう。

 フォルダー内には、4つのファイルがあるが、リソースは、「resources.pri」というファイルに格納されいる。これは、文字列などのリソースをバイナリ化したpri形式なのでこのままでは読めない。幸い、Windows SDKに付属のMakepri.exeというコマンドでpri形式をxml形式に変換することができる。

 ただし、そのためには、UWPアプリインストール先フォルダーにあるresource.priファイルも必要になる(蛇足ながらWindows SDKインストールも必要である)。具体的には、以下のコマンドで、xml化したリソースが得られる。

makepri.exe dump /if リソースフォルダ\resources.pri /es インストール先\resources.pri /of 出力パス

 メッセージングの場合、以下の長いコマンドを使う。

makepri.exe dump /if .\Microsoft.Messaging_4.1901.10241.1000_neutral_split.language-ja_8wekyb3d8bbwe\resources.pri /es .\Microsoft.Messaging_4.1901.10241.1000_x64__8wekyb3d8bbwe\resources.pri /of c:\temp\Microsoft.Messaging.xml

 これで、c:\tempにMicrosoft.Messaging.xmlというファイルができる。このあと、ほかのUWPアプリについても調べたいので、このさい、日本語ソースが取り出せるものは、全部取り出してXMLファイルにしておこう。そのためには、C:\temp\appxpriなどのxmlを保存先フォルダーを予め作成しておき、以下のコマンドPowershell(要管理者権限)で実行する。

Get-AppxPackage -PackageTypeFilter main foreach { makepri.exe dump /es (Get-ChildItem "$($_.packageFullName)\resources.pri") /if (Get-ChildItem "$($_.name)*-ja*\resources.pri") /of "c:\temp\$($_.name).xml" }

 なんのことはない、get-AppxPackageで出力されるAppxパッケージオブジェクトの名前から日本語ソースフォルダーとインストール先フォルダー名を作り、そこにあるresources.priに対して、makepri.exeを実行しているだけだ。

 中には日本語ソースフォルダーのないアプリもあるので、途中エラーのようなメッセージが出るが、makepri.exeエラーヘルプメッセージを出力しているだけなので問題ない。なお、C:\Program Files\WindowsApps\は、書き込み禁止なので、xmlファイルの保存先(/of)は、必ず書き込み可能なフォルダーを指定しておくこと。

ソースXMLファイルを見てみる

 では、早速メッセージングのxmlファイルを見てみよう。直接開くとIEがxml形式として表示してくれる。ここにアプリの名前らしきものがある。

 しかし、複数あり、どれも名前のようではある。さて、本当の名前はどれか? これを判定するには、実は、アプリインストール先にあるAppxManifest.xmlファイルを調べる必要がある。AppxManifest.xml内に「uap:VisualElements」というタグがあり、そのDisplayName属性にリソースのURIが記述されている。メッセージングの場合、

<uap:VisualElements DisplayName="ms-resource:AppListName" ……

 となっていて、AppListNameというリソースが表示名に使われる。

 上記リストの「NamedResource」タグのうち、一致するuri属性値(AppListName)を持つ「メッセージング」が表示に使われる名前である。ただし、この関係は、一定ではなく、AppxManifest.xmlではさまざまなリソース指定URIが使われており、アプリ1つ1つのAppxManifest.xmlでこれを調べて、リソースXMLを捜す必要がある。これは、かなり面倒なので、できれば自動化したい。そこで、次回は、xmlPowerShellで処理させて、日本語の表示名を取り出す方法を解説する。

Windows 10に標準搭載のUWPアプリの中身を掘り下げる