ライブラリのarm64バイナリがリンクされるアーキテクチャを選択するためのmacOSユーティリティです。 このツールはDMM.comの業務中に開発されました。
このツールはiOS版DMMブックスアプリで実際に利用されています。
Ranasa
はdarrarski/xcframework-maker
に触発されて作成されたツールです。
xcframework-maker
ではFat-ArchitectureのFrameworkに対してXCFramework化し、合わせてarm64-simに対応したFrameworkを同時に生成することができます。これに対してRanasa
ではスタティックライブラリやダイナミックライブラリに対してarm64-simに対応させるアプローチを提供します。スタティックライブラリではar archive
にてまとめられたもの、ダイナミックライブラリではそのまま適する形でarm64-simをリンクするように命令される部分を書き換えます。
これを実現する基礎技術としてClangが関わってきます。読み込むバイナリのヘッダーファイルが特定の場合にはClangがリンクする対象を実機向けとシミュレータ向けに選択する挙動を行います。本ツールではこれを操作するためのスタティックライブラリとダイナミックライブラリに対して共通のインターフェイスを提供します。
なぜ別のツールが必要なのでしょうか。理由として既存のワークフローをできる限りそのままにアプリケーションの保守ができるためです。このツールが使いたいプロジェクトとは過去から引き継いできた歴史のあるアプリケーションが多いと推測しています。そのため新しいパッケージを提供するツールを無理やり使ってarm64-sim対応を行うと既存のプロジェクトの組み方を変更する観点から新規調査を始めなくてはなりません。
また直接ライブラリを使っているプロジェクトに対してそれぞれフレームワークにまとめる必要が発生します。これは非常に面倒な作業です、できる限りやりたくないです。ただ単にApple Silicon搭載のMacでarm64でXcodeを使って開発したいだけなのに多くの時間や手間を書けるのは非常に時間やリソースの調整が必要です、PdM側から見るとRosetta2経由で動かせるなら工数を割かない判断をすることも合理的とすら思えます。
DMM.comのチームでは開発・保守を行っているアプリがいくつかあります。そのうちの一つのアプリではまさに上記の課題に直面していたため必要に駆られてこのユーティリティを作成しました。
スタティックライブラリの書き換え
https://bogo.wtf/arm64-to-sim.html
ダイナミックライブラリの書き換え
https://bogo.wtf/arm64-to-sim-dylibs.html
実装リポジトリ
https://github.com/bogo/arm64-to-sim
Swift 5.3以上を使えるmacOSにてビルド出来ます。
swift build -c release
出力された成果物は実行ファイルとなっているため通常のCLIアプリケーションと同じように扱えます。
.build/release/ranasa
Xcodeのビルドスクリプトで実行したい場合にはプロジェクトにMintを追加してRanasa
コマンドを発行すると利用できます。
export PATH="/opt/homebrew/bin:$PATH"
xcrun --sdk macosx mint install ranasa
mint run ranasa -s ${SRCROOT}/binaries -r ${SRCROOT} -v -x arm64sim.json
$ ranasa -h
OVERVIEW: `ranasa` is utility for switch architecture from legacy static library, static framework, dynamic library, dynamic framework.
The design idea is to make binary libraries that depend on projects built with
older designs compatible with Apple Silicon from the outside.
For libraries that are Fat Architecture Binary,
we can change them from arm64 and x86_64-simulator to arm64 and arm64-simulator
and build them with arm64-Xcode and run them on arm64-simulator.
You can build it with arm64-Xcode and run it on arm64-simulator.
This tool can be recommended for projects that for some reason cannot support the xcframework,
or where changing the packaging of the library would increase the man-hours.
Input File Description
- linking: type `static` or `dynamic`.
- path: relative path, Source Root define `root` option.
"""
[
{
"linking": "dynamic",
"path": "relative/path/to/library"
},
{
"linking": "static",
"path": "relative/path/to/framework/in/library"
},
]
"""
USAGE: ranasa <config-file> [--root <root>] [--store <store>] [--minos <minos>] [--sdk <sdk>] [--xcode] [--simulator] [--thin] [--verbose] [--check]
ARGUMENTS:
<config-file> Path of the definition file
OPTIONS:
-r, --root <root> The location to root the library (default: .)
-s, --store <store> The location to store save the binary (default: ${HOME}/.ranasa)
--minos <minos> Simulator minos variable number, default = 13.0
--sdk <sdk> Simulator sdk variable number, default = 13.0
-x, --xcode If in xcode script, auto detect simulator or actual. fall back to `simulator` flag.
-a, --simulator Replace binaries with simulator builds
-t, --thin Output builds to arm64_simulator architecture only
-k, --original-revert Revert placed binaries back to their original binaries
-v, --verbose Log detailed info to standard output.
-c, --check Display how ranasa recognizes the descriptions in the configuration file.
Does not cause side effects. Only outputs the configuration file.
-h, --help Show help information.
jsonファイルに必要な情報を定義する。
[
{
"linking": "dynamic",
"path": "/path/to/library"
},
{
"linking": "static",
"path": "/path/to/library"
}
]
Ranasa
をXcodeのビルドスクリプトで実行します。
Ranasa
がSDKROOTを参照して自動で適したバイナリを配置します。
ranasa -x <setting.json>
Main Author: @arasan01
Supported: DMM.com
本アプリケーションは @arasan01 がDMM.comにてiOS開発チーム内利用を目的として独自で作成したものをOSS化しました。 そのため @arasan01 がDMM.comにて開発に関わっている間のメンテナンスは行っていきます。
もし何らかの事情により保守がされなくなった場合に、継続して利用したいユーザによる開発・保守を希望する場合はIssueで正式なFork先を提案してください。READMEに移行先を記載します。
Pull RequestかIssueにて提案してください。
Copyright 2021 DMM.com LLC. Licensed under the MIT License.
DMM.comではモバイルアプリ開発者の採用を強化しています。
私達と一緒にDMMで開発をしませんか?
興味があれば気軽にお話しましょう!
DMMエンジニア採用