armeabi-v7a向けのアプリのmod apkを作りarm64-v8a端末で実行
経緯
とある9年前の古いAndroidアプリを実行してみたいと思い、F-Droidに残っていたのでインストールして実行してみたが実行時エラーでうまく動かなかった。
ソースコードも見てみるとどうやら armeabi-v7a 向けにしかビルドされてないっぽく、Nexus 5を引っ張り出してきてインストールしてみると無事動いた。
つまりarm64-v8a向けも含めてビルドすれば動くっぽいのだがソースコードがあっても9年前ともなるとビルド環境を整えるのが厳しい、しかし、armeabi-v7a(32bit)とarm64-v8a(64bit)は互換性があるらしくarm64-v8aでも適切にarmeabi-v7a向け****.soをロードすれば実行できることに気づいたのでmod apkを作ってなんとかしてみることにした。
mod apk とは
apk ファイルを改変して色々するやつ
assets を入れ替えてPCゲームのmodみたいにテクスチャを入れ替えたりするものからソースコードを改変して動作を変えたりといったことが行われている。
既存のアプリの機能を変更して便利にしたりゲームだとチートの手法として行われたりしている。
mod apk を色々配布しているサイトもあるがなにを仕込まれているかわかったもんじゃないのでそのへんに落ちてるのをそのままインストールするのは絶対やめたほうがよい。
mod apk 作成
まずは F-droid から apk をダウンロードしてきて展開してみる。ファイルはこんな感じ
.
├── AndroidManifest.xml
├── LICENSE-2.0.txt
├── assets
│ └── huga
│ ├── hoge.so
│ ├── foo.so
├── classes.dex
├── lib
│ └── armeabi-v7a
│ ├── bar.so
│ ├── baz.so
│ ├── piyo.so
│ └── hage.so
├── res
...
やっぱり lib/armeabi-v7a はあるけど lib/arm64-v8a がないので作って .so をコピーしてあげれば動きそうだ。
というわけで APK Tool というソフトウェアを使って apk を展開して改変していく
APK ファイルの展開
apktool d input.apk -o output_folder
input.apkは展開したいAPKファイルの名前、output_folderは出力フォルダーの名前
展開したら lib/arm64-v8a を作って lib/armeabi-v7a の中身をコピー
再度 apk に戻す
apktool b output_folder -o new_apk_file.apk
output_folderは展開したフォルダー、new_apk_file.apkは生成したい新しいAPKファイルの名前
これで改造apkが出来上がりますが、最近の android だと署名されていないapkはインストールできないので署名します。
まだ keystore ファイルがない場合は作ります
keytool -genkey -v -keystore my-release-key.keystore -alias my_alias -keyalg RSA -keysize 2048 -validity 10000
署名
jarsigner -verbose -keystore my-release-key.keystore -signedjar signed_new_apk_file.apk new_apk_file.apk my_alias
my-release-key.keystoreはキーストアファイル、signed_new_apk_file.apkは署名付きの新しいAPKファイル名、new_apk_file.apkは生成したAPKファイル、my_aliasはキーストアのエイリアスです。
これでインストールできる apk ファイルができました。
動かしてみた。
実際に新し目の端末(Galaxy Z Fold2)にインストールして動かしてみたところ、実行時エラーがでなくなり無事アプリが使えるようになりました。
Discussion