前情回顾

话说直接修改程序项目的 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="&quot;$(ApkSigner)&quot; 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,之二相关推荐

  1. Delphi 和 C++Builder 免费社区版更新至 10.4.2 版现已发布!

    Delphi 和 C++Builder 的免费且功能齐全的社区版旨在帮助您开始编程.这些强大的 IDE 提供了快速探索强大的应用程序开发所需的所有功能. 社区版发布后,社区中的学生和爱好者可以免费使用 ...

  2. android控件复制,修改Delphi 10.1.2 edit控件在android的复制、剪切和粘贴样式

    Delphi 10.1.2 edit控件在android默认的复制.剪切和粘贴样式太丑,经悟能-DelphiTeacher的提示,用最简单的代码修改后稍有改观. 默认的样式: 修改后的样式: 修改FM ...

  3. 联想Z5刷android11,联想Z5 Pro GT升级安卓10 ZUI_11.5.141稳定版-支持TWRP偷渡升级

    联想Z5proGT是全款首款骁龙855手机,出色的屏占比和滑轨设计,而近期联想活动很多 售价自然也很给力.PDD各种神车,购买的用户也很庞大,联想官方自然也十分重视这款 855手机,目前为其推送了官方 ...

  4. 使用IntelliJ IDEA 社区版开发Android 应用安装和设置指南

    要开始开发Android应用程序,必须建立一个合适的开发环境.它有助于开发人员使用创建应用程序所需的工具,并确保所有操作/流程以顺畅的方式进行.IDE(集成开发环境)是一个完整的应用程序套件,提供编写 ...

  5. PyCharm社区版支持深度学习_深度学习,大家都看哪些社区论坛?

    对代码.编程感兴趣的可以加我公众号<老K玩代码>,和我交流! " 学习Python,有一半的小伙伴是冲着深度学习来的. 自学虽好,但还是需要有人指点. 那有没有什么研究深度学习的 ...

  6. PyCharm社区版支持深度学习_在Windows的Ubuntu子系统运行支持CUDA的深度学习代码

    2020年6月,微软公布了Windows Subsystem for Linux 2的最新更新,全面支持CUDA和N卡GPU.在Windows上跑Ubuntu子系统并在其中运行GPU加速的深度学习代码 ...

  7. 10_10_安卓加linux命令,Scrcpy 1.11版支持Android 10及多点触控手势,附Linux下安装命令...

    Scrcpy 1.11版本增加了对Android 10的支持及多点触控手势,现在就可以在Linux系统下安装Scrcpy的更新版本,该工具可让你在PC上镜像Android手机. 更新说明 Scrcpy ...

  8. IDEA 社区版不支持 Tomcat?一招完美解决!

    作者 | 郑祎 责编 | Elle 出品 | CSDN(ID:CSDNnews) 前言 IntelliJ IDEA Community Edition(社区版)不支持Tomcat,不想花钱购买Ulti ...

  9. 玩转 Tanzu Community Edition(社区版)

    Tanzu Kubernetes Grid (TKG) 是 Tanzu 产品家族中的运行时基石,作为VMware 的 Kubernetes 企业发行版本,可以在私有云和公有云多种云环境中部署,为用户提 ...

  10. Navicat!OceanBase社区版新朋友来啦!

    引言: 近期,Navicat Premium 16.1与Navicat for MySQL 16.1版本,将新增 OceanBase 社区版兼容功能,为用户在使用 OceanBase 社区版迁移过程中 ...

最新文章

  1. 2019春季学期期末总结
  2. deform_conv_cuda windows编译
  3. ubuntu16.04上安装valgrind
  4. sqlserver sa
  5. 移动端touch与click
  6. 如果不是心中还有梦,又能忍住多少痛?
  7. 网络适配器输入的IP地址 已经分配给另一个适配器
  8. 华为认证hcia含金量_【华为认证】HCIA-DATACOM史上最全精选题库(附答案解析)...
  9. 《视觉SLAM十四讲》课后习题—ch3
  10. CF1082E Increasing Frequency (multiset+乱搞+贪心)
  11. linux部署moodle
  12. 求点到线段的最短距离(QT)
  13. 1553B总线通信协议
  14. Unity 按住A键更改鼠标光标样式
  15. 《给青年的十二封信》1-谈读书—朱光潜
  16. 深信服上网行为管理系统如何配置短信?
  17. 涉密学位论文不得在联网的计算机上撰写,华南理工大学涉密学位论文管理暂行规定.doc...
  18. 利用telnet发送邮件遇到554 DT:SPM错误提示
  19. python flask框架下登录注册界面_Python-用户登录 Flask-Login
  20. 恒生电子测试总部面经

热门文章

  1. Python——彩票(大乐透)模拟随机选号
  2. adb通过USB或wifi连接手机
  3. 内存管理单元(MMU)与内存控制器
  4. Qt文档阅读笔记-QCustom3DLabel使用及Q3DSurface基本信号
  5. 智能推送LeetCode中文站点题目思路解析
  6. java 微信红包_教你用java做个微信红包!
  7. 简单通用的Makefile编写例子
  8. 大数据项目实时数据采集流程步骤分析
  9. 18个Python爬虫实战案例
  10. STM32F407控制舵机