首先开头感谢这两篇文章,参考他们两个的改出来的(刚接触formwork):
Android 7.1.1 Framework 修改记录(一) 静默安装/卸载 (pm命令抛异常的过来看看) - 知乎
java - 使用 Runtime.getRuntime 在 Android 上运行 shell 命令 - IT工具网
改formwork成的两个文件:
路径:frameworks\base\services\core\java\com\android\server\pm
文件名:
PackageInstallerSession.java
PackageInstallerService.java
代码如下:
/**
* @param context
* @param apkPath 文件路径
* @param installListener 安装监听
*/
public synchronized static void installApk(Context context, String apkPath, ApkInstallListener installListener){
try {
PackageInfo info = getApkInfo(context, apkPath);
String[] args = {"pm", "install", "-i", info.packageName, "--user", "0", "-r", apkPath};
ProcessBuilder processBuilder = new ProcessBuilder(args);
Log.e(TAG, "installApk: "+info.toString());
Process process = null;
BufferedReader successResult = null;
BufferedReader errorResult = null;
StringBuilder successMsg = new StringBuilder();
StringBuilder errorMsg = new StringBuilder();
try {
process = processBuilder.start();
successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));
errorResult = new BufferedReader(new InputStreamReader( process.getErrorStream()));
String line;
while ((line = successResult.readLine()) != null) {
successMsg.append(line);
}
while ((line = errorResult.readLine()) != null) {
errorMsg.append(line);
}
Log.i(TAG, "install success_msg " + successMsg.toString());
Log.i(TAG, "install error_msg " + errorMsg.toString());
if(successMsg.toString().contains("Success")){
if(installListener != null) {
installListener.onSuccess(info.packageName);
}
}else{
if(installListener != null) {
installListener.onFail(new RuntimeException(errorMsg.toString()));
}
}
}catch (Exception e) {
Log.i(TAG, "install fail ", e);
if(installListener != null) {
installListener.onFail(e);
}
} finally {
try {
if(successResult != null){
successResult.close();
}
} catch (IOException e) {
}
try {
if(errorResult != null){
errorResult.close();
}
} catch (IOException e) {
}
try {
if(process != null){
process.destroy();
}
} catch (Exception e) {
}
}
} catch (Exception e) {
installListener.onFail(e);
}
}
/**
* 获取apk包的信息:版本号,名称,图标等
* @param absPath apk包的绝对路径
* @param context
*/
private static PackageInfo getApkInfo(Context context, String absPath) {
PackageInfo pkgInfo = null;
try {
PackageManager pm = context.getPackageManager();
pkgInfo = pm.getPackageArchiveInfo(absPath, PackageManager.GET_ACTIVITIES);
if (pkgInfo != null) {
ApplicationInfo appInfo = pkgInfo.applicationInfo;
/* 必须加这两句,不然下面icon获取是default icon而不是应用包的icon */
appInfo.sourceDir = absPath;
appInfo.publicSourceDir = absPath;
String appName = pm.getApplicationLabel(appInfo).toString();// 得到应用名
String packageName = appInfo.packageName; // 得到包名
String version = pkgInfo.versionName; // 得到版本信息
/* icon1和icon2其实是一样的
Drawable icon1 = pm.getApplicationIcon(appInfo);// 得到图标信息
Drawable icon2 = appInfo.loadIcon(pm);
*/
String pkgInfoStr = String.format("PackageName:%s, Vesion: %s, AppName: %s", packageName, version, appName);
Log.i("YTUtils", String.format("PkgInfo: %s", pkgInfoStr));
}
} catch (Exception e) {
Log.e("YTUtils", "apk文件信息读取失败" + absPath, e);
}
return pkgInfo;
}
/**
* 卸载apk
* @param context
* @param packageName 包名
* @param installListener 卸载监听
*/
public synchronized static void uninstallApk(Context context, String packageName, ApkInstallListener installListener){
try {
String[] args = {"pm", "uninstall", "-k", "--user", "0", packageName};
ProcessBuilder processBuilder = new ProcessBuilder(args);
Process process = null;
BufferedReader successResult = null;
BufferedReader errorResult = null;
StringBuilder successMsg = new StringBuilder();
StringBuilder errorMsg = new StringBuilder();
try {
process = processBuilder.start();
successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));
errorResult = new BufferedReader(new InputStreamReader( process.getErrorStream()));
String line;
while ((line = successResult.readLine()) != null) {
successMsg.append(line);
}
while ((line = errorResult.readLine()) != null) {
errorMsg.append(line);
}
Log.i(TAG, "uninstall success_msg " + successMsg.toString());
Log.i(TAG, "uninstall error_msg " + errorMsg.toString());
if(successMsg.toString().contains("Success")){
if(installListener != null) {
installListener.onSuccess(packageName);
}
}else{
if(installListener != null) {
installListener.onFail(new RuntimeException(errorMsg.toString()));
}
}
}catch (Exception e) {
Log.i(TAG, "install fail ", e);
if(installListener != null) {
installListener.onFail(e);
}
} finally {
try {
if(successResult != null){
successResult.close();
}
} catch (IOException e) {
}
try {
if(errorResult != null){
errorResult.close();
}
} catch (IOException e) {
}
try {
if(process != null){
process.destroy();
}
} catch (Exception e) {
}
}
} catch (Exception e) {
installListener.onFail(e);
}
}
ApkInstallListener.java
/***
* 安装卸载结果回调
*/
public interface ApkInstallListener {
public void onSuccess(String packageName);
public void onFail(Exception e);
}
安装卸载代码copy此文章:
Android 7.1.1 Framework 修改记录(一) 静默安装/卸载 (pm命令抛异常的过来看看) - 知乎
当前在9.0系统试试可以的,其他系统没试不知道