Android 禁止第三方应用安装

一、禁止手动安装(下载的apk文件)

framwork/base/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java 
@@ -37,7 +37,7 @@ import android.os.UserManager;
import android.util.Log;
import java.util.Arrays;
-
+import android.widget.Toast;
/**
  * Select which activity is the first visible activity of the installation and forward the intent to
  * it.
**/
@@ -50,6 +50,8 @@ public class InstallStart extends Activity {
     private UserManager mUserManager;
     private boolean mAbortInstall = false;
+    private boolean APK_INSTALL_FINISH = false; 
+
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -140,7 +142,18 @@ public class InstallStart extends Activity {
         }
         if (nextActivity != null) {
-            startActivity(nextActivity);
+            //add ban apk install begin {//@
+            if(!APK_INSTALL_FINISH) {  
+                //startActivity(nextActivity);
+                Toast.makeText(InstallStart.this, "禁止安装", Toast.LENGTH_LONG).show();
+                Intent result = new Intent();
+                 result.putExtra(Intent.EXTRA_INSTALL_RESULT,
+                PackageManager.INSTALL_FAILED_INVALID_URI);
+                setResult(RESULT_FIRST_USER, result);
+            } else{
+                startActivity(nextActivity);
+            }
+            //@}
         }
         finish();
     }

二、禁止adb指令安装

diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java 

@@ -546,6 +546,7 @@ public class PackageManagerService extends IPackageManager.Stub
     public static final boolean TRACE_SNAPSHOTS = false;
     private static final boolean DEBUG_PER_UID_READ_TIMEOUTS = false;
+    private boolean SYSTEM_APK_INSTALL_FINISH = false;  // Prohibit the installation of third-party APK 
     //Not report ART metrics to statsd after first flash boot
     public static boolean DEBUG_ART_STATSLOG = SystemProperties.getBoolean(
             "persist.sys.pm.art.statslog", false);
@@ -5824,6 +5825,10 @@ public class PackageManagerService extends IPackageManager.Stub
         void doHandleMessage(Message msg) {
             switch (msg.what) {
                 case INIT_COPY: {
+                    //add Prohibit the installation of third-party APK(adb)
+                    if(SYSTEM_APK_INSTALL_FINISH){
+                        return;
+                    }
                     HandlerParams params = (HandlerParams) msg.obj;
                     if (params != null) {
                         if (DEBUG_INSTALL) Slog.i(TAG, "init_copy: " + params);
@@ -7729,7 +7734,7 @@ public class PackageManagerService extends IPackageManager.Stub
             Slog.i(TAG, "Time to scan packages: "
                     + ((SystemClock.uptimeMillis()-startTime)/1000f)
                     + " seconds");
-
+            SYSTEM_APK_INSTALL_FINISH = true;
             mPermissionManager.readLegacyPermissionStateTEMP();
             // If the build fingerprint has changed since the last time we booted,
             // we need to re-grant app permission to catch any new ones that

三、AD13版本---禁止adb安装apk

+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -1405,6 +1405,11 @@ class PackageManagerShellCommand extends ShellCommand {
     }
     private int runInstall() throws RemoteException {
+        if(true){
+            final PrintWriter pw1 = getOutPrintWriter();
+            pw1.println("Error: unknown apk");
+            return 1;
+        }
         return doRunInstall(makeInstallParams(UNSUPPORTED_INSTALL_CMD_OPTS));
     }

禁止第三方应用程序的开机自启权限,可以使用以下代码: ```java PackageManager packageManager = context.getPackageManager(); ComponentName componentName = new ComponentName(context, SampleBootReceiver.class); int state = packageManager.getComponentEnabledSetting(componentName); if (state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) { packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); } ``` 其中, `SampleBootReceiver` 是一个广播接收器,用来接收系统开机广播。这里我们通过 PackageManager 的 `getComponentEnabledSetting()` 方法来获取 `SampleBootReceiver` 的当前状态,如果是启用状态,就调用 `setComponentEnabledSetting()` 方法将其禁用。 需要注意的是,该功能需要应用程序具有系统级别的权限才能使用,所以必须在 AndroidManifest.xml 中声明相应的权限: ```xml <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" android:label="@string/permlab_changeComponentEnabledState" android:description="@string/permdesc_changeComponentEnabledState" android:protectionLevel="signature" /> ``` 声明完权限后,在代码中使用 `PackageManager.setComponentEnabledSetting()` 方法时,需要传入 `PackageManager.DONT_KILL_APP` 参数,以确保系统不会在应用程序被杀死时自动重新启用 `SampleBootReceiver`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值