前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >AndroidP升级之路

AndroidP升级之路

原创
作者头像
Cheney
发布2020-08-19 11:27:14
1.2K0
发布2020-08-19 11:27:14
举报
文章被收录于专栏:游戏开发之路游戏开发之路

从2019年下半年,所有安卓外部应用市场强制要求应用升级到TargetVersion 28。斗破苍穹的升级过程需要分以下两步来做。

一、升级到Target23,兼容Android6.0

问题:敏感权限需要动态申请,不会安装时自动授权。详情见Android官方文档

· 如果设备运行的是 Android 5.1 或更低版本,或者应用的目标 SDK 为 22 或更低:如果您在清单中列出了危险权限,则用户必须在安装应用时授予此权限;如果他们不授予此权限,系统根本不会安装应用。

· 如果设备运行的是 Android 6.0 或更高版本,或者应用的目标 SDK 为 23 或更高:应用必须在清单中列出权限,并且它必须在运行时请求其需要的每项危险权限。用户可以授予或拒绝每项权限,且即使用户拒绝权限请求,应用仍可以继续运行有限的功能。

https://developer.android.com/training/permissions/requesting?hl=zh-cn

解决方法:

1、扫描出敏感权限的调用,有两种方法

方法1:CodeDog能够扫描出项目中所有(代码以及调用的第三方库)使用危险权限的代码。由于斗破的工程目录太大,不能直接通过他们机器扫描,需要下载CodeDog客户端,然后指定本地工程目录去扫描。

备注:由于CodeDog客户端扫描需要编译命令,而我们只能需要扫描项目中的Jar包,所以编译命令可以直接填一个无关的命令,如

扫描结果:

方法2:用jadx反解APK,然后整个代码搜索用到敏感权限的地方。

目前,API-> 敏感权限可以查看google的Android开发文档。但是敏感权限->API,这个目前没有官方文档可以查。PScout对AndroidTarget25进行了扫描,有以下结果可以参考:

https://github.com/reddr/axplorer/blob/master/permissions/api-25/framework-map-25.txt

jadx的工具可以全局搜索对应接口调用。可以先反混淆,然后代码搜索,定位到具体调用堆栈。

由于方法2列出来的涉及到敏感权限的系统接口非常之多,一个个去查找非常费时,所以我们采用了第一种方法,用CodeDog直接扫描本地工程Jar包。

1、

列出组件调用接口以及对应组件功能的关系

上述列表不全,可进一步参考CodeDog扫描结果

http://codedog.oa.com/projects/10206/codelint/issues?scan_open__current_revision=260885&author=%20&limit=12&offset=0

2、调整游戏逻辑,在使用组件功能时弹框提示权限申请。并在未获得用户授权时给予用户反馈。具体如下

1) 必须要的权限: READ|WRITE_EXTERNAL_STORAGE读写存储卡 READ_PHONE_STATE读取手机信息

处理方式: 在游戏启动后即进行检查,未授权则进行用户授权申请,用户拒绝则不能进入游戏。

2) 可选择权限: RECORD_AUDIO录音功能

WRITE_SETTING写入设置

CAMERA访问相机

处理方式: SDK本身录音失败,并不会做任何提示。上层引用需要在功能入口相应处理。同理,在写入设置和访问相机的地方也应该加上对应的功能处理。

3) 暂未使用权限: {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}定位功能 处理方式: SDK卡本身含有这些权限,但是上层功能现在未调用。可以在Android工程及C#里面预埋请求权限的接口。以便热更时候能做动态申请。

注意下危险权限 READ|WRITE_EXTERNAL_STORAGE

Starting in API level 19, this permission is not required to read/write files in your application-specific directories returned byContext.getExternalFilesDir(String) and Context.getExternalCacheDir().

简单来说就是,如果应用需要访问自己/sdcard/Android/data/包名/ Xxx,不需要申请会自动获得。但是访问本应用以外的SD卡目录就需要。

3、特殊权限 WRITE_SETTINGS

特殊权限(Special Permissions)

Special Permissions

SYSTEM_ALERT_WINDOW 设置悬浮窗

WRITE_SETTINGS 修改系统设置

看权限名就知道特殊权限危险权限更危险,特殊权限需要在manifest中申请并且通过发送Intent让用户在设置界面进行勾选.

申请权限示例

2、 其他文件扫描

注意下,无论是CodeDog还是IPT,只能扫描到java代码一层,对于Native的调用,无法扫描得到。目前除了只能根据项目中已有的so以及结合项目自身的功能,同组件方确认有没有危险权限调用。

二、升级到Target28,需要兼容AndroidP

问题:AndroidPlugin工程,采用Target26编译

解决:这个其实无关精要,因为导出来的ApolloTest.jar,里面是纯粹的Java代码,不包含编译信息。

但是为了保持一致也同步升级了下AndroidStudio导出工程设置,这里有几个小问题。

1) 将app->build.Gradle 以及 dpJar->build.Gradle中的compileSdkVersion和targetSdkVersion都升级成28。

2) Build.gradle中implementation 'com.android.support:appcompat-v7:26.1.0'可能会告警,需要升级成 implementation 'com.android.support:appcompat-v7:28.+'

3) 执行gradlewbuild编译Jar没有发生任何告警,但是导出来的ApolloTest只有meta-inf而没有任何实际内容。整个工程删除后重新导入,终于看到了一行错误:

“Unsupported Modules Detected: Compilation is not supported for following modules: app. Unfortunately you can't have non-Gradle Java modules and Android-Gradle modules in one project.”

最终,执行File->Sync Project With Gradle Files

然后File->Invalidate Caches / Restart..解决问题。重新执行buildw exportJar,成功导出。

问题:默认情况下, Apache HTTP API内容库已从 bootclasspath 中移除且不可用于应用。因此导致斗破APK在启动时崩溃。堆栈如下:

解决方法:在AndroidMainfest.xml的Application节点下,加入以下声明,以加载老Apache Http库。

问题: 网络安全处理

Android 9 默认已经使用加密网络协议 (HTTPS),对于非 HTTPS 请求,需要添加配置或白名单处理

注意:使用 Webview 时,也无法打开非白名单 HTTP 网站

Google 升级说明:https://developer.android.com/about/versions/pie/android-9.0-changes-28#tls-enabled

问题:权限组变更

Android P 引入 CALL_LOG 权限组并将 READ_CALL_LOGWRITE_CALL_LOGPROCESS_OUTGOING_CALLS 权限移入该组。 在之前的 Android 版本中,这些权限位于 PHONE 权限组

解决方法:

必要时,申请改权限组的权限。

问题:non-SDK接口

扫描:apt.oa.com

扫描结果:

注意下,这里的greaylist_max_p_num代表最多支持AndroidP的版本的接口数量,这些接口不支持下一代AndroidQ版本。在后续兼容AndroidQ时候再去考虑吧。

三、升级项目集成的组件,如Apollo、MSDK、GRobot等

最重要的步骤,是对于项目中集成的组件都要做一个升级和兼容的测试。具体可以分为以下几个步骤来做。

1、 确认各个组件的SDK编译版本

2、 与组件方确认是否需要升级

3、 逐个升级与测试

AndroidP升级过程总结

从2019年下半年,所有安卓外部应用市场强制要求应用升级到TargetVersion 28。斗破苍穹的升级过程需要分以下两步来做。

一、升级到Target23,兼容Android6.0

问题:敏感权限需要动态申请,不会安装时自动授权。详情见Android官方文档

· 如果设备运行的是 Android 5.1 或更低版本,或者应用的目标 SDK 为 22 或更低:如果您在清单中列出了危险权限,则用户必须在安装应用时授予此权限;如果他们不授予此权限,系统根本不会安装应用。

· 如果设备运行的是 Android 6.0 或更高版本,或者应用的目标 SDK 为 23 或更高:应用必须在清单中列出权限,并且它必须在运行时请求其需要的每项危险权限。用户可以授予或拒绝每项权限,且即使用户拒绝权限请求,应用仍可以继续运行有限的功能。

https://developer.android.com/training/permissions/requesting?hl=zh-cn

解决方法:

1、扫描出敏感权限的调用,有两种方法

方法1:CodeDog能够扫描出项目中所有(代码以及调用的第三方库)使用危险权限的代码。由于斗破的工程目录太大,不能直接通过他们机器扫描,需要下载CodeDog客户端,然后指定本地工程目录去扫描。

备注:由于CodeDog客户端扫描需要编译命令,而我们只能需要扫描项目中的Jar包,所以编译命令可以直接填一个无关的命令,如

扫描结果:

方法2:用jadx反解APK,然后整个代码搜索用到敏感权限的地方。

目前,API-> 敏感权限可以查看google的Android开发文档。但是敏感权限->API,这个目前没有官方文档可以查。PScout对AndroidTarget25进行了扫描,有以下结果可以参考:

https://github.com/reddr/axplorer/blob/master/permissions/api-25/framework-map-25.txt

jadx的工具可以全局搜索对应接口调用。可以先反混淆,然后代码搜索,定位到具体调用堆栈。

由于方法2列出来的涉及到敏感权限的系统接口非常之多,一个个去查找非常费时,所以我们采用了第一种方法,用CodeDog直接扫描本地工程Jar包。

1、

列出组件调用接口以及对应组件功能的关系

上述列表不全,可进一步参考CodeDog扫描结果

http://codedog.oa.com/projects/10206/codelint/issues?scan_open__current_revision=260885&author=%20&limit=12&offset=0

2、调整游戏逻辑,在使用组件功能时弹框提示权限申请。并在未获得用户授权时给予用户反馈。具体如下

1) 必须要的权限: READ|WRITE_EXTERNAL_STORAGE读写存储卡 READ_PHONE_STATE读取手机信息

处理方式: 在游戏启动后即进行检查,未授权则进行用户授权申请,用户拒绝则不能进入游戏。

2) 可选择权限: RECORD_AUDIO录音功能

WRITE_SETTING写入设置

CAMERA访问相机

处理方式: SDK本身录音失败,并不会做任何提示。上层引用需要在功能入口相应处理。同理,在写入设置和访问相机的地方也应该加上对应的功能处理。

3) 暂未使用权限: {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}定位功能 处理方式: SDK卡本身含有这些权限,但是上层功能现在未调用。可以在Android工程及C#里面预埋请求权限的接口。以便热更时候能做动态申请。

注意下危险权限 READ|WRITE_EXTERNAL_STORAGE

Starting in API level 19, this permission is not required to read/write files in your application-specific directories returned byContext.getExternalFilesDir(String) and Context.getExternalCacheDir().

简单来说就是,如果应用需要访问自己/sdcard/Android/data/包名/ Xxx,不需要申请会自动获得。但是访问本应用以外的SD卡目录就需要。

2、 其他文件扫描

注意下,无论是CodeDog还是IPT,只能扫描到java代码一层,对于Native的调用,无法扫描得到。目前除了只能根据项目中已有的so以及结合项目自身的功能,同组件方确认有没有危险权限调用。

二、升级到Target28,需要兼容AndroidP

问题:AndroidPlugin工程,采用Target26编译

解决:这个其实无关精要,因为导出来的ApolloTest.jar,里面是纯粹的Java代码,不包含编译信息。

但是为了保持一致也同步升级了下AndroidStudio导出工程设置,这里有几个小问题。

1) 将app->build.Gradle 以及 dpJar->build.Gradle中的compileSdkVersion和targetSdkVersion都升级成28。

2) Build.gradle中implementation 'com.android.support:appcompat-v7:26.1.0'可能会告警,需要升级成 implementation 'com.android.support:appcompat-v7:28.+'

3) 执行gradlewbuild编译Jar没有发生任何告警,但是导出来的ApolloTest只有meta-inf而没有任何实际内容。整个工程删除后重新导入,终于看到了一行错误:

“Unsupported Modules Detected: Compilation is not supported for following modules: app. Unfortunately you can't have non-Gradle Java modules and Android-Gradle modules in one project.”

最终,执行File->Sync Project With Gradle Files

然后File->Invalidate Caches / Restart..解决问题。重新执行buildw exportJar,成功导出。

问题:默认情况下, Apache HTTP API内容库已从 bootclasspath 中移除且不可用于应用。因此导致斗破APK在启动时崩溃。堆栈如下:

解决方法:在AndroidMainfest.xml的Application节点下,加入以下声明,以加载老Apache Http库。

问题:权限组变更

Android P 引入 CALL_LOG 权限组并将 READ_CALL_LOGWRITE_CALL_LOGPROCESS_OUTGOING_CALLS 权限移入该组。 在之前的 Android 版本中,这些权限位于 PHONE 权限组

解决方法:

必要时,申请改权限组的权限。

问题:non-SDK接口

扫描:apt.oa.com

扫描结果:

注意下,这里的greaylist_max_p_num代表最多支持AndroidP的版本的接口数量,这些接口不支持下一代AndroidQ版本。在后续兼容AndroidQ时候再去考虑吧。

三、升级项目集成的组件,如Apollo、MSDK、GRobot等

最重要的步骤,是对于项目中集成的组件都要做一个升级和兼容的测试。具体可以分为以下几个步骤来做。

1、 确认各个组件的SDK编译版本

2、 与组件方确认是否需要升级

3、 逐个升级与测试

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
访问管理
访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档