- 投稿日:2020-11-17T11:19:06+09:00
Apple Silicon 動作確認記 (随時更新)
Apple M1チップ搭載13インチMacBook Proを購入したので、各アプリケーションの対応状況を確認していきますー。
ソフトウェアエンジニアなので、その周りのアプリケーションを中心に。
対応状況は、あくまでその時点までの確認です。
使っていたら、別の状況が見えてくるかもしれませんね!では、書いていきます。
Chrome 動く。
今この記事を書いているのも、M1 + Chrome。問題なく動作しています。
最初にRosettaをインストールしますか?って聞かれますが、すぐにインストールされました。
Google日本語入力
個人的に大好きなのでインストール。問題なく動作しています。
iTerm2 動く
問題なし。
Node.js (v14.15.1)
Hello Worldは問題ない。
ito@itoutakeshinoMacBook-Pro ddd % cat index.js console.log("hello") ito@itoutakeshinoMacBook-Pro ddd % node index.js hello ito@itoutakeshinoMacBook-Pro ddd %Docker Desktop 動かない
Java (AdoptOpenJDK build 11.0.9+11) 動く
動く。
ito@itoutakeshinoMacBook-Pro ~ % java --version openjdk 11.0.9 2020-10-20 OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.9+11) OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.9+11, mixed mode) ito@itoutakeshinoMacBook-Pro ~ % cat Hello.java public class Hello { public static void main(String... arg){ System.out.println("hello"); } } ito@itoutakeshinoMacBook-Pro ~ % javac Hello.java ito@itoutakeshinoMacBook-Pro ~ % java Hello hello.Net (Core 5.0.100) 動く
動く。
ito@itoutakeshinoMacBook-Pro dotnetInspect % dotnet --version 5.0.100 ito@itoutakeshinoMacBook-Pro dotnetInspect % cat Program.cs using System; namespace myApp { class Program { static void Main(string[] args) { Console.WriteLine("hello"); } } } ito@itoutakeshinoMacBook-Pro dotnetInspect % dotnet run helloVirtualBox (6.1.16 r140961 (Qt5.6.3)) 動かない
golang (1.15.5) 動く
amd64って言っているから、Rosetta上で動いているのだと思うのですが、動く。
ito@itoutakeshinoMacBook-Pro ~ % go version go version go1.15.5 darwin/amd64 ito@itoutakeshinoMacBook-Pro ~ % cat hello.go package main import "fmt" func main() { fmt.Printf("hello") } ito@itoutakeshinoMacBook-Pro ~ % go run hello.go hello%Rust (動かない)
ワークアラウンドがありそうだが、サイトで公開されているインストール手順がダメ。
ito@itoutakeshinoMacBook-Pro ~ % curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh rustup: unknown CPU type: arm64Visual Studio Code (Version: 1.51.1)
起動する。どこまで動けば動くって言えるのかはおいておいて。
結果、Electronが起動すると期待できる。
というわけで、、、仮想環境系がダメっぽい。
今どきはソフトウェア開発するのに仮想環境はいることが多いと思うので、、、今、Apple Siliconに凸するのは、、、どうだろう?という感じです。
- 投稿日:2020-11-17T01:00:54+09:00
バイナリファイルのサンドボックス化
はじめに
App storeで自作アプリを公開しようと思ったら色々手こずったことについての備忘録。そのうち誰かの役に立つかもと思い、書き留めておく。
App storeで自作アプリを公開するには、アプリをサンドボックス化しなくてはならないとのこと。特に手こずったのは、アプリに埋め込むサードパーティ製のバイナリファイルもサンドボックス化しなくてはならなかった点だ。
サンドボックス化とは
要するにサンドボックス化とは、アプリの機能を制限する仕組みのこと。サンドボックス化していないアプリは、アプリユーザーができることは何でもしてしまい得る。アプリにセキュリティホールがあって、悪意ある第三者がこれを利用して、アプリを使って任意の機能を何でも実行できてしまう懸念がある。
アプリのサンドボックス化
アプリのサンドボックス化はそれほど難しくない。Xcodeでプロジェクトアイコンを選択して、「Target」を選択した状態で、Capabilityタブを選び、App Sandboxをオンにして、アプリが真に必要とする機能だけをオンにしてやれば良い。デフォルトではこれら機能は全てオフになっている。
設定項目は、以下のようだ。
ここで設定してやれば、あとはビルドするだけでアプリはサンドボックス化される。
ただしサンドボックス化すると、例えば、アプリが、アプリバンドル内にファイルを一時保存するといったことができなくなる。もしこのような処理をしているならコードを書き換える必要がある。この場合特定のディレクトリを、一時ファイルの置き場として利用することができる(後述)。
バイナリファイルのサンドボックス化
ここまでは良い。問題は、自作アプリに、サードパーティが作ったバイナリファイルを埋め込んで使いたいのだが、このためにValidationが通らず、バイナリファイルをサンドボックス化しなくてはならなくなったことだ。
出ていたエラーは
App Store Connect Operation Error App sandbox not enabled. The following executables must include the "com.apple.security.app-sandbox" entitlement with a Boolean value of true in the entitlements property list: [(xx.xx.xxxx.xx.XXXX.pkg/Payload/AppName.app/Contents/Resources/binary1", (xx.xx.xxxx.xx.XXXX.pkg/Payload/AppName.app/Contents/Resources/binary2")] Refer to App Sandbox page at https://developer.apple.com/documentation/security/app_sandbox for more information on sandboxing your ap.というものだ。
すでにバイナリ化したものを、サンドボックス化できるのだろうか?これはXcodeでやるのか、それともターミナルでやるのか?
以下は色々と調べてたどり着いた解決方法だ。[アプリ名]Release.entitlementsファイル
Sandboxの設定をすると、[アプリ名]Release.entitlementsというファイルが自動生成される。Sandboxの設定を変更すると、このファイルの中身が自動的に置き換わる。
中身はxml形式だが、Xcodeで開くと、以下のようになっている。
このファイルへのパスは、Build Settingsの中のSigningの中の、Code Signing Entitlementsで参照されている。つまりSandbox化に使われる情報は、コード署名の時に使われるということだ。
コード署名は、配布時にコードにつける署名であり、そのコードが開発者によって作成されたものであること(改ざんされていないこと)を確認するために必要なものだ。
バイナリファイルにコード署名をつける
ターミナルでつけることができた。と思ったらバイナリが動かなくなっている!現在解決を試みているところです。codesign -f --timestamp --entitlements /Users/yoho/AppNameRelease.entitlements -s "Xxxxxx Yyyyyy (8DK4RRM7WW)" /Users/yoho/myProjects/ProjName/binary1ここでAppNameRelease.entitlementsは、ダミーのXcodeプロジェクトでサンドボックス設定をして作成したentitlementファイル(xml形式)だ。"Xxxxxx Yyyyyy (8DK4RRM7WW)"は、コード署名に使われる開発者の名前とID?だ。これらが何であるかは、キーチェーンアクセスで「自分の証明書」を見れば良い。この証明書は、AppleのDevelopperサイトから入手したもの(のはず)だ。
コード署名を調べる方法
ターミナルで以下を実行
codesign -dvvv /Users/yoho/myProjects/ProjName/binary1entitlementの書式が有効かチェックする方法
ターミナルで以下を実行
plutil /Users/yoho/AppNameRelease.entitlementsファイルの置き場所
サンドボックス化されたアプリでも自由に読み書きできるフォルダ(applicationSupportDirectory)がある。そのフォルダへのパスは以下で調べることができる。
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES); NSString *applicationSupportDirectory = [paths firstObject];コード署名はどこにあるのか?
バイナリにコード署名をつけた場合に、この署名情報はどこにあるのだろうか?Xcodeでコマンドラインツールを作ると、コード署名されてしまうので、C言語で「Hello World」を表示するバイナリをgccで作成して、ファイルサイズを見ると8 KBであった。これにコード署名するとファイルサイズは18 KBとなった。
また実行ファイルを、署名前後でddxコマンドでダンプし、DIFFFで比較すると、コード署名の部分はバイナリファイルの後半にまとまって存在していることがわかった。
というわけで、バイナリファイルの後部にコード署名が追加されるらしいこと、この場合ではコード署名は10 KB程度のサイズであることが判明した。コード署名部分以外にも、全部で10バイトほど変更される箇所があるようだが、何の変更なのかはわからない。
終わりに
内包したバイナリ全てをサンドボックス化して、ようやくvalidationにパスした。web上に色々と情報はあったのだが、どれも直接的に解決には至らず、記事としてアップすることにした。