[RK3288][Android9] Android->默认打开预装在可卸载位置apk的普通权限

测试平台

Platform: RK3288
OS: Android9


需求:

        客户需要将他们自己的apk预装到可卸载可恢复位置(preinstall_del 目录),需要默认授权apk所需的普通权限,网上很多方法都是通过PackageManagerService.java授权,其实PackageManagerService.java只对手动安装的apk有用,对预置可卸载位置的apk权限不起作用的,具体修改方法如下


解决方法:

代码路径:packages/apps/PackageInstaller/AndroidManifest.xml

--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="com.android.packageinstaller" coreApp="true">
 

 
         <provider android:name=".wear.WearPackageIconProvider"
                   android:authorities="com.google.android.packageinstaller.wear.provider"
@@ -189,6 +194,9 @@
         <activity android:name=".permission.ui.wear.WarningConfirmationActivity"
                   android:permission="android.permission.GRANT_RUNTIME_PERMISSIONS"
                   android:theme="@style/Settings"/>
+               <service
+                       android:name=".PackagePermissionGrantService"
+                       android:persistent = "true"/>
     </application>
 
 </manifest>

代码路径:packages/apps/PackageInstaller/src/com/android/packageinstaller/PackagePermissionGrantService.java

--- /dev/null
+++ b/src/com/android/packageinstaller/PackagePermissionGrantService.java

+/*
+**
+** Copyright 2007, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+package com.android.packageinstaller;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import android.net.Uri;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import com.android.packageinstaller.permission.model.AppPermissionGroup;
+import com.android.packageinstaller.permission.model.AppPermissions;
+import com.android.packageinstaller.permission.model.Permission;
+import com.android.packageinstaller.permission.utils.ArrayUtils;
+import com.android.packageinstaller.permission.utils.Utils;
+import java.util.List;
+import android.app.Notification;
+import android.app.NotificationManager;
+
+public class PackagePermissionGrantService extends Service {
+
+    private final String TAG = "PackagePermissionGrantService";
+    Permissionhandler handler;
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        Log.i(TAG, "onCreate OK");
+
+        handler = new Permissionhandler();
+    }
+
+    @Override
+    public IBinder onBind(Intent arg0) {
+        return null;
+    }
+
+
+    @Override
+    public int onStartCommand(Intent intent, int flags, int startId) {
+        handler.sendEmptyMessage(100);                 
+        return Service.START_NOT_STICKY;
+    }
+
+
+    @Override
+    public void onDestroy() {   
+        Log.e(TAG, " stop self   onDestroy=");    
+        handler.removeCallbacksAndMessages(null);
+        super.onDestroy();
+    }
+     class Permissionhandler extends Handler {        
+          @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case 100:
+                  Log.e(TAG, "start grant permission");    
+                  slientGrantRuntimePermission("com.xubb.dsop");//改为客户apk包名
+                  sendEmptyMessageDelayed(101,2000);
+                  break;
+                case 101:
+                  stopSelf();
+                break;
+            }
+        }
+         
+     }
+
+   public void slientGrantRuntimePermission(String packageName){
+        PackageInfo packageInfo;
+        try {
+            Log.e(TAG, "PackageInfo for packageName="+ packageName);
+            packageInfo =  getPackageManager().getPackageInfo(packageName, PackageManager.GET_PERMISSIONS);
+        } catch (PackageManager.NameNotFoundException e) {
+            Log.e(TAG, "can't get PackageInfo for packageName="+ packageName);
+            return;
+        }
+        
+       AppPermissions  mAppPermissions = new AppPermissions(this, packageInfo, null, false,
+                new Runnable() {
+                    @Override
+                    public void run() {
+                        stopSelf();
+                    }
+                });
+
+       Log.e(TAG, " AppPermissionGroup size==" + mAppPermissions.getPermissionGroups().size());
+       if (mAppPermissions.getPermissionGroups().isEmpty()) {
+            Log.e(TAG, "mAppPermissions size isEmpty");
+            return;
+        }
+        for (AppPermissionGroup group : mAppPermissions.getPermissionGroups()) {
+            String[] permissionsToGrant = null;
+            final int permissionCount = group.getPermissions().size();
+            for (int j = 0; j < permissionCount; j++) {
+                final Permission permission = group.getPermissions().get(j);
+                Log.e(TAG, "permissionName=" +permission.getName()+",isGranted="+ permission.isGranted());
+                if (!permission.isGranted()) {//循环未赋予权限的权限,添加进数组
+                    permissionsToGrant = ArrayUtils.appendString(
+                            permissionsToGrant, permission.getName());
+                     Log.e(TAG, "permissionName=" + permission.getName());
+                }
+            }
+            if (permissionsToGrant != null) {
+
+                //真正赋予权限
+                group.grantRuntimePermissions(false, permissionsToGrant);
+                Log.i(TAG, "grantRuntimePermissions permissionsToGrant");
+            }
+        }
+    }    
+}

代码路径:packages/apps/Settings/src/com/android/settings/FallbackHome.java

--- a/src/com/android/settings/FallbackHome.java
+++ b/src/com/android/settings/FallbackHome.java
@@ -39,6 +39,7 @@ import android.view.WindowManager.LayoutParams;
 import android.view.animation.AnimationUtils;
 
 import java.util.Objects;
+import android.content.ComponentName;
 
 public class FallbackHome extends Activity {
     private static final String TAG = "FallbackHome";
@@ -63,7 +64,10 @@ public class FallbackHome extends Activity {
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-
+               Intent intent = new Intent();
+               intent.setComponent(new ComponentName("com.android.packageinstaller","com.android.packageinstaller.PackagePermissionGrantService"));
+               intent.addFlags(0x01000000);
+               startService(intent);
         // Set ourselves totally black before the device is provisioned so that
         // we don't flash the wallpaper before SUW
         mProvisioned = Settings.Global.getInt(getContentResolver(),

代码路径:frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -9424,7 +9424,10 @@ public class ActivityManagerService extends IActivityManager.Stub
             }
             return ActivityManager.APP_START_MODE_NORMAL;
         }
-
+               //add avoid permission service   
+        if( packageName.equals("com.android.settings")){            
+            return ActivityManager.APP_START_MODE_NORMAL;
+        }
         // Non-persistent but background whitelisted?
         if (uidOnBackgroundWhitelist(uid)) {
             if (DEBUG_BACKGROUND_CHECK) {

### 安装Anaconda设置环境变量 #### 准备工作 确保Linux系统已更新至最新状态,确认有足够的磁盘空间来容纳Anaconda安装文件。 #### 下载Anaconda 访问Anaconda官方网站获取适用于Linux系统的安装脚本。通常,该链接位于页面显著位置,易于找到。对于新手而言,推荐下载最新的Python 3.x版本[^4]。 #### 执行安装命令 通过终端执行wget命令下载Anaconda安装程序: ```bash wget https://repo.anaconda.com/archive/Anaconda3-2023.07-1-Linux-x86_64.sh ``` 赋予下载后的shell脚本可执行权限,启动安装过程: ```bash chmod +x Anaconda3-2023.07-1-Linux-x86_64.sh ./Anaconda3-2023.07-1-Linux-x86_64.sh ``` 按照提示完成安装向导,在此过程中需注意两项重要选项:一是将Anaconda路径加入到`PATH`环境变量;二是注册Anaconda作为默认Python解释器[^1]。 #### 验证安装成功与否 重启Shell会话或重新加载`.bashrc`配置文件使更改生效: ```bash source ~/.bashrc ``` 输入`conda --version`验证Conda是否正常运行,以此判断Anaconda是否正确安装。 #### 创建与管理虚拟环境 利用Conda创建新的虚拟环境以便更好地隔离项目依赖关系: ```bash conda create --name myenv python=3.9 conda activate myenv ``` #### 使用清华镜像源加速软件包安装速度 为了提高国内用户的网络体验,可以在用户目录下建立隐藏文件夹`.pip`及其子文件`pip.conf`,将以下内容写入其中以指定清华大学开源软件镜像站为默认索引地址[^3]: ```ini [global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple [install] trusted-host = pypi.tuna.tsinghua.edu.cn ``` 这样做的好处是可以大幅减少因国际线路传输带来的延迟问题,从
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值