- 在开发第三方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安装过程源码解析
待续 ......
- 上述用到的参考链接:
网友评论