11/08/2024 16:35:55
解决方案
一、背景
Google Play Store 要求 2022 年 8 月之后上线、11 月之后更新的 App 必须升级到 Target API 31。
参考资料:
https://developer.android.com/google/play/requirements/target-sdk
Starting in August 2022, new apps must target API level 31 (Android 12) or above and adjust for behavioral changes. Wear OS apps must target API level 28 or higher.Starting in November 2022, app updates must target API level 31 or above and adjust for behavioral changes in Android 12.
https://support.google.com/googleplay/android-developer/answer/11926878?hl=en
二、如何升级到 Target API 31
简单说,将编译的 targetSdkVersion
的值修改为 31
即可。
2.1 Android Studio 及 Gradle 编译工程
一般在 App 目录中的 build.gradle
文件中,修改 android
-> defaultConfig
->targetSdkVersion
的值为 31
即可,如:
2.2 Unity 项目
在 Unity 菜单 File
-> Build Settings ...
弹窗中,Platform
选中 Android
,在 Player Settings ...
中打开 Inspector
面板中,找到 Other Settings
-> Target API Level
中进行设定。
2.3 UnrealEngine 项目
在 UnrealEngine 菜单 File
-> Package Project
-> Packaging Settings...
中打开弹窗,
并在找到 Platforms
-> Android
配置项,修改对应的配置。
三、配置及处理
3.1 安全和隐私设置变更——位置信息
在 Android 12(API 级别 31)或更高版本中,用户可以请求该应用只检索大致位置信息(即仅给予应用ACCESS_COARSE_LOCATION权限),即使该应用请求 ACCESS_FINE_LOCATION 运行时权限也是如此。
关于请求位置权限的官方文档:https://developer.android.com/training/location/permissions#approximate-request
注意:必须在单个运行时请求中同时包含 ACCESS_COARSE_LOCATION 权限及 ACCESS_FINE_LOCATION 权限
1)权限声明
在 AndroidManifest.xml 文件中声明 ACCESS_COARSE_LOCATION 权限 及 ACCESS_FINE_LOCATION 权限。
//权限声明
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
2)处理定位低精度的情况
当应用的 target API 为31时,对于 Android12 的用户,若用户仅给予获取大致位置的权限,受 GPS 信号强度影响,可能导致定位的精度过低,甚至可能出现定位超时失败的情况,为提高定位成功率及精确度,业务可适当引导用户开启精确位置信息。
3)关于隐私合规的说明
为了提供定位的成功率,采用了两个系统 API 来获取附近的基站信息进行辅助定位,具体方式是:优先使用更高版本的 getAllCellInfo,若失败则使用 getCellLocation。此处需要对相关合规进行说明:若 getAllCellInfo 失败则会增加一次获取基站信息的接口调用。
3.2 组件导出的变更
当应用以 Android 12 或更高版本为目标平台,且包含使用 intent 过滤器的 activity、服务或广播接收器,则必须为上述组件显式地声明 android:exported
属性。MSDK 已经对内部各个组件进行了相应的处理,无需应用进行相关配置。
3.3 WebView中的现代 SameSite Cookie 变更
当应用以 Android 12(API 级别 31)或更高版本为目标平台时,WebView 中会包含关于第三方 Cookie 处理方式的变更,应用需关注在需要时使用适当的值对 Cookie 中的 SameSite 属性进行显式的设置,详细的变更说明可参见下方链接。
关于WebView变更的官方文档:https://developer.android.com/about/versions/12/behavior-changes-12#samesite
3.4 关于包可见性的说明
若应用以 Android 11 或更高版本为目标平台,且有拉起其他应用进行登录、分享等操作的应用场景,则应用需要在自身的 AndroidManifest.xml 中添加 <queries>
元素,并声明相应的应用包名。
<manifest package="com.example.game">
<queries>
<!-- 指定QQ的包名,可拉起QQ相关的应用进行相应的操作 -->
<package android:name="com.tencent.mobileqq" />
<package android:name="com.tencent.tim" />
<package android:name="com.tencent.minihd.qq" />
<package android:name="com.tencent.qqlite" />
<!-- 指定微信的包名,可拉起微信进行相应的操作 -->
<package android:name="com.tencent.mm" />
<!-- 指定twitter的包名,可拉起twitter进行相应的操作 -->
<package android:name="com.twitter.android" />
<!-- 指定facebook的包名,可拉起facebook相关的应用进行相应的操作 -->
<package android:name="com.facebook.katana" />
<package android:name="com.facebook.lite" />
<package android:name="com.facebook.orca" />
...
</queries>
...
</manifest>
接入 MSDK 不同插件时使用到的包名可见链接: https://docs.msdk.qq.com/v5/zh-CN/FAQS/a69f6882042ddb9e04b8ba73f37404dc/6c6fa88eaf6f031730bc19ff125ce4cd.html
关于包可见性的官方文档:https://developer.android.com/training/package-visibility/declaring
四、组件 SDK 升级
4.1 Garena
1)版本要求
Garena 的 SDK 版本需 >= 4.0.21。
2)升级方法
使用新版本插件替换原插件。
4.2 facebook
1)版本要求
facebook 必须升级到 12.2.0 以上版本。
2)升级方法
使用新版本插件替换原插件。
五、升级注意事项
5.1 Gradle版本要求
target api 升级到 30 及以上时,使用<queries>
标签时需要 Gradle 插件版本至少为 3.3.3,Gradle 版本至少为 4.10.1,若不符合条件,则编译时报 xml 文件合并的错误:
> Task :app:processDemoDebugManifest FAILED
> Error: Missing 'package' key attribute on element package at AndroidManifest.xml:...
解决方案:
升级 Android Gradle 插件版本到 3.3.3 或以上,Gradle 版本到 4.10.1 或以上。
All rights reserved.