前言
最近的项目要在海外运营,首先要上架 Google Play,但是手上的项目是国内的代码,为了上架可以说是踩了不少坑,这里简单记录一下。
1、 升级 targetSdkVersion 31
Manifest merger failed : Apps targeting Android 12 and higher are required to specify an explicit value for android:exported
when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details.
升级完之后就报了这个错误,其实提示已经很明显了,google 要求 Android 12 之后,Manifest 文件中带有 <intent-filter> 的组件需申明 android:exported 属性。
-
修改后
- 问题是,我已经把 Manifest 文件,所有带 <intent-filter> 的四大组件都加上了 android:exported 属性,还是报错,于是 analyze 打出的 apk (Build -> Analyze Apk),查看打包之后的 Manifest 文件,这里可以看到所有注册的组件,如果是第三方SDK注册的组件未申明 android:exported 属性的话,copy 一份到工程 Manifest,添加上即可(参考上图)。
2、 Google内购
- Google上架,在审核代码的时候,会要求代码中包含
<uses-permission android:name="com.android.vending.BILLING" />
APP内购买的权限,如何集成内购,可以参考这个链接 将 Google Play 结算库集成到您的应用中 | Google Play 结算系统 | Android Developers
- 这里需要注意的是,如果 App 未上架或者未审核通过,是没办法通过 Api 查询到商品列表或者商品详情的。App 至少需要面向开发者全面发布,才能正常查询商品详情。另外,查询商品的 Product Id 必须和 Google 管理平台 添加商品时的商品 ID 一致。
- 然后在谷歌管理平台添加开发者账号,Google 会给开发者分配一张虚拟的测试卡,可以正常唤起支付弹窗并且允许跳过实际支付过程。
- 在测试机上的 Google Play 登录测试账号,只要应用通过审核,这时候就可以调起内购的弹窗了。
3、SSL Error Handler
在审核的时候,google 反馈了这个问题,直接看下面代码
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
// super.onReceivedSslError(view, handler, error); //一定要去掉
// handler.cancel();// Android默认的处理方式
handler.proceed();// 接受所有网站的证书
// handleMessage(Message msg);// 进行其他处理
}
});
这里接受所有网站证书,google 认为是个安全漏洞,最简单的办法就是全局搜索一下这个方法,去掉,或者弹窗让用户选择是否接受不安全的网站证书。
4、 第三方SDK
嗯…百度翻译一波…
通过Google Play发布的应用程序不得使用Google Play更新机制以外的任何方法修改、替换或更新自身。同样,应用程序可能不会从Google Play以外的源下载可执行代码(例如dex、JAR、.so文件)。此限制不适用于在虚拟机或解释器中运行的代码,其中提供对Android API(如Web视图或浏览器中的JavaScript)的间接访问。
在运行时加载的具有解释语言(JavaScript、Python、Lua等)的应用程序或第三方代码(如SDK)(如未与应用程序打包)不得允许潜在违反Google Play政策。请注意,您对应用程序的各个方面负责;通过在应用程序中使用SDK,您需要对SDK在应用程序内的行为负责。
总之 google 不允许应用有自动更新的行为,像国内热修复等补丁功能,google 是严令禁止的,于是项目拿掉了像 bugly,友盟,百度统计,阿里云日志,阿里云人脸识别,百度人脸识别,等可能读取用户信息和自动更新的第三方SDK。
5、 Huawei Mobile Services SDK
嗯…再百度翻译一波…
您的应用程序包含不符合设备和网络滥用政策的内容。我们发现您的应用程序使用的是不兼容版本的华为移动服务SDK,该SDK包含从Google Play之外的未知来源下载或安装应用程序的代码。
鉴于SDK的性质,请将其从提交到Play Store的应用程序版本中删除。
这个问题可以说是非常严重,直接导致我们的应用封停了。也就是说之前上架的版本也会被迫下架……上面说到了,谷歌严令禁止代码中存在动态更新的行为,这里说使用了不兼容的华为移动服务SDK,该SDK包含从Google Play之外的未知来源下载或安装应用程序的代码。笔者第一个想到的是 Huawei Maven 仓库。
maven { url 'http://developer.huawei.com/repo/'}
其次,笔者还拿掉了跟华为相关的推送SDK(顺手拿掉了魅族,小米,OPPO,VIVO,相关推送的 SDK)
implementation 'com.huawei.hms:push:6.3.0.302'
Huawei 相关第三方库
implementation 'com.llew.huawei:verifier:1.0.3'
这个库是为了修复华为 Register too many Broadcast Receivers 的崩溃的,可能被 Google 识别为动态修复的代码了吧。
还有一个适配桌面未读消息的角标的库
implementation "me.leolin:ShortcutBadger:1.1.17@aar"
从 manifest 文件看到它申请了一系列华为的权限,没办法先拿掉吧。
6、 不安全的加密模式
7、 不安全的解压缩模式
这里简单说一下,Google 只是建议我们按照给的参考文档,修改这两个问题,但并不强制。想优化的直接点进去 Google 帮助中心文章 参考修改就行了。
8、 登录凭据无效或不完整
为了审核您的应用是否符合开发者计划政策,我们需要您提供该应用的有效登录凭据以及审核该应用所需的任何其他资源。具体问题如下:
- 您未向我们提供访问您的应用所需的有效演示/访客帐号或有效用户名和密码。
解决:一定要记得在 Google 后台添加测试需要的账号密码,具体看截图。
Google 会登录开发者提供的账号密码测试应用功能的完整性,到了这一步,基本上审核通过问题不大。到这里笔者的项目算是顺利上架了,也希望这篇文章给需要上 Google Play 的打工人提供点点的帮助。加油,只要思想不滑坡,办法总比困难多……