Android16 EDLA【GTS】GtsPermissionTestCases存在fail项

Android16 EDLA【GTS】GtsPermissionTestCases存在fail项

文章目录

一、前言

这里记录一个【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

相关推荐
努力学习的小廉1 小时前
redis学习笔记(八)—— C++ 操作 Redis
redis·笔记·学习
魑魅魍魉都是鬼2 小时前
Android:java kotlin 单例模式
android·java·单例模式
星幻元宇VR2 小时前
VR消防安全学习机|沉浸式体验守护生命安全的新方式
科技·学习·安全·vr·虚拟现实
red_redemption2 小时前
自由学习记录(140)
学习
努力学习的小廉2 小时前
我爱学算法之——floodfill算法(上)
学习·算法
booksyhay2 小时前
XCP学习笔记(2)-指令详解
笔记·学习
菜鸡儿齐5 小时前
Unsafe方法学习
java·python·学习
留白_10 小时前
MySQL学习(7)——存储过程
学习
段娇娇10 小时前
Android jetpack LiveData(一)使用篇
android·android jetpack