Delphi 10.4.2 CE 社区版支持 Android API-30,之二
前情回顾
话说直接修改程序项目的 AndroidManifest.template.xml,将 API-level 从通配符改为写死的 30 后,可以编译发布出 AAB 文件,而且这个 AAB 文件上传到 Google play 它没提示 API-level 是 29 不合格,算是通过了。但是,如果选择程序项目的 Configuration 为 Development,手机插上电脑,重新编译发布安装到手机上,安装失败,错误提示:INSTALL_PARSE_FAILED_NO_CERTIFICATES。
解决方法
俺满世界搜索,用尽了各种搜索工具,搜了一堆东西出来,有类似的问题,但都是 Xamarin 的或者其它什么鬼开发工具的,没有 Delphi 的。找不到答案。
然后去了一个德国的 Delphi 论坛发了个帖子提问,然后有个大神给出了解决方案。一试,果然有效。这是那个德国网站我发的帖子的地址:
https://en.delphipraxis.net/topic/5883-delphi-1042-ce-support-android-api-30/
这里总结一下具体的原因和做法:
原因:
It's because Delphi 10.4.2 is using Jarsigner instead of APKSigner
解决办法:
For sign apk by Jarsigner ( APK Signature Scheme v2 ) you need:
1. Edit CodeGear.Deployment.Targets add section:
<Target Name="_AndroidApkSigner" Condition="('$(Platform)'=='$(cAndroid32ArmPlatform)' Or '$(Platform)'=='$(cAndroid64ArmPlatform)') And '$(KeyStoreFile)'!='' And '$(AndroidAppBundle)'=='false'"><Message Text="Start Apk Signer."/><Exec Command=""$(ApkSigner)" sign --ks $(KeyStoreFile) --ks-pass pass:$(KeyStorePass) $(SIGNED_APK_FILENAME)" ContinueOnError="True"><Output TaskParameter="ExitCode" PropertyName="ErrorCode"/><Output TaskParameter="StdOutEncoding" PropertyName="StdOut"/></Exec></Target>
2. add line _AndroidApkSigner; in section <DeployDependsOnTargets>
<PropertyGroup><DeployDependsOnTargets>..._CheckKeyStore;_AndroidSign;_AndroidZipAlign;_AndroidApkSigner; _CheckAPKFileOutputResult;_CheckAABFileOutputResult;_DeleteAndroidAssetsInfoFile;...</DeployDependsOnTargets>
备注:CodeGear.Deployment.Targets 这个文件,在 Delphi 的安装目录底下。
3. Create New IDE Environment Variable ApkSigner with value (SDK path)\android-sdk-windows\build-tools\29.0.2\apksigner.bat
比较修改前和修改后的 CodeGear.Deployment.Targets 文件
总结一下
简单说来,对于 Delphi 10.4.2 编译发布的 Android 程序,要支持到 API-level 30,需要做:
1. 修改 AndroidManifest.template.xml,将原本的:
<uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" />
修改为:
<uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="30" />
然后 Build 以后,创建的 AndroidManifest.xml 文件的内容就从原本的:
<uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="29" />
自动变成了:
<uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="30" />
2. Delphi 原本安装时带来的 SDK 支持的平台只有29,路径如下:
C:\Users\Public\Documents\Embarcadero\Studio\21.0\CatalogRepository\AndroidSDK-2525-21.0.40680.4203\platforms\android-29
需要执行 SDKManager.bat 去下载升级30的,升级方法见上一篇文章,升级后在以下路径:
C:\Users\Public\Documents\Embarcadero\Studio\21.0\CatalogRepository\AndroidSDK-2525-21.0.40680.4203\platforms
底下有两个文件夹,一个是原来就有的 android-29,一个是新增的 android-30
然后修改 DELPHI IDE 菜单里面关于安卓的 SDK 的 API-level 的指向的配置。做法见上一篇文章。
3. 最后就是修改签名方式,如本文前面所述。
最后一个坑
按照上述方式,新建一个 FireMonkey 工程,编译目标选择安卓64,没有任何问题。不管是 Development 模式下直接安装到手机里面,还是 Application store 模式下编译发布为 AAB 文件,一切顺利。
但对于我的一个老的工程,在 debug 模式下没有问题,在 Release 模式下,用 Development 方式编译安装到手机里面,INSTALL_PARSE_FAILED_NO_CERTIFICATES 这个错误依然存在,安装失败。拿它的 xml 文件和安装成功的工程的 xml 文件仔细来回对比,看不出哪里有不对。
于是,俺干脆重建一个新的工程,把老工程的所有代码都加进去,对于这个新工程,同样做如上描述的修改,编译发布安装到手机成功,并且 APP 运行也很正常。
备注一个小问题
我的老工程,有个函数里面,定义了一个局部变量,整数类型。该函数里面用到那个变量之前,没有做初始化。通常 Delphi 会自动把整数初始化为 0. 之前在安卓下,API level 为 29,程序运行没有任何问题。但只要改为 30,就有问题。追查好久才发现是该变量没有初始化导致。在函数一开始给该变量赋值 0,然后在 API level 30 下编译跑起来,问题消失。
经验教训总结:局部变量一定要自己用代码初始化,不要依赖 Delphi 编译器的默认。
Delphi 10.4.2 CE 社区版支持 Android API-30,之二相关推荐
- Delphi 和 C++Builder 免费社区版更新至 10.4.2 版现已发布!
Delphi 和 C++Builder 的免费且功能齐全的社区版旨在帮助您开始编程.这些强大的 IDE 提供了快速探索强大的应用程序开发所需的所有功能. 社区版发布后,社区中的学生和爱好者可以免费使用 ...
- android控件复制,修改Delphi 10.1.2 edit控件在android的复制、剪切和粘贴样式
Delphi 10.1.2 edit控件在android默认的复制.剪切和粘贴样式太丑,经悟能-DelphiTeacher的提示,用最简单的代码修改后稍有改观. 默认的样式: 修改后的样式: 修改FM ...
- 联想Z5刷android11,联想Z5 Pro GT升级安卓10 ZUI_11.5.141稳定版-支持TWRP偷渡升级
联想Z5proGT是全款首款骁龙855手机,出色的屏占比和滑轨设计,而近期联想活动很多 售价自然也很给力.PDD各种神车,购买的用户也很庞大,联想官方自然也十分重视这款 855手机,目前为其推送了官方 ...
- 使用IntelliJ IDEA 社区版开发Android 应用安装和设置指南
要开始开发Android应用程序,必须建立一个合适的开发环境.它有助于开发人员使用创建应用程序所需的工具,并确保所有操作/流程以顺畅的方式进行.IDE(集成开发环境)是一个完整的应用程序套件,提供编写 ...
- PyCharm社区版支持深度学习_深度学习,大家都看哪些社区论坛?
对代码.编程感兴趣的可以加我公众号<老K玩代码>,和我交流! " 学习Python,有一半的小伙伴是冲着深度学习来的. 自学虽好,但还是需要有人指点. 那有没有什么研究深度学习的 ...
- PyCharm社区版支持深度学习_在Windows的Ubuntu子系统运行支持CUDA的深度学习代码
2020年6月,微软公布了Windows Subsystem for Linux 2的最新更新,全面支持CUDA和N卡GPU.在Windows上跑Ubuntu子系统并在其中运行GPU加速的深度学习代码 ...
- 10_10_安卓加linux命令,Scrcpy 1.11版支持Android 10及多点触控手势,附Linux下安装命令...
Scrcpy 1.11版本增加了对Android 10的支持及多点触控手势,现在就可以在Linux系统下安装Scrcpy的更新版本,该工具可让你在PC上镜像Android手机. 更新说明 Scrcpy ...
- IDEA 社区版不支持 Tomcat?一招完美解决!
作者 | 郑祎 责编 | Elle 出品 | CSDN(ID:CSDNnews) 前言 IntelliJ IDEA Community Edition(社区版)不支持Tomcat,不想花钱购买Ulti ...
- 玩转 Tanzu Community Edition(社区版)
Tanzu Kubernetes Grid (TKG) 是 Tanzu 产品家族中的运行时基石,作为VMware 的 Kubernetes 企业发行版本,可以在私有云和公有云多种云环境中部署,为用户提 ...
- Navicat!OceanBase社区版新朋友来啦!
引言: 近期,Navicat Premium 16.1与Navicat for MySQL 16.1版本,将新增 OceanBase 社区版兼容功能,为用户在使用 OceanBase 社区版迁移过程中 ...
最新文章
- 2019春季学期期末总结
- deform_conv_cuda windows编译
- ubuntu16.04上安装valgrind
- sqlserver sa
- 移动端touch与click
- 如果不是心中还有梦,又能忍住多少痛?
- 网络适配器输入的IP地址 已经分配给另一个适配器
- 华为认证hcia含金量_【华为认证】HCIA-DATACOM史上最全精选题库(附答案解析)...
- 《视觉SLAM十四讲》课后习题—ch3
- CF1082E Increasing Frequency (multiset+乱搞+贪心)
- linux部署moodle
- 求点到线段的最短距离(QT)
- 1553B总线通信协议
- Unity 按住A键更改鼠标光标样式
- 《给青年的十二封信》1-谈读书—朱光潜
- 深信服上网行为管理系统如何配置短信?
- 涉密学位论文不得在联网的计算机上撰写,华南理工大学涉密学位论文管理暂行规定.doc...
- 利用telnet发送邮件遇到554 DT:SPM错误提示
- python flask框架下登录注册界面_Python-用户登录 Flask-Login
- 恒生电子测试总部面经