• Android7.0 MTK方案 静默安装和卸载


    一、android安装apk介绍

    安装apk有两种方法

    1、调用系统PackageInstaller.apk进行安装

    这个系统apk所在目录为:android/packages/apps/PackageInstaller

    2、串口命令安装”pm install –r hello.apk”

    这个pm命令实现所在目录为:android/frameworks/base/cmds/pm/src/com/android/commands/pm/Pm.java

    它们最后都是调用系统底层接口实现apk安装和卸载,实现静默安装要调用的就是这些接口,而这些接口怎么调用,参考的就是Pm.java这个文件。

    二、apk安装接口

    1、方法一,获取服务,调用aidl里面的方法

    frameworksasecorejavaandroidcontentpmIPackageManager.aidl

    安装方法

    /** @deprecated Use PackageInstaller instead */
        void installPackageAsUser(in String originPath,
                in IPackageInstallObserver2 observer,
                int flags,
                in String installerPackageName,
                int userId);

    卸载方法

    /** @deprecated rawr, don't call AIDL methods directly! */
        void deletePackageAsUser(in String packageName, IPackageDeleteObserver observer,
                int userId, int flags);

    获取服务方法

    IPackageManager mIPm;
    mIPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));

    2、方法二,第一种方法是获取服务后直接调用aidl里面的方法,而更好的办法是使用PackageManager.java里面的方法,PackageManager.java是对第一张方法的封装,最后也是通过第一种方法实现的。

    PackageManager.java所在目录为:

    frameworksasecorejavaandroidcontentpmPackageManager.java

    安装方法

    public abstract void installPackage(
                Uri packageURI,
                PackageInstallObserver observer,
                @InstallFlags int flags,
                String installerPackageName);

    卸载方法

    public abstract void deletePackage(String packageName, IPackageDeleteObserver observer,
                @DeleteFlags int flags);

    获得PackageManager.java对象的方法

    Context mContext;
    PackageManager mPm;
    mContext = getApplicationContext();
    mPm = mContext.getPackageManager();

    3、无论哪种方法,都需要权限

    Android.mk

    LOCAL_CERTIFICATE := platform
    LOCAL_PRIVILEGED_MODULE := true

    AndroidManifest.xml

    android:sharedUserId="android.uid.system"
    
    
    <uses-permission android:name="android.permission.ACCESS_SUPERUSER"/>
        <uses-permission android:name="android.permission.INSTALL_PACKAGES" />
        <uses-permission android:name="android.permission.DELETE_PACKAGES" />
        <uses-permission android:name="android.permission.CLEAR_APP_CACHE" />
        <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.MANAGE_USERS" />
        <uses-permission android:name="android.permission.GRANT_RUNTIME_PERMISSIONS" />
        <uses-permission android:name="android.permission.REVOKE_RUNTIME_PERMISSIONS" />
        <uses-permission android:name="android.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS" />
        <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
        <uses-permission android:name="android.permission.READ_INSTALL_SESSIONS" />
        <uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" />
        <uses-permission android:name="android.permission.WAKE_LOCK" />
        <uses-permission android:name="android.permission.KILL_UID" />
        <uses-permission android:name="android.permission.MANAGE_APP_OPS_RESTRICTIONS" />
    
        <uses-permission android:name="com.google.android.permission.INSTALL_WEARABLE_PACKAGES" />
    
        <!-- Needed for passing extras with intent ACTION_SHOW_ADMIN_SUPPORT_DETAILS -->
        <uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" />

    三、源码路径如下

    链接: https://pan.baidu.com/s/1ge62etl 密码: 8n5q

    四、总结

    1、Runtime.getRuntime().exec()这个方法在android7.0不行,没调通。

    2、其实方法一的IPackageManager.aidl和方法二的PackageManager.java里面的方法是过时的,Android7.0哪里写着 deprecated replaced by PackageInstaller。

    应该使用IPackageInstaller.aidl和PackageInstaller.java更好,但是使用IPackageManager.aidl和PackageManager.java我测试也是行的。

  • 相关阅读:
    Linux0.11之初识Makefile/build.c
    主机(windows10)虚拟机(ubuntu18)arm板(linux3.4)相互ping通
    windows上利用dhcpsrv搭建DHCP服务器
    《剑指offer》面试题27 二叉搜索树与双向链表 Java版
    《剑指offer》面试题26 复杂链表的复制 Java版
    《剑指offer》面试题25 二叉树中和为某一值的路径 Java版
    《剑指offer》面试题24 二叉搜索树的后序遍历序列 Java版
    异常处理
    三元表达式、列表推导式、生成器表达式、匿名函数、内置函数、递归调用与二分法的简单认识
    迭代器与生成器
  • 原文地址:https://www.cnblogs.com/DaSunWarman/p/7955933.html
Copyright © 2020-2023  润新知