-
-
Save Fuzion24/2623253 to your computer and use it in GitHub Desktop.
<?xml version="1.0" encoding="utf-8"?> | |
<manifest xmlns:android="http://schemas.android.com/apk/res/android" | |
package="com.packagemanager.poc" | |
android:versionCode="1" | |
android:versionName="1.0" > | |
<uses-sdk android:minSdkVersion="8" /> | |
<uses-permission android:name="android.permission.INSTALL_PACKAGES" /> | |
<uses-permission android:name="android.permission.DELETE_PACKAGES" /> | |
<application | |
android:icon="@drawable/ic_launcher" | |
android:label="@string/app_name" > | |
<activity | |
android:name=".PackageManagerActivity" | |
android:label="@string/app_name" > | |
<intent-filter> | |
<action android:name="android.intent.action.MAIN" /> | |
<category android:name="android.intent.category.LAUNCHER" /> | |
</intent-filter> | |
</activity> | |
</application> | |
</manifest> |
/* | |
* This file is auto-generated. DO NOT MODIFY. | |
* Original file: /Users/fuzion24/Development/workspace/PackageManager/src/android/content/pm/IPackageDeleteObserver.aidl | |
*/ | |
package android.content.pm; | |
/** | |
* API for deletion callbacks from the Package Manager. | |
* | |
* {@hide} | |
*/ | |
public interface IPackageDeleteObserver extends android.os.IInterface | |
{ | |
/** Local-side IPC implementation stub class. */ | |
public static abstract class Stub extends android.os.Binder implements android.content.pm.IPackageDeleteObserver | |
{ | |
private static final java.lang.String DESCRIPTOR = "android.content.pm.IPackageDeleteObserver"; | |
/** Construct the stub at attach it to the interface. */ | |
public Stub() | |
{ | |
this.attachInterface(this, DESCRIPTOR); | |
} | |
/** | |
* Cast an IBinder object into an android.content.pm.IPackageDeleteObserver interface, | |
* generating a proxy if needed. | |
*/ | |
public static android.content.pm.IPackageDeleteObserver asInterface(android.os.IBinder obj) | |
{ | |
if ((obj==null)) { | |
return null; | |
} | |
android.os.IInterface iin = (android.os.IInterface)obj.queryLocalInterface(DESCRIPTOR); | |
if (((iin!=null)&&(iin instanceof android.content.pm.IPackageDeleteObserver))) { | |
return ((android.content.pm.IPackageDeleteObserver)iin); | |
} | |
return new android.content.pm.IPackageDeleteObserver.Stub.Proxy(obj); | |
} | |
public android.os.IBinder asBinder() | |
{ | |
return this; | |
} | |
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException | |
{ | |
switch (code) | |
{ | |
case INTERFACE_TRANSACTION: | |
{ | |
reply.writeString(DESCRIPTOR); | |
return true; | |
} | |
case TRANSACTION_packageDeleted: | |
{ | |
data.enforceInterface(DESCRIPTOR); | |
boolean _arg0; | |
_arg0 = (0!=data.readInt()); | |
this.packageDeleted(_arg0); | |
return true; | |
} | |
} | |
return super.onTransact(code, data, reply, flags); | |
} | |
private static class Proxy implements android.content.pm.IPackageDeleteObserver | |
{ | |
private android.os.IBinder mRemote; | |
Proxy(android.os.IBinder remote) | |
{ | |
mRemote = remote; | |
} | |
public android.os.IBinder asBinder() | |
{ | |
return mRemote; | |
} | |
public java.lang.String getInterfaceDescriptor() | |
{ | |
return DESCRIPTOR; | |
} | |
public void packageDeleted(boolean succeeded) throws android.os.RemoteException | |
{ | |
android.os.Parcel _data = android.os.Parcel.obtain(); | |
try { | |
_data.writeInterfaceToken(DESCRIPTOR); | |
_data.writeInt(((succeeded)?(1):(0))); | |
mRemote.transact(Stub.TRANSACTION_packageDeleted, _data, null, android.os.IBinder.FLAG_ONEWAY); | |
} | |
finally { | |
_data.recycle(); | |
} | |
} | |
} | |
static final int TRANSACTION_packageDeleted = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); | |
} | |
public void packageDeleted(boolean succeeded) throws android.os.RemoteException; | |
} |
/* | |
* This file is auto-generated. DO NOT MODIFY. | |
* Original file: /Users/fuzion24/Development/workspace/PackageManager/src/android/content/pm/IPackageDeleteObserver.aidl | |
*/ | |
package android.content.pm; | |
/** | |
* API for deletion callbacks from the Package Manager. | |
* | |
* {@hide} | |
*/ | |
public interface IPackageDeleteObserver extends android.os.IInterface | |
{ | |
/** Local-side IPC implementation stub class. */ | |
public static abstract class Stub extends android.os.Binder implements android.content.pm.IPackageDeleteObserver | |
{ | |
private static final java.lang.String DESCRIPTOR = "android.content.pm.IPackageDeleteObserver"; | |
/** Construct the stub at attach it to the interface. */ | |
public Stub() | |
{ | |
this.attachInterface(this, DESCRIPTOR); | |
} | |
/** | |
* Cast an IBinder object into an android.content.pm.IPackageDeleteObserver interface, | |
* generating a proxy if needed. | |
*/ | |
public static android.content.pm.IPackageDeleteObserver asInterface(android.os.IBinder obj) | |
{ | |
if ((obj==null)) { | |
return null; | |
} | |
android.os.IInterface iin = (android.os.IInterface)obj.queryLocalInterface(DESCRIPTOR); | |
if (((iin!=null)&&(iin instanceof android.content.pm.IPackageDeleteObserver))) { | |
return ((android.content.pm.IPackageDeleteObserver)iin); | |
} | |
return new android.content.pm.IPackageDeleteObserver.Stub.Proxy(obj); | |
} | |
public android.os.IBinder asBinder() | |
{ | |
return this; | |
} | |
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException | |
{ | |
switch (code) | |
{ | |
case INTERFACE_TRANSACTION: | |
{ | |
reply.writeString(DESCRIPTOR); | |
return true; | |
} | |
case TRANSACTION_packageDeleted: | |
{ | |
data.enforceInterface(DESCRIPTOR); | |
boolean _arg0; | |
_arg0 = (0!=data.readInt()); | |
this.packageDeleted(_arg0); | |
return true; | |
} | |
} | |
return super.onTransact(code, data, reply, flags); | |
} | |
private static class Proxy implements android.content.pm.IPackageDeleteObserver | |
{ | |
private android.os.IBinder mRemote; | |
Proxy(android.os.IBinder remote) | |
{ | |
mRemote = remote; | |
} | |
public android.os.IBinder asBinder() | |
{ | |
return mRemote; | |
} | |
public java.lang.String getInterfaceDescriptor() | |
{ | |
return DESCRIPTOR; | |
} | |
public void packageDeleted(boolean succeeded) throws android.os.RemoteException | |
{ | |
android.os.Parcel _data = android.os.Parcel.obtain(); | |
try { | |
_data.writeInterfaceToken(DESCRIPTOR); | |
_data.writeInt(((succeeded)?(1):(0))); | |
mRemote.transact(Stub.TRANSACTION_packageDeleted, _data, null, android.os.IBinder.FLAG_ONEWAY); | |
} | |
finally { | |
_data.recycle(); | |
} | |
} | |
} | |
static final int TRANSACTION_packageDeleted = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); | |
} | |
public void packageDeleted(boolean succeeded) throws android.os.RemoteException; | |
} |
package com.packagemanager.poc; | |
import java.io.File; | |
import java.lang.reflect.Method; | |
import android.app.Activity; | |
import android.content.pm.IPackageDeleteObserver; | |
import android.content.pm.IPackageInstallObserver; | |
import android.content.pm.PackageManager; | |
import android.os.Bundle; | |
import android.net.Uri; | |
public class PackageManagerActivity extends Activity { | |
public static final int INSTALL_REPLACE_EXISTING = 0x00000002; | |
/** Called when the activity is first created. */ | |
@Override | |
public void onCreate(Bundle savedInstanceState) { | |
String fileName = "/sdcard/test.apk"; | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.main); | |
installPackage(fileName); | |
} | |
public void installPackage(String fileName){ | |
try { | |
PackageManager pkgManager = getPackageManager(); | |
Method installPackage = pkgManager.getClass().getMethod("installPackage", android.net.Uri.class, IPackageInstallObserver.class ,int.class,java.lang.String.class); | |
Uri androidAPK = Uri.fromFile(new File(fileName)); | |
Object[] params = new Object[] { androidAPK, null, INSTALL_REPLACE_EXISTING, "" }; | |
installPackage.invoke(pkgManager, params); | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
} | |
public void deletePackage(String packageName){ | |
try { | |
PackageManager pkgManager = getPackageManager(); | |
Method deletePackage = pkgManager.getClass().getMethod("installPackage",String[].class, IPackageDeleteObserver.class, int.class); | |
Object[] params = new Object[] {packageName, null, 0 }; | |
deletePackage.invoke(pkgManager, params); | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
} | |
} |
Why is IPackageInstallObserver look like this?
public interface IPackageDeleteObserver extends android.os.IInterface{ ... }
Why is it similar to IPackageDeleteObserver?
I am using rooted device and made my app as system app. Install is properly working but Uninstall is not working at all. I am using android version 7.1.2 and device model is Moto E3 Power.
Hi, found this interesting, but a little confused.
Do I need to copy all this files into my project then run it right?
IPackageInstallObserver.java also has the definition of IPackageDeleteObserver inside,
`/*
- This file is auto-generated. DO NOT MODIFY.
- Original file: frameworks/base/core/java/android/content/pm/IPackageInstallObserver.aidl
/
package android.content.pm;
/* - API for installation callbacks from the Package Manager.
- @hide
/
public interface IPackageInstallObserver extends android.os.IInterface
{
/* Local-side IPC implementation stub class. /
public static abstract class Stub extends android.os.Binder implements android.content.pm.IPackageInstallObserver
{
private static final java.lang.String DESCRIPTOR = "android.content.pm.IPackageInstallObserver";
/* Construct the stub at attach it to the interface. /
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}
/* - Cast an IBinder object into an android.content.pm.IPackageInstallObserver interface,
- generating a proxy if needed.
*/
public static android.content.pm.IPackageInstallObserver asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = (android.os.IInterface)obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof android.content.pm.IPackageInstallObserver))) {
return ((android.content.pm.IPackageInstallObserver)iin);
}
return new android.content.pm.IPackageInstallObserver.Stub.Proxy(obj);
}
public android.os.IBinder asBinder()
{
return this;
}
@OverRide public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(DESCRIPTOR);
return true;
}
case TRANSACTION_packageInstalled:
{
data.enforceInterface(DESCRIPTOR);
java.lang.String _arg0;
_arg0 = data.readString();
int _arg1;
_arg1 = data.readInt();
this.packageInstalled(_arg0, _arg1);
return true;
}
}
return super.onTransact(code, data, reply, flags);
}
private static class Proxy implements android.content.pm.IPackageInstallObserver
{
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote)
{
mRemote = remote;
}
public android.os.IBinder asBinder()
{
return mRemote;
}
public java.lang.String getInterfaceDescriptor()
{
return DESCRIPTOR;
}
public void packageInstalled(java.lang.String packageName, int returnCode) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeString(packageName);
_data.writeInt(returnCode);
mRemote.transact(Stub.TRANSACTION_packageInstalled, _data, null, android.os.IBinder.FLAG_ONEWAY);
}
finally {
_data.recycle();
}
}
}
static final int TRANSACTION_packageInstalled = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
}
public void packageInstalled(java.lang.String packageName, int returnCode) throws android.os.RemoteException;
}`
I am using rooted device and made my app as system app. Install is properly working but Uninstall is not working at all. I am using android version 7.1.2 and device model is Moto E3 Power.
will help me with this ?
i am using rooted device but its not working.
They are of the same implementation, only the changed name of each class. You could send the IPackageInstallObserver class?