安卓设备过CTA认证权限的需求

CTA入网认证,要求低版本比如Android6以下的应用,运行时,也需要有运行时权限(Runtime Permission)功能,不能默认就取到权限,必须人工在设置中打开才可。

SDK环境

Android 8

代码实现

frameworks
修改思路是所有APP都统一处理,支持运行时权限,
把所有版本相关的判断去掉,检测是否支持运行时权限的判断去掉。

diff --git a/base/services/core/java/com/android/server/pm/PackageInstallerService.java b/base/services/core/java/com/android/server/pm/PackageInstallerService.java
index 1fa37b91..3a3433c9 100644
--- a/base/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/base/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -436,6 +436,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
             params.installFlags |= PackageManager.INSTALL_FROM_ADB;
 
         } else {
+            mAppOps = mContext.getSystemService(AppOpsManager.class);
             mAppOps.checkPackage(callingUid, installerPackageName);
 
             params.installFlags &= ~PackageManager.INSTALL_FROM_ADB;
@@ -705,6 +706,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
     @Override
     public ParceledListSlice<SessionInfo> getMySessions(String installerPackageName, int userId) {
         mPm.enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, "getMySessions");
+        mAppOps = mContext.getSystemService(AppOpsManager.class);
         mAppOps.checkPackage(Binder.getCallingUid(), installerPackageName);
 
         final List<SessionInfo> result = new ArrayList<>();
diff --git a/base/services/core/java/com/android/server/pm/PackageManagerService.java b/base/services/core/java/com/android/server/pm/PackageManagerService.java
index aa43008b..5f0f66a4 100644
--- a/base/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/base/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -2279,8 +2279,9 @@ public class PackageManagerService extends PackageManagerServiceExAbs
         final int immutableFlags = PackageManager.FLAG_PERMISSION_SYSTEM_FIXED
                 | PackageManager.FLAG_PERMISSION_POLICY_FIXED;
 
-        final boolean supportsRuntimePermissions = pkg.applicationInfo.targetSdkVersion
-                >= Build.VERSION_CODES.M;
+        //final boolean supportsRuntimePermissions = pkg.applicationInfo.targetSdkVersion
+                //>= Build.VERSION_CODES.M;
+        final boolean supportsRuntimePermissions = false;
 
         final boolean instantApp = isInstantApp(pkg.packageName, userId);
 
@@ -5884,7 +5885,6 @@ public class PackageManagerService extends PackageManagerServiceExAbs
             // to keep the review required permission flag per user while an
             // install permission's state is shared across all users.
             if (mPermissionReviewRequired
-                    && pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M
                     && bp.isRuntime()) {
                 return;
             }
@@ -5918,10 +5918,10 @@ public class PackageManagerService extends PackageManagerServiceExAbs
                         + name + " for package " + packageName);
             }
 
-            if (pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M) {
-                Slog.w(TAG, "Cannot grant runtime permission to a legacy app");
-                return;
-            }
+            //if (pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M) {
+                //Slog.w(TAG, "Cannot grant runtime permission to a legacy app");
+                //return;
+            //}
 
             final int result = permissionsState.grantRuntimePermission(bp, userId);
             switch (result) {
@@ -6021,7 +6021,7 @@ public class PackageManagerService extends PackageManagerServiceExAbs
             // to keep the review required permission flag per user while an
             // install permission's state is shared across all users.
             if (mPermissionReviewRequired
-                    && pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M
+                    //&& pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M
                     && bp.isRuntime()) {
                 return;
             }
@@ -13615,8 +13615,7 @@ public class PackageManagerService extends PackageManagerServiceExAbs
         for (int i=0; i<N; i++) {
             final String name = pkg.requestedPermissions.get(i);
             final BasePermission bp = mSettings.mPermissions.get(name);
-            final boolean appSupportsRuntimePermissions = pkg.applicationInfo.targetSdkVersion
-                    >= Build.VERSION_CODES.M;
+            final boolean appSupportsRuntimePermissions = false;
 
             if (DEBUG_INSTALL) {
                 Log.i(TAG, "Package " + pkg.packageName + " checking " + name + ": " + bp);
@@ -13676,10 +13675,7 @@ public class PackageManagerService extends PackageManagerServiceExAbs
                     // their permissions as always granted runtime ones since we need
                     // to keep the review required permission flag per user while an
                     // install permission's state is shared across all users.
-                    if (!appSupportsRuntimePermissions && !mPermissionReviewRequired) {
-                        // For legacy apps dangerous permissions are install time ones.
-                        grant = GRANT_INSTALL;
-                    } else if (origPermissions.hasInstallPermission(bp.name)) {
+                    if (origPermissions.hasInstallPermission(bp.name)) {
                         // For legacy apps that became modern, install becomes runtime.
                         grant = GRANT_UPGRADE;
                     } else if (mPromoteSystemApps
@@ -14023,14 +14019,6 @@ public class PackageManagerService extends PackageManagerServiceExAbs
             }
         }
         if (!allowed) {
-            if (!allowed && (bp.protectionLevel
-                    & PermissionInfo.PROTECTION_FLAG_PRE23) != 0
-                    && pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M) {
-                // If this was a previously normal/dangerous permission that got moved
-                // to a system permission as part of the runtime permission redesign, then
-                // we still want to blindly grant it to old apps.
-                allowed = true;
-            }
             if (!allowed && (bp.protectionLevel & PermissionInfo.PROTECTION_FLAG_INSTALLER) != 0
                     && pkg.packageName.equals(mRequiredInstallerPackage)) {
                 // If this permission is to be granted to the system installer and
@@ -21325,8 +21313,7 @@ public class PackageManagerService extends PackageManagerServiceExAbs
             // If permission review is enabled and this is a legacy app, mark the
             // permission as requiring a review as this is the initial state.
             int flags = 0;
-            if (mPermissionReviewRequired
-                    && ps.pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M) {
+            if (mPermissionReviewRequired) {
                 flags |= FLAG_PERMISSION_REVIEW_REQUIRED;
             }
             if (permissionsState.updatePermissionFlags(bp, userId, userSettableMask, flags)) {
@@ -26124,9 +26111,9 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
                 }
 
                 // Permission review applies only to apps not supporting the new permission model.
-                if (packageSetting.pkg.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.M) {
-                    return false;
-                }
+                //if (packageSetting.pkg.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.M) {
+                    //return false;
+                //}
 
                 // Legacy apps have the permission and get user consent on launch.
                 PermissionsState permissionsState = packageSetting.getPermissionsState();

获得 CTA 认证有诸多好处,主要体现在以下几个方面:

对企业的好处:

  1. 提升产品市场竞争力:
    CTA 认证是产品符合国家相关标准和技术规范的有力证明。在市场上,消费者往往更倾向于选择经过认证的产品,认为其质量、安全性和可靠性更有保障。例如,一款获得 CTA 认证的手机,消费者会更放心购买,从而增加产品的市场份额,提高企业的竞争力。
    增加产品可信度与品牌形象:认证标志是产品质量的象征,能够增强消费者对企业和产品的信任。企业通过展示 CTA 认证标志,向消费者传递出其对产品质量的重视和承诺,有助于树立良好的品牌形象,提升品牌知名度和美誉度。
  2. 助力企业拓展市场:
    在一些行业,如电信、电子等,CTA 认证是产品进入市场的必要条件。获得认证后,企业的产品才能合法地在国内市场销售和使用,为企业拓展市场提供了基础保障。同时,也有助于企业将产品推向国际市场,因为部分国际市场也认可 CTA 认证,或者 CTA 认证可以为企业获得其他国际认证提供有力支持 。
  3. 促进企业技术升级:
    为了通过 CTA 认证,企业需要对产品的设计、生产、检测等环节进行严格把控,这就促使企业不断改进技术、优化生产流程,提高自身的技术水平和创新能力,以满足认证标准的要求。
  4. 减少贸易风险与成本:
    对于企业的贸易伙伴来说,CTA 认证可以减少对产品质量和合规性的担忧,降低贸易风险。双方在交易过程中可以减少对产品的重复检测和评估等环节,节省时间和成本 。

对消费者的好处:

  1. 保障消费者权益:CTA 认证要求产品经过严格的测试和评估,确保在正常使用中不会对用户造成安全风险,如防止电池爆炸、电路故障、电击等问题。消费者购买获得 CTA 认证的产品,使用起来更加安全、放心。
  2. 提供可靠的产品选择:面对市场上众多的产品,消费者往往难以判断其质量和性能。CTA 认证为消费者提供了一个明确的参考标准,帮助消费者筛选出符合质量要求的产品,降低了购买到低质量或不合格产品的风险。
  3. 确保产品兼容性和稳定性:经过 CTA 认证的产品,在电磁兼容性、无线电频率等方面符合国家标准,能够与其他设备和系统良好兼容,并且在使用过程中更加稳定可靠,不会出现频繁的故障或异常情况,为消费者带来更好的使用体验。

对行业发展的好处:

  1. 规范行业秩序:CTA 认证设定了统一的标准和规范,对进入市场的产品进行严格筛选。这有助于淘汰那些不符合要求的低质量、假冒伪劣产品,减少市场上的不良竞争,规范行业秩序,营造健康的市场环境。
  2. 推动行业技术进步:企业为了获得 CTA 认证,需要不断进行技术创新和改进,这将推动整个行业的技术水平不断提升。同时,认证过程中积累的技术经验和数据,也可以为行业的发展提供参考和借鉴,促进整个行业的技术进步。
  3. 促进产业协同发展:CTA 认证要求产品在各个方面都符合标准,这就促使产业链上的各个环节,如原材料供应商、零部件制造商、整机生产商等,加强协作和沟通,共同确保产品质量。从而有利于整个产业的协同发展,提高产业的整体效率和竞争力。

作者:帅得不敢出门 原创文章谢绝转载

更多推荐