[英]uninstall app silently with system privileges
我的应用程序具有系统特权。 它将位于固件中,现在位于/ system / app
我可以通过这篇文章静默安装应用程序
以编程方式安装/卸载APK(PackageManager与Intents)
有效的示例应用
http://paulononaka.wordpress.com/2011/07/02/how-to-install-a-application-in-background-on-android/
但是我仍然无法以相同的方式卸载应用程序。 我尝试像安装示例中一样使用反射。
public ApplicationManager(Context context) throws SecurityException, NoSuchMethodException {
observer = new PackageInstallObserver();
pm = context.getPackageManager();
Class<?>[] types = new Class[] {Uri.class, IPackageInstallObserver.class, int.class, String.class};
Class<?>[] uninstalltypes = new Class[] {String.class, IPackageInstallObserver.class, int.class};
method = pm.getClass().getMethod("installPackage", types);
uninstallmethod = pm.getClass().getMethod("deletePackage", uninstalltypes);
}
public void uninstallPackage(String packagename) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
uninstallmethod.invoke(pm, new Object[] {packagename, observer, 0});
}
public void installPackage(Uri apkFile) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
method.invoke(pm, new Object[] {apkFile, observer, INSTALL_REPLACE_EXISTING, null});
}
我添加了uninstallPackage方法并编辑了ApplicationManager方法。 仍然无法正常工作。
当我运行它时,找不到方法(在调用“ deletePackage”行上)。
这是我所做的更改无法正常工作的项目: https : //dl.dropbox.com/u/1928109/InstallInBackgroundSample.zip
这是功能的说明: http ://www.androidjavadoc.com/1.0_r1_src/android/content/pm/PackageManager.html#deletePackage(java.lang.String,android.content.pm.IPackageDeleteObserver,int)
参数还可以。 似乎我应该指定DeletePackageObserver类而不是InstallPackageObserver。 但是我不知道该怎么做(我没有这样的课程)。
谢谢
这是我的做法:
ApplicationManager.java(已更改的部分):
private PackageInstallObserver observer;
private PackageDeleteObserver observerdelete;
private PackageManager pm;
private Method method;
private Method uninstallmethod;
class PackageDeleteObserver extends IPackageDeleteObserver.Stub {
public void packageDeleted(String packageName, int returnCode) throws RemoteException {
/*if (onInstalledPackaged != null) {
onInstalledPackaged.packageInstalled(packageName, returnCode);
}*/
}
}
public ApplicationManager(Context context) throws SecurityException, NoSuchMethodException {
observer = new PackageInstallObserver();
observerdelete = new PackageDeleteObserver();
pm = context.getPackageManager();
Class<?>[] types = new Class[] {Uri.class, IPackageInstallObserver.class, int.class, String.class};
Class<?>[] uninstalltypes = new Class[] {String.class, IPackageDeleteObserver.class, int.class};
method = pm.getClass().getMethod("installPackage", types);
uninstallmethod = pm.getClass().getMethod("deletePackage", uninstalltypes);
}
public void uninstallPackage(String packagename) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
uninstallmethod.invoke(pm, new Object[] {packagename, observerdelete, 0});
}
PackageDeleteObserver.java(位于android.content.pm中):
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;
}
也不要忘记添加权限来实现 :
<uses-permission android:name="android.permission.DELETE_PACKAGES"/>
工作示例项目 (apk需要放置在设备上的“ / system / app”路径中) : http : //www.mediafire.com/file/no4buw54ed6vuzo/DeleteInBackgroundSample.zip
这是方法的定义方式:
public abstract void deletePackage(
String packageName, IPackageDeleteObserver observer, int flags);
要使用反射来调用它,您将需要以下内容:
Class<?>[] uninstalltypes = new Class[] {String.class,
IPackageDeleteObserver.class, int.class};
uninstallmethod = pm.getClass().getMethod("deletePackage", uninstalltypes);
注意观察者的类型。
如果您的应用程序已内置到系统映像中,并且使用的是内部API,则您最好不要假装自己是第三方应用程序,并链接到SDK。 针对完整平台.jar进行构建,并直接使用这些API。 无论如何,您都想这样做,因为它们是私有API,因此它们可以而且确实会发生变化。 您希望根据实际声明它们的内容进行构建,因此,如果它们确实发生更改,则在构建过程中会发现这一点。
在android 2.3.x中,接口IPackageDeleteObserver的方法packageDeleted不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.