Chinaunix首页 | 论坛 | 博客
  • 博客访问: 168109
  • 博文数量: 22
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 248
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-05 19:05
文章分类
文章存档

2018年(12)

2017年(10)

我的朋友

分类: Android平台

2017-12-02 22:29:57

一、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里面的方法

frameworks\base\core\java\android\content\pm\IPackageManager.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所在目录为:

frameworks\base\core\java\android\content\pm\PackageManager.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="android.permission.MANAGE_DEVICE_ADMINS" />

三、源码路径如下

链接: 密码: 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我测试也是行的。

阅读(3863) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~