Android16 EDLA【GTS】GtsPermissionTestCases存在fail项
文章目录
- [Android16 EDLA【GTS】GtsPermissionTestCases存在fail项](#Android16 EDLA【GTS】GtsPermissionTestCases存在fail项)
-
- 一、前言
- 二、分析解决
- 三、其他
-
- 1、【GTS】GtsPermissionTestCases存在fail项小结
- [2、Android EDLA CTS、GTS等各项测试命令汇总](#2、Android EDLA CTS、GTS等各项测试命令汇总)
一、前言
这里记录一个【GTS】GtsPermissionTestCases 测试Failed项。
从测试模块名称看是和权限相关。
这个模块的测试Failed报错,有些情况是需要修改代码的,有些情况是可以通过手法PASS的。
二、分析解决
1、不需要修改代码就能PASS的情况
(1)报错信息
报错如下图所示:

报错内容:
测试项:com.google.android.permission.gts.DefaultPermissionGrantPolicyTest#testDefaultGrantsWithRemoteExceptions
报错堆栈:
java.lang.AssertionError: packageName: com.android.testutils.connectivitypreparer {
priv app: false
targetSDK: 30
uid: 10170
persistent: false
signature: A40DA80A59D170CAA950CF15C18C454D47A39B26989D8B640ECD745BA71BF5DC
on system image: false
has platform signature: false
message: cannot be granted by default to package {
permission: android.permission.ACCESS_FINE_LOCATION
permission: android.permission.ACCESS_COARSE_LOCATION
permission: android.permission.ACCESS_BACKGROUND_LOCATION
}
}
(2)分析解决
通过验证分析,包名 com.android.testutils.connectivitypreparer 的应用是cts测试的时候遗留的应用;
只要在原生设置卸载这个应用就不会报这个Failed项;
也可以使用命令进行卸载:
pm uninstall XXX包名
之后重新测试该项就可以PASS了。
如果是多个应用权限报错,可以恢复出厂设置后,重新测试该项。
这种能通过手段PASS的情况,适用于可以卸载的app应用,报Permission Failed的情况;
如果是系统应用,就无法通过这个手法PASS该项测试了。
查看应用是否是系统应用可以dumpsys 查看一下安装应用的位置就可以了,命令:
dumpsys package XXXPackageName |grep path
查看安装应用的位置如果是system、vendor就无法卸载,如果安装在data目录一般是可以卸载的。
下面是一些系统应用报错,并且需要修改适配代码的情况。
2、需要修改相关代码的情况
(1)报错信息

报错内容:
测试项:
com.google.android.permission.gts.DefaultPermissionGrantPolicyTest#testDefaultGrantsWithRemoteExceptions
报错堆栈信息:
java.lang.AssertionError: packageName: com.skg.skgai {
priv app: true
targetSDK: 36
uid: 1000
persistent: true
signature: C8A2E9BCCF597C2FB6DC66BEE293FC13F2FC47EC77BC6B2B0D52C11F51192AB8
on system image: true
has platform signature: true
message: cannot be granted by default to package {
permission: android.permission.RECORD_AUDIO
}
}
packageName: com.skg.skgmanager {
priv app: true
targetSDK: 34
uid: 1000
persistent: false
signature: C8A2E9BCCF597C2FB6DC66BEE293FC13F2FC47EC77BC6B2B0D52C11F51192AB8
on system image: true
has platform signature: true
message: cannot be granted by default to package {
permission: android.permission.RECORD_AUDIO
}
}
packageName: cn.wps.moffice_eng {
priv app: false
targetSDK: 29
uid: 10075
persistent: false
signature: 643990878D3CA83952A5BE5F3E58D9F8BB6CDC57BF0F228700212071C68DB3D7
on system image: true
has platform signature: false
message: granted by default should be revocable {
permission: android.permission.BLUETOOTH_CONNECT
permission: android.permission.BLUETOOTH_ADVERTISE
permission: android.permission.BLUETOOTH_SCAN
}
}
...
第二个测试项报错的内容好像和第一个差不多。
第三个测试项报错的内容:
测试项:
com.google.android.permission.gts.PreloadAppsTargetSdkVersionTest#testPreloadedAppsTargetSdkVersion
报错堆栈信息:
java.lang.RuntimeException: All apps preloaded on DEVICEs launching with Android 11 MUST target API level 29 or higher.
All apps preloaded on DEVICEs launching with Android 12 or 12L MUST target API level 30 or higher.
All apps preloaded on DEVICEs launching with Android 13 MUST target API level 31 or higher.
All apps preloaded on DEVICEs launching with Android 14 MUST target API level 33 or higher.
All apps preloaded on DEVICEs launching with Android 15 MUST target API level 34 or higher.
All apps preloaded on DEVICEs launching with Android 16 MUST target API level 35 or higher.
com.skg.calculator must target 35 or higher, but targets 33
cn.kgzn.jkf.screenshare must target 35 or higher, but targets 33
com.skg.mediaManager must target 35 or higher, but targets 33
com.skg.aigesture must target 35 or higher, but targets 32
com.skg.skgmanager must target 35 or higher, but targets 34
com.skg.micupgrade must target 35 or higher, but targets 34
com.skg.svcameraotaservice must target 35 or higher, but targets 29
(2)分析解决
第三种Failed报错的比较好改:
如果是系统编译的应用,在AndroidManifest里面修改sdk版本;
如果是Android Studio编译的应用,在build.grade修改sdk版本就可以。
需要相关报错的每一个应用都修改,有一个应用没有修改都会导致该项报错。
如果是三方应用,需要去应用市场下载新版本的,也可以测试的时候删除或者屏蔽掉该应用。
第一二种报错Failed,就是具体权限的报错:
部分应用可以直接在应用代码的AndroidManifest定义中,直接去除报错的权限;
但是好像有些测试项又会因为去除了该权限报需要那个权限的其他Failed,估计是因为代码中用到了;
这种可以在framework中进行规避处理,针对某些应用的某些权限做特殊化处理:
方式一:
在应用中AndroidManifest去除该权限后,然后在私有权限里面添加包名和权限
frameworks/base/data/etc/privapp-permissions-platform.xml
有些情况方式一不行,就需要修改framework的Java代码了,
方式二:
+++ b/release/frameworks/base/services/permission/java/com/android/server/permission/access/permission/PermissionService.kt
@@ -144,6 +144,10 @@ class PermissionService(private val service: AccessCheckingService) :
* more** delayed backup left.
*/
private val isDelayedPermissionBackupFinished = SparseBooleanArray()
+
+ private val packageforCaller = ArrayList<String>()
+ private val permissionforCheck = ArrayList<String>()
+ private val packageNameforCheck = ArrayList<String>()
fun initialize() {
metricsLogger = MetricsLogger()
@@ -170,6 +174,8 @@ class PermissionService(private val service: AccessCheckingService) :
onPermissionFlagsChangedListener = OnPermissionFlagsChangedListener()
policy.addOnPermissionFlagsChangedListener(onPermissionFlagsChangedListener)
devicePolicy.addOnPermissionFlagsChangedListener(onPermissionFlagsChangedListener)
+
+ initApplicationPermissionSettings()
}
override fun getAllPermissionGroups(flags: Int): List<PermissionGroupInfo> {
@@ -611,6 +617,12 @@ class PermissionService(private val service: AccessCheckingService) :
val isPermissionGranted =
service.getState { isPermissionGranted(packageState, userId, permissionName, deviceId) }
+
+ val callingUidName = packageManagerInternal.getNameForUid(Binder.getCallingUid())
+ if (checkApplicationPermission(packageName, permissionName, callingUidName) == -1) {
+ return PackageManager.PERMISSION_DENIED
+ }
+
return if (isPermissionGranted) {
PackageManager.PERMISSION_GRANTED
} else {
@@ -2929,4 +2941,40 @@ class PermissionService(private val service: AccessCheckingService) :
fun getFullerPermission(permissionName: String): String? =
FULLER_PERMISSIONS[permissionName]
}
+
+ private fun initApplicationPermissionSettings() {
+ packageforCaller.clear()
+ packageforCaller.add("com.google.android.permission.gts")
+
+ permissionforCheck.clear()
+ permissionforCheck.add("android.permission.POST_NOTIFICATIONS")
+ permissionforCheck.add("android.permission.ACCESS_FINE_LOCATION")
+ permissionforCheck.add("android.permission.BLUETOOTH_CONNECT")
+ permissionforCheck.add("android.permission.READ_EXTERNAL_STORAGE")
+ permissionforCheck.add("android.permission.ACCESS_COARSE_LOCATION")
+ permissionforCheck.add("android.permission.WRITE_CONTACTS")
+ permissionforCheck.add("android.permission.BLUETOOTH_ADVERTISE")
+ permissionforCheck.add("android.permission.GET_ACCOUNTS")
+ permissionforCheck.add("android.permission.WRITE_EXTERNAL_STORAGE")
+ permissionforCheck.add("android.permission.READ_CONTACTS")
+ permissionforCheck.add("android.permission.BLUETOOTH_SCAN")
+
+ packageNameforCheck.clear()
+ packageNameforCheck.add("com.android.bluetooth")
+ packageNameforCheck.add("com.android.camera2")
+ packageNameforCheck.add("com.android.nfc")
+ }
+
+ private fun checkApplicationPermission(
+ packageName: String,
+ permissionName: String,
+ callingApp: String
+ ): Int {
+ if (packageforCaller.contains(callingApp) && permissionforCheck.contains(permissionName)
+ && packageNameforCheck.contains(packageName)) {
+ return PackageManager.PERMISSION_DENIED
+ } else {
+ return PackageManager.PERMISSION_GRANTED
+ }
+ }
}
/release$
这种规避报错好像是厂商给的对策。
具体那些情况能用方式一、哪行情况需要用第二种方式解决,我也不清楚,这个都是另外同事修改的。
三、其他
1、【GTS】GtsPermissionTestCases存在fail项小结
存在该项报错的原因有:
1、CTS 测试过程遗留的app,存在权限滥用问题;
2、应用的SDK版本比当前系统版本,低两个以上,比如当前系统是Android16,应用的SDK必须是36或者35;
3、AndroidManifest 滥用权限,定义未使用的权限;
4、未滥用权限,但是也会有些特殊的报错情况。
Failed项解决:
1、去除可以手动移除的app应用;
2、修改SDK应用版本,修改成当前Android版本的或者-1的;
3、去除AndroidManifest 滥用权限
4、针对特殊的报错情况,可以修改framework xml或者Java 代码解决。
2、Android EDLA CTS、GTS等各项测试命令汇总
Android EDLA认证中,必须要通过所有GMS认证测试项;
EDLA 设备必须通过所有 GMS 认证测试,测试项主要包括:
| 测试类型 | 主要内容 |
|---|---|
| CTS | Android 兼容性测试,验证 API 符合性和系统功能完整性 |
| GTS | Google 服务测试,确保 GMS(Play 商店、Drive 等)正常运行 |
| VTS | 内核测试、Vulkan 图形性能测试,验证 3D 渲染兼容性 |
| GSI | 烧录通用系统镜像后测试,确保设备支持官方系统更新和系统兼容 |
| STS | 安全测试套件,验证系统安全漏洞 |
| 手动测试 (CTSV/GTSV) | 针对特定功能的人工验证,如摄像头、显示、网络、通知等 |
| BTS | Google系统固件扫描,主要测试代码中的权限是否滥用,签名信息校验 |
| CheckList | 系统属性配置和 Android 版本新特性检查 |
上面的不同测试类型,需要下载不同的测试套件进行测试,测试后会有测试报告。
不同的测试项是对应不同的套件的,并且不同的套件,测试的命令也是有差异的:
https://blog.csdn.net/wenzhi20102321/article/details/157554964