浅谈Android中静默安装&&卸载流程的使用

1.静默安装:一般需要该应用是系统级别的应用,经过了平台下发的对应签名apk。

即: 1.内置到ROM,即APK包的安装位置是/system/app下。

        2.使用APK的目标安装系统同样的签名。

         当然不同平台的签名是不一样的,这个需要根据平台业务来具体确认,第三方Rom这样做也是处于保护系统安全的角度来考虑的。

个人在这只是针对上述分享下静默安装的具体实现方式:

针对 Android 6.0 and up. 静默安装示例如下:

public static boolean installPackage(Context context, InputStream in, String packageName) throws IOException {
    PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
    PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);
    params.setAppPackageName(packageName);
    // set params
    int sessionId = packageInstaller.createSession(params);
    PackageInstaller.Session session = packageInstaller.openSession(sessionId);
    OutputStream out = session.openWrite(packageName, 0, -1);
    byte[] buffer = new byte[65536];
    int c;
    while ((c = in.read(buffer)) != -1) {
       out.write(buffer, 0, c);
   }
    session.fsync(out);
    in.close();
    out.close();
    session.commit(createIntentSender(context, sessionId));
    return true;
}

    private static IntentSender createIntentSender(Context context, int sessionId) {
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context,sessionId,new Intent(Intent.ACTION_PACKAGE_ADDED),PendingIntent.FLAG_UPDATE_CURRENT);
        return pendingIntent.getIntentSender();
}

针对 Android 6.0 and up. 静默卸载示例如下:

String appPackage = "com.your.app.package";
Intent intent = new Intent(getActivity(), getActivity().getClass());
PendingIntent sender = PendingIntent.getActivity(getActivity(), 0, intent, 0);
PackageInstaller mPackageInstaller = getActivity().getPackageManager().getPackageInstaller();
mPackageInstaller.uninstall(appPackage, sender.getIntentSender());

低版本Android 6.0以下,大部分app的静默安装都是通过 移植系统源码中的相关AIDL 文件,进行调用pm里面的android方法:

普通情况下肯定是调用不到的。在源码\frameworks\base\core\java\android\content\pm目录下PackageManager.java,应该发现

在注释行里有加上@hide声明。调用的安装下载接口如下:

public abstract void installPackage(Uri packageURI,IPackageInstallObserver observer, int flags,String installerPackageName);
public abstract void deletePackage(String packageName,IPackageDeleteObserver observer, int flags);

最简单的就是直接拷贝4个文件即可:

PackageManager.java

IPackageDeleteObserver.aidl

IPackagerInstallObserver.aidl

IPackageMoveObserver.aidl

然后把PackageManager.java中报的异常的接口都注释掉即可,然后直接调用pm里面的方法。

静默安装示例如下:

/*** 静默安装* */
public static void autoInstallApk(Context context, String fileName,String packageName, String APPName) {
       Log.d(TAG, “jing mo an zhuang:” + packageName + “,fileName:” + fileName);File file = new File(fileName);
       int installFlags = 0;
       if (!file.exists())
                return;
           installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
       if (hasSdcard()) {
           installFlags |= PackageManager.INSTALL_EXTERNAL;
       }
       PackageManager pm = context.getPackageManager();
       try {
            IPackageInstallObserver observer = new MyPakcageInstallObserver(context, APPName, appId, fileName,packageName,type_name);
            Log.i(TAG, “########installFlags:” + installFlags+”packagename:”+packageName);
            pm.installPackage(Uri.fromFile(file), observer, installFlags,packageName);
           } catch (Exception e) {
                

          }
}

实现静默安装的回调接口如下:

class MyPakcageInstallObserver extends IPackageInstallObserver.Stub {
Context cxt;
String appName;
String filename;
String pkname;

 public MyPakcageInstallObserver(Context c, String appName, String filename, String packagename) {
  this.cxt = c;
  this.appName = appName;
  this.filename = filename;
  this.pkname = packagename;
}

    @Override
    public void packageInstalled(String packageName, int returnCode) {
        Log.i(TAG, “returnCode = ” + returnCode);// 返回1代表安装成功
        if (returnCode == 1) {
             //TODO
        }
        Intent it = new Intent();
        it.setAction(CustomAction.INSTALL_ACTION);
        it.putExtra(“install_returnCode”, returnCode);
        it.putExtra(“install_packageName”, packageName);
        it.putExtra(“install_appName”, appName); cxt.sendBroadcast(it);
    }
}

下面来看看apk的卸载流程。

[/frameworks/base/core/java/android/app/ApplicationPackageManager.java]

@Override
public void deletePackage(String packageName, IPackageDeleteObserver observer, int flags) {
    try {
        mPM.deletePackageAsUser(packageName, observer, UserHandle.myUserId(), flags);
    } catch (RemoteException e) {
    // Should never happen!
  }
}

Client端调用PackageManager的deletePackage方法删除对应包名的apk,其中通过注册IPackageDeleteObserver监听卸载结果。实际上通过binder调用pms的deletePackageAsUser方法,在服务中执行卸载动作。

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Inno Setup是一款流行的Windows安装程序创建工具,支持静默安装卸载静默安装指的是在用户操作的情况下,自动进行软件安装而无需用户进行任何操作。以下是如何使用Inno Setup进行静默安装卸载的方法: 静默安装: 1.首先,确保已经准备好要安装的软件的所有必要文件和文件夹。 2.创建一个包含安装程序信息的脚本文件,可以使用Inno Setup提供的脚本编辑器或其他文本编辑器来编写。 3.在脚本文件使用[Setup]部分的相应选项配置静默安装模式。例如,可以将"DisableStartupPrompt"选项设置为yes,这将禁用任何与用户操作相关的提示消息。 4.保存和编译脚本,生成安装程序。 5.在命令行执行安装程序,并使用"/VERYSILENT"和"/NORESTART"参数以及其他可能的参数来启用静默安装模式。例如,"setup.exe /VERYSILENT /NORESTART"。 6.安装程序将在后台运行,进行静默安装卸载: 1.确定要卸载的软件的安装位置和卸载程序的名称。 2.打开命令提示符或PowerShell窗口,并导航到安装目录。 3.在命令行输入卸载程序的名称,通常为"unins000.exe"或类似名称。 4.使用"/VERYSILENT"参数来启用静默卸载模式。例如,"unins000.exe /VERYSILENT"。 5.卸载程序将在后台运行,进行静默卸载。 6.卸载完成后,软件将从系统完全移除。 总结而言,Inno Setup可以通过配置脚本文件和使用适当的参数,在静默模式下进行软件的安装卸载。这对于需要批量安装或远程安装的情况下非常有用,同时也减少了用户操作的繁琐。 ### 回答2: Inno Setup 是一个常用的安装程序制作工具,可以帮助开发者创建 Windows 平台下的安装程序。而静默安装卸载则是 Inno Setup 提供的两个重要功能。 静默安装(Silent Installation)是指在用户无需进行任何交互的情况下进行安装。通过传递命令行参数给 Inno Setup 执行文件,可以实现静默安装。一般来说,只需要在执行文件后面添加 /SILENT 或 /VERYSILENT 参数就可以实现静默安装。/SILENT 参数会显示进度条,/VERYSILENT 参数则完全不显示任何界面。 静默卸载(Silent Uninstallation)是指对已经安装的软件进行无需用户交互的卸载。同样地,可以通过添加命令行参数给 Inno Setup 卸载文件实现静默卸载。一般来说,在卸载文件后面添加 /SILENT 或 /VERYSILENT 参数即可实现静默卸载。 通过使用 Inno Setup 的静默安装卸载功能,可以实现自动化的软件发布和管理。开发者可以在无需用户干预的情况下,批量安装卸载软件,提高效率并减少错误。这对于企业环境的大规模软件部署和维护尤为重要。 总而言之,Inno Setup 提供了静默安装卸载的功能,使得软件部署和维护更加便捷高效。通过合理运用这两个功能,开发者可以轻松实现自动化的软件安装卸载,提高工作效率。 ### 回答3: Inno Setup 是一款功能强大的安装程序制作工具,也可以通过静默安装的方式来安装卸载软件。 静默安装是一种在用户无感知的情况下自动完成安装过程的方式。在使用 Inno Setup 进行静默安装时,我们可以通过命令行参数来实现。具体步骤如下: 1. 打开命令提示符或者脚本编辑器。 2. 切换到 Inno Setup 的安装程序所在的目录。 3. 输入以下命令进行静默安装: ``` Setup.exe /SILENT /NORESTART ``` `/SILENT` 参数表示以静默模式运行安装程序,安装过程不会显示任何界面和提示信息。 `/NORESTART` 参数表示安装完成后不自动重启计算机。 4. 等待一段时间,直到安装程序自动完成安装。 同样地,我们也可以使用相同的方式进行静默卸载。 1. 打开命令提示符或者脚本编辑器。 2. 切换到 Inno Setup 的安装程序所在的目录。 3. 输入以下命令进行静默卸载: ``` Setup.exe /SILENT /UNINSTALL ``` `/SILENT` 参数表示以静默模式运行卸载程序,卸载过程不会显示任何界面和提示信息。 `/UNINSTALL` 参数表示执行卸载操作。 4. 等待一段时间,直到卸载程序自动完成卸载。 通过以上步骤,我们可以实现使用 Inno Setup 进行静默安装卸载的功能。这种方式可以有效减少用户的操作,提高安装卸载的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值