Android 10 设置安装白名单,禁止其他app安装

Android 10 设置安装白名单,禁止其他app安装


前言

在进行frameworks定制开发的时候,客户需要需求需要系统支持应用白名单(包名和签名sha256),用于app安装需校验白名单规则,参考多位大神的博客总结了个方法。

一、问题解决

1.分析问题

应用安装有多种方法
1、 直接调用安装接口。
2、通过命令进行安装 pm install
经过加打印发现在pms中无论是adb shell 还是代码安装都会走preparePackageLI方法。
可以在preparePackageLI方法执行安装前进行判断是否为白名单内的包名然后再进行安装,最终选择通过遍历文件内保存的包名来确定是否是白名单内的应用。

2.解决问题

路径:

frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
+++ a/android/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/android/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -307,6 +307,7 @@ import com.android.server.SystemServerInitThreadPool;
 import com.android.server.Watchdog;
 import com.android.server.net.NetworkPolicyManagerInternal;
 import com.android.server.pm.Installer.InstallerException;
+import com.android.server.pm.PackageManagerService.PostInstallData;
 import com.android.server.pm.Settings.DatabaseVersion;
 import com.android.server.pm.Settings.VersionInfo;
 import com.android.server.pm.dex.ArtManagerService;
@@ -339,6 +340,7 @@ import org.xmlpull.v1.XmlPullParserException;
 import org.xmlpull.v1.XmlSerializer;
 
 import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -347,6 +349,7 @@ import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.FilenameFilter;
 import java.io.IOException;
+import java.io.InputStreamReader;
 import java.io.PrintWriter;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -17405,7 +17408,36 @@ public class PackageManagerService extends IPackageManager.Stub
             return this;
         }
     }
+       /*add for installer white list*/
+    private boolean isInstallerEnable(String packagename){
+        ArrayList<String> whiteListApp = new ArrayList<String>();
 
+        try{
+            BufferedReader br = new BufferedReader(new InputStreamReader(
+            new FileInputStream("/vendor/etc/WhiteListAppFilter.properties")));
+
+            String line ="";
+            while ((line = br.readLine()) != null){
+                whiteListApp.add(line);
+            }
+
+            br.close();
+        }catch(java.io.FileNotFoundException ex){
+            return false;
+        }catch(java.io.IOException ex){
+            return false;
+        }
+
+        Iterator<String> it = whiteListApp.iterator();
+
+        while (it.hasNext()) {
+            String whitelisItem = it.next();
+            if (whitelisItem.equals(packagename)) {
+                return true;
+            }
+        }
+        return false;
+    }
     @GuardedBy("mInstallLock")
     private PrepareResult preparePackageLI(InstallArgs args, PackageInstalledInfo res)
             throws PrepareFailure {
@@ -17545,6 +17577,12 @@ public class PackageManagerService extends IPackageManager.Stub
             throw new PrepareFailure("Failed collect during installPackageLI", e);
         }
 
+     // add for installer enable/disable 
+     if (!isInstallerEnable(pkg.packageName)) {
+        throw new PrepareFailure(INSTALL_FAILED_INSTANT_APP_INVALID,  "app is not in the whitelist. packageName");
+        
+    }
+
         if (instantApp && pkg.mSigningDetails.signatureSchemeVersion
                 < SignatureSchemeVersion.SIGNING_BLOCK_V2) {
             Slog.w(TAG, "Instant app package " + pkg.packageName

将文件copy到vendor/etc里面去

--- diff --git a/android/device/softwinner/m133/kernel b/android/device/softwinner/m133/kernel
index a067f32494..e95dd83f97 100755
Binary files a/android/device/softwinner/m133/kernel and b/android/device/softwinner/m133/kernel differ
diff --git a/android/device/softwinner/m133/m133.mk b/android/device/softwinner/m133/m133.mk
index c24c5e275d..f351923ad6 100755
--- a/android/device/softwinner/m133/m133.mk
+++ b/android/device/softwinner/m133/m133.mk
@@ -198,7 +198,8 @@ PRODUCT_COPY_FILES += \
     $(LOCAL_PATH)/language/zh_CN_2018030706.zip:/product/usr/share/ime/google/d3_lms/zh_CN_2018030706.zip \
     device/softwinner/m133/sunxi-ir.kl:system/usr/keylayout/sunxi-ir.kl \
     device/softwinner/m133/spidev_test:system/bin/spidev_test \
-    device/softwinner/m133/spidev_fdx:system/bin/spidev_fdx
+    device/softwinner/m133/spidev_fdx:system/bin/spidev_fdx  \
+    device/softwinner/m133/WhiteListAppFilter.properties:/vendor/etc/WhiteListAppFilter.properties
 PRODUCT_COPY_FILES += \
     $(LOCAL_PATH)/configs/camera.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/camera.cfg \
 
 

文件内容

com.iflytek.speechcloud
//表示只有讯飞语音可以安装

效果

非白名单内的app安装效果,会先显示拒绝。非白名单内的app安装效果通过echo 将讯飞输入法的包名到白名单之后,因为vendor属于系统目录需要 su 后mount -o rw,remount /vendor 才能进行文件修改。
在这里插入图片描述
最终效果,安装成功
在这里插入图片描述

总结

分析应用安装流程,找到合适的位置,进行白名单的判断,最终达到客户的效果,白名单保存方式有很多,可以通过数据库,属性等来进行保存,我这种通过文件只是其一大家可以自行选择。

每日赠言

有位智者说,学习是为了完善人生,而非享乐人生。追求卓越,成功自会随你而来

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值