Delphi11で作成していたアプリのコードをDelphi12でコンパイルしたところ、Windowsプラットフォームでは何の問題もなくコンパイルできるのに、Androidプラフォームではエラーが出てコンパイルできませんでした。
以下に示す3段階の対応により、無事Androidスマホにアプリをインストールできたので、記録として公開します。
対応1 エラー: E7688 プロジェクトウインドウ
まずは、このエラーが大量に出現しました。
プロジェクトウインドウのAndroid64ビットのライブラリを見ると大量の×印が付いていたので、「ライブラリ」の文字の上の右クリックのメニューでシステムファイルをデフォルトに戻すを実行して×印を一括で消します。
念のため、クリーンナップを実行してから再度コンパイルしたところ、数は減ったものの再度E7688が出現。
対応2 再びエラー: E7688 SDKマネージャ
エラーの内容は
[PAClientエラー]エラー: E7688 java.lang.UnsupportedClassVersionError: com/embarcadero/dexer/Main has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0
というものでした。なお、RadStudio12.2では、E8712になりましたが、同じ方法で解決しました。
JDKかJREの問題のようなので、ツール、オプション、配置、SDKマネージャのJavaのタブを確認したところ、2か所ともに警告印(△!)が付いていました。
これを
C:\Program Files\Java\jdk-22\bin\keytool.exe
と
C:\Program Files\Java\jdk-22\bin\jarsigner.exe
にそれぞれ修正したところ、E7688は消えてコンパイルできました。
JDKのアインストール、再インストールを覚悟していたので、意外と軽傷で済みましたが、エラーメッセージが分かりにくいと思いました。
だが、インストールできない
E7688が消えてコンパイルまではできたのですが、スマホへのインストールとアプリの起動ができませんでした。
なんとなく、Windowsプラットフォームで、アプリ起動中にコンパイルしてエラーが出てしまった時の雰囲気に似ている気がしました。
対応3 端末操作(アプリのアインストール)
この時のエラーメッセージはadbからで、
Performing Streamed Install
adb: failed to install myapp.apk: Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package *** signatures do not match previously installed version; ignoring!
というものです。
signaturesとあるので、まず[プロビジョニング]ページを確認したのですが特に問題はなさそうでした。
ネットで調べたところ、アプリのアインストールで解決するとのことだったので、端末の1台目はスマホのアプリの管理から普通にアプリをアインストールしました。
2台目は、ネットに載っていた方法でadb shell を使ってPCからスマホのアプリをアインストールしました。
結果的にはどちらも問題なく、コンパイル->インストール->起動まで行うことができました。
どちらのアインストール方法でも、IOUtils.TPath.GetPublicPathからのアクセスで作成したフォルダやファイルが消し飛んでしまうので、事前のバックアップが必要です。
adb shell を使うアプリのアインストール
アプリの一覧を得るコマンド
>adb shell “pm list packages -3”
出てきた一覧から目的のものをコピーして、アインストールコマンドを実行
>adb shell pm uninstall com.embarcadero.・・・・
ちなみにadbは以下のディレクトリにありました。
C:\Users\Public\Documents\Embarcadero\Studio\23.0\CatalogRepository\AndroidSDK-2525-23.0.51961.7529\platform-tools
今回わかったのですが、デバッグモードではDelphi11で作ったアプリをアインストールしないと、Delphi12で作ったアプリをインストールできないようです。しかし、ちゃんとしたマニフェストを作ればDelphiのバージョンが変わってもアプリをアインストールしなくてもいいんですよね?
WindowsプラットフォームならD12特有のコンポーネントを使わなければD12とD11を問題なく行ったり来たりできるようですが、Androidプラットフォームでは、簡単にはいかないようです。Skiaのコンポーネントを使いたいということもあるので、覚悟を決めてD12に移行したいと思います。