一、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 := platformLOCAL_PRIVILEGED_MODULE := true

AndroidManifest.xml

android:sharedUserId="android.uid.system"                                                                        

三、源码路径如下

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

更多相关文章

  1. Android应用程序的数据存放目录 路径
  2. android 引入jni 的so库的方法
  3. Android屏幕保持常亮的三种方法
  4. Android 关闭/打开多点触控 (Android中设置不能同时点击2个view的
  5. Android : android 9.0 audio 接口分析
  6. android 上调试动态库方法
  7. Android多线程同步转异步方法总结

随机推荐

  1. Android(安卓)自定义控件打造史上最简单
  2. Android(安卓)事件处理
  3. 仿Android6.0联系人列表
  4. Android电话拨打流程源码分析
  5. 为什么说Android令人沮丧!?
  6. Android状态check、focused、pressed、se
  7. Android安装以及Eclipse插件(Google Andr
  8. Ubuntu 试用Android(安卓)L版本
  9. android 10 高通 图标名称双行显示
  10. Android收藏商品/关注商品