App的静默安装和卸载
Android系统本身提供了安装卸载功能,但是api接口是@hide
的,不是公开的接口,所以在应用级别
是无法实现静默安装和卸载的,要实现静默安装和卸载需要是系统应用,要有系统签名和相应的权限
简单思路如下:
1. 通过反射获得安装接口installPackage
和 卸载接口 deletePackage
2. 在自己的包中引入两个接口IPackageInstallObserver
和IPackageDeleteObserver
的空实现
3. 调用安装卸载的方法,回调上面的两个接口
4. 添加权限 <uses-permission android:name="android.permission.DELETE_PACKAGES"/>
<uses-permission android:name="android.permission.INSTALL_PACKAGES"/>
5. 进行系统签名
6. 将应用push到系统中,作为系统应用
在PackageManager
中的提供的接口如下
安装接口
// @SystemApi public abstract void installPackage( Uri packageURI, IPackageInstallObserver observer, int flags, String installerPackageName);
卸载接口
// @SystemApi public abstract void deletePackage( String packageName, IPackageDeleteObserver observer, int flags);
引入两个回掉的空实现
在自己应用的工程中新建一个包android.content.pm
,并添加两个文件
* IPackageDeleteObserver.java
package android.content.pm;
public interface IPackageDeleteObserver extends android.os.IInterface {
public abstract static class Stub extends android.os.Binder implements android.content.pm.IPackageDeleteObserver {
public Stub() {
throw new RuntimeException("Stub!");
}
public static android.content.pm.IPackageDeleteObserver asInterface(android.os.IBinder obj) {
throw new RuntimeException("Stub!");
}
public android.os.IBinder asBinder() {
throw new RuntimeException("Stub!");
}
public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags)
throws android.os.RemoteException {
throw new RuntimeException("Stub!");
}
}
public abstract void packageDeleted(java.lang.String packageName, int returnCode)
throws android.os.RemoteException;
}
IPackageInstallObserver.java
package android.content.pm; public interface IPackageInstallObserver extends android.os.IInterface { public abstract s