Delphi 10.4.2 社区版,安装后,最高支持到安卓10,API-29。
但是,现在如果想发布到 Google play,需要:
1. 必须是 APP bundle 文件,也就是 AAB 文件,而不能是 APK;
2. 必须是最低支持 API-30;
上网搜索各种说法,最终还是自己解决。Delphi 盒子论坛的 "emailx45"提供了很多思路和帮助。
记录一下,如果有人遇到相似问题,可以看这里。
一. 如何编译 AAB:
一开始查到的网页是 Marco Cantu 的博客文章,说的是 Delphi 10.3.3,在 Delphi IDE 的菜单:Project / Options / Building / Delphi compiler / Compiling / 底下,有一个:
Other options -- Generate Android bundle file, 勾选。
然后在 Delphi 10.4.2 的相同位置,没有这个,只有:Generate Android 32bit and 64bit binaries 可以勾选。但勾选后,依然没有编译出 AAB 文件,仍然是 APK 文件。
后来才发现,其实只要在 IDE 窗口右边的 Project 名字底下的编译目标平台那里,除了选择 Android 64,还要选择 Configuration 为 Application store,它就会生成 AAB 文件。
二. 如何提升编译出来的 AAB 的 API-LEVEL 为 30:
上述编译出来的 AAB 文件,上传到 Google Play ,会提示错误信息 API-LEVEL 为29,最低必须是 30.
Delphi 10.4.2 安装的目录底下有 Android SDK,目录:
C:\Users\Public\Documents\Embarcadero\Studio\21.0\CatalogRepository\AndroidSDK-2525-21.0.40680.4203
这底下,有一个 【SDK Manager.exe】,双击运行它,出了一个 GUI 界面。里面列出了已经安装以及没有安装但可以勾选安装的一堆包,但最高就是 Android 10(API-29)。想装 API-30,这里没有。
上网搜,官方的说法是安装 Android Studio,然后用里面提供的 SDK Manager 来安装。
不想装 Android Studio,太大。
如何安装 Android SDK 支持 API-30
继续网上搜索,有提到使用命令行的 SDK Manager。
在 C:\Users\Public\Documents\Embarcadero\Studio\21.0\CatalogRepository\AndroidSDK-2525-21.0.40680.4203 底下搜索 sdk manager,结果发现有两个 BAT 文件:
1. C:\Users\Public\Documents\Embarcadero\Studio\21.0\CatalogRepository\AndroidSDK-2525-21.0.40680.4203\cmdline-tools\bin 底下有一个 sdkmanager.bat
2. C:\Users\Public\Documents\Embarcadero\Studio\21.0\CatalogRepository\AndroidSDK-2525-21.0.40680.4203\tools\bin 底下有一个 sdkmanager.bat
执行第一个 sdkmanager.bat,结果出错。
执行第二个,也就是 tools 目录底下那个,而不是 cmdline-tools 底下那个,成功。
根据 google 官方文档的例子,在 CMD 里面,在 tools 目录下,手动执行以下命令,成功:
sdkmanager "platform-tools" "platforms;android-30"
成功后,可以看到,在执行成功之前,目录:
C:\Users\Public\Documents\Embarcadero\Studio\21.0\CatalogRepository\AndroidSDK-2525-21.0.40680.4203\platforms
底下,只有一个 android-29 目录。
执行成功后,多了一个 android-30 目录。
到这里,为系统增加支持 API-30 的 SDK 成功。
三. Delphi 如何设置才能编译出支持 Android API-30 的 AAB 用于上传 Google Play 发布:
1. Delphi IDE 的菜单,Tools / Options ,打开一个窗口。
2. 在上述窗口中,在左侧找到 Deployment,拉开,底下有一个 SDK manager,选中这个 SDK manager,右侧出来的界面,里面有 Android-32bit 和 Android 64-bit,选中 64bit,右侧有多条选项,最底下一条是 API level,它指向一个目录。打开目录,发现是:
C:\Users\Public\Documents\Embarcadero\Studio\21.0\CatalogRepository\AndroidSDK-2525-21.0.40680.4203\platforms\android-29
修改它指向 Android-30:
C:\Users\Public\Documents\Embarcadero\Studio\21.0\CatalogRepository\AndroidSDK-2525-21.0.40680.4203\platforms\android-30
3. 重点来了,做完上述修改,build 然后 deploy,发现出来的 AAB,上传到 google,依然提示是 API-29 的。查看该 Project 目录底下的:AndroidManifest.xml 文件,其中有一句:
<uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="29" />
这里依然是 29,所以...........
4. 不知道 Delphi 哪里可以修改设置。那就直接修改模板文件:AndroidManifest.template.xml
模板文件里面有这么一行:
android:targetSdkVersion="%targetSdkVersion%"
直接将它写死为:
android:targetSdkVersion="30"
5. 再次编译,然后 deploy,成功。得到的 AAB 文件上传到 Google Play,通过。
----------------------------------------
折腾了 2 天。关于 Delphi 的资料,网上太少。
---------------------------------------
追加:
昨天搞得太晚,上传 google play 成功,就没再继续测试了。今天继续测试的结果如下:
修改 AndroidManifest.xml 里面的 android:targetSdkVersion="29" 改为 android:targetSdkVersion="30",可以通过 google play 关于最低 API level 的要求。
但是,在我自己的真机上测试,把编译的 Configuration 从 Application store 改为 Development 后,插上 OPPO 手机,手机显示安卓版本 11,编译发布到真机上,安装 APP失败。显示的错误信息是:INSTALL_PARSE_FAILED_NO_CERTIFICATES
反复测试,确认这个 INSTALL_PARSE_FAILED_NO_CERTIFICATES 的问题是修改 android:targetSdkVersion="29" 导致。
因此,是否上传 google play 成功,但实际上从 google play 下载安装 APP 的时候,也会失败?需要进一步测试才能知道。
又及:
xamarin.android - Xamarin App - Can't deploy to Android 11 emulator - Stack Overflow
这篇文章提到
"Apps that target Android 11 (API level 30) that are currently only signed using APK Signature Scheme v1 must now also be signed using APK Signature Scheme v2 or higher. Users can't install or update apps that are only signed with APK Signature Scheme v1 on devices that run Android 11."
也就是说,针对 API level 30 必须升级签名。看起来只能通过升级 Delphi 到 11 版来解决了。