Android安装APP的源码微解读

  • 在开发第三方app时,一般会采用非静默的app安装方式,这需要发intent来
private void install(String filePath) {
        Log.i(TAG, "开始执行安装: " + filePath);
        File apkFile = new File(filePath);
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            Log.w(TAG, "版本大于 N ,开始使用 fileProvider 进行安装");
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            Uri contentUri = FileProvider.getUriForFile(
                    mContext
                    , "你的包名.fileprovider"
                    , apkFile);
            intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
        } else {
            Log.w(TAG, "正常进行安装");
            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
        }
        startActivity(intent);
    }

更具体的代码,请看: Android 在代码中安装 APK 文件
这个会走到 packageinstaller.apk 应用处理安装过程的界面(卸载也走这里)
首先进入这个类:PackageInstallerActivity.java
安装过程是这个类:InstallAppProgress.java

  • 如果是想静默安装app,那就直接调用:
PackageManager pm = mContext.getPackageManager();
Uri uri = Uri.parse("file://" + mFirmWarePath);
int installFlags = 0;
PackageInstallObserver observer = new PackageInstallObserver();
pm.installPackage(uri, observer, installFlags, null);
  • installFlags 参数解析
/android/content/pm/PackageManager.java
public static final int INSTALL_FROM_ADB = 0x00000020;
public static final int INSTALL_ALL_USERS = 0x00000040;
// 降级安装
public static final int INSTALL_ALLOW_DOWNGRADE = 0x00000080;

参与或运算

  • 无论那种调用,最终都会都到
    PackageManagerService.installPackageAsUser
    位置:/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

  • installPackageAsUser 函数是 PMS 端的起点
    往下可以看这篇:android apk安装过程源码解析

待续 ......
  • 上述用到的参考链接:
  1. Android 在代码中安装 APK 文件
  2. Android应用程序安装过程解析(源码角度)
  3. android apk安装过程源码解析
  4. 老罗:Android应用程序安装过程源代码分析

你可能感兴趣的:(Android安装APP的源码微解读)