AndroidでAPKを直接インストールできない

2023年5月28日

問題発生

なぜか、apkファイルをネットからダウンロードしてインストールしようとすると、次のようなエラーが出るようになった。

パッケージが無効の可能性があるため、アプリをインストールできませんでした。

言語を英語にすると、次のメッセージになる。

App not installed as package appears to be invalid

何かしらファイルが壊れているかのように思えてしまうメッセージだが、結論から言えば全く壊れていない。以前にインストールしてアンインストールしたバージョンよりも、今回インストールしようとしたバージョンが古いせいだった。

詳細エラーの取得

この場合には、開発環境からインストールすると、詳細なメッセージが得られるそうなので、やってみる。

スマフォ側をUSBデバッグ有効にし、PCと接続し(その際、スマフォ側に許可するかという警告が出る)、あとはadbコマンドを使ってPCからインストールする。すると。。。

$ adb install F-Droid.apk
Performing Streamed Install
adb: failed to install F-Droid.apk: Failure [INSTALL_FAILED_VERSION_DOWNGRADE: Downgrade detected: Update version code 1015056 is older than current 1016053]

今インストールしようとしているバージョンが、存在しないはずのパッケージのバージョンより古いというのだ。このアプリはアンインストールしてあるので、システムのどこかに「バージョン番号の記録」でもあるのだろうか?

F-Droidのバージョンが違う

問題としては以下だ。

  • F-Droidはアンインストールされているにも関わらず、どこかにバージョン番号の記録があるらしい。
  • 最新のF-Droid.apkをダウンロードし、それは(既にアンインストール済の)1016053と同じかそれより新しいはずなのに、なぜか1015056だと言っている。

Apkのバージョン番号を知る

ここにapkのバージョン番号を知る方法がある。

$ sudo apt install aapt
$ aapt dump badging F-Droid.apk
package: name='org.fdroid.fdroid' versionCode='1015056' versionName='1.15.6' compileSdkVersion='30' compileSdkVersionCodename='11'
install-location:'auto'
sdkVersion:'22'
....

たしかにバージョン番号がおかしい。F-Droidのウェブサイトに置かれているものが間違っているようだ。以下からダウンロードしたのだが、実際には、1015056になっている。

https://f-droid.org/packages/org.fdroid.fdroid/

最新のものをダウンロード

その下のバージョン履歴のところを見てみると、たしかに最新の1016053があり、ここからダウンロードする。

$ adb install org.fdroid.fdroid_1016053.apk
Performing Streamed Install
Success

これでインストールに成功した。

どこにバージョン番号が記憶されているのか?

今インストールした最新バージョンをいったんアンインストールして、再度古いバージョンをインストールしてみる。

$ adb install F-Droid.apk
Performing Streamed Install
adb: failed to install F-Droid.apk: Failure [INSTALL_FAILED_VERSION_DOWNGRADE: Downgrade detected: Update version code 1015056 is older than current 1016053]

結果は同じだ。アプリをアンインストールしても、どこかにバージョン番号が格納されており、それ以前のものは拒否されてしまう。

アプリのバージョン番号を消す

アプリをアンインストールしても、そのバージョン番号は残っている。これは、設定>アプリ>すべてのアプリを表示で、F-Droidあるいは、org.fdroid.fdroidという名前で表示されている。

右上のメニューから消すことができる。

すると、アプリ一覧から消えてしまい、バージョン番号もなくなってしまう。

古いバージョンをインストールした後にアップデート

あとはどんなバージョンでもインストールでき、上位バージョンで更新できるようだ。

$ adb install F-Droid.apk
Performing Streamed Install
Success
$ adb install org.fdroid.fdroid_1016053.apk
Performing Streamed Install
Success

F-Droidにバージョンが間違っていると教える

このままではあんまりなので、メールで「バージョン間違っとるよ!」と教えておいた。