2012-10-17 142 views
1

我想反映一個Android類,我們知道它可以完成是因爲其他應用程序正在做它,但努力實現自己的結果。Android反射混淆

我們被困在下面

Class<?> myClass = Class.forName("android.content.pm.PackageManager"); 
Method method = myClass.getMethod("deleteApplicationCacheFiles", String.class,IPackageDataObserver.class); 

IPackageDataObserver.class不存在

import android.content.pm.IPackageDataObserver; 

也不起作用,我可以手動獲得來自谷歌和接口的代碼把它們放到Package中,但似乎有點OTT,想知道我是否錯過了一些東西。

感謝

回答

3

編輯:

的IPackageDataObserver類添加到項目中的自我,它能夠做到這一點的唯一方法。

打個包在你的源文件夾命名爲「android.content.pm」這個類添加到它,這個類就是原生Android的源代碼:

/* 
* This file is auto-generated. DO NOT MODIFY. 
* Original file: frameworks/base/core/java/android/content/pm/IPackageDataObserver.aidl 
*/ 
package android.content.pm; 
/** 
* API for package data change related callbacks from the Package Manager. 
* Some usage scenarios include deletion of cache directory, generate 
* statistics related to code, data, cache usage(TODO) 
* {@hide} 
*/ 
public interface IPackageDataObserver extends android.os.IInterface 
{ 
/** Local-side IPC implementation stub class. */ 
public static abstract class Stub extends android.os.Binder implements android.content.pm.IPackageDataObserver 
{ 
private static final java.lang.String DESCRIPTOR = "android.content.pm.IPackageDataObserver"; 
/** Construct the stub at attach it to the interface. */ 
public Stub() 
{ 
this.attachInterface(this, DESCRIPTOR); 
} 
/** 
* Cast an IBinder object into an android.content.pm.IPackageDataObserver interface, 
* generating a proxy if needed. 
*/ 
public static android.content.pm.IPackageDataObserver 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.IPackageDataObserver))) { 
return ((android.content.pm.IPackageDataObserver)iin); 
} 
return new android.content.pm.IPackageDataObserver.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_onRemoveCompleted: 
{ 
data.enforceInterface(DESCRIPTOR); 
java.lang.String _arg0; 
_arg0 = data.readString(); 
boolean _arg1; 
_arg1 = (0!=data.readInt()); 
this.onRemoveCompleted(_arg0, _arg1); 
return true; 
} 
} 
return super.onTransact(code, data, reply, flags); 
} 
private static class Proxy implements android.content.pm.IPackageDataObserver 
{ 
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 onRemoveCompleted(java.lang.String packageName, boolean succeeded) throws android.os.RemoteException 
{ 
android.os.Parcel _data = android.os.Parcel.obtain(); 
try { 
_data.writeInterfaceToken(DESCRIPTOR); 
_data.writeString(packageName); 
_data.writeInt(((succeeded)?(1):(0))); 
mRemote.transact(Stub.TRANSACTION_onRemoveCompleted, _data, null, android.os.IBinder.FLAG_ONEWAY); 
} 
finally { 
_data.recycle(); 
} 
} 
} 
static final int TRANSACTION_onRemoveCompleted = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); 
} 
public void onRemoveCompleted(java.lang.String packageName, boolean succeeded) throws android.os.RemoteException; 
} 

羅爾夫

+0

感謝您的幫助 – James

0

我想問題是IPackageDataObserver是原始的AIDL文件所以它在運行時生成gen文件夾不是src文件夾。所以解決方案是將IPackageDataObserver.aidl添加到您的項目中,並記住保持此文件最新。你可以得到IPackageDataObserver的內容。

/* 
** 
** Copyright 2007, The Android Open Source Project 
** 
** Licensed under the Apache License, Version 2.0 (the "License"); 
** you may not use this file except in compliance with the License. 
** You may obtain a copy of the License at 
** 
** http://www.apache.org/licenses/LICENSE-2.0 
** 
** Unless required by applicable law or agreed to in writing, software 
** distributed under the License is distributed on an "AS IS" BASIS, 
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
** See the License for the specific language governing permissions and 
** limitations under the License. 
*/ 

package android.content.pm; 

/** 
* API for package data change related callbacks from the Package Manager. 
* Some usage scenarios include deletion of cache directory, generate 
* statistics related to code, data, cache usage(TODO) 
* {@hide} 
*/ 
oneway interface IPackageDataObserver { 
    void onRemoveCompleted(in String packageName, boolean succeeded); 
} 

另一個類似SO question

1

這個問題有1年,但我喜歡用一些有用的信息完成它,其他的解決辦法是添加到項目中的lib layoutlib.jar是在者平臺//數據並按照提供的進行編譯(這不包括在你的二進制文件中),這樣你的項目就可以解析依賴關係,因爲這些文件不在公共sdk上。

+0

如何添加layoutlib.jar文件? – Erum

+0

你可以在plaform/android- /data /上找到layoutlib。如果你正在使用gradle,把jar放在你的libs文件夾中,然後添加依賴關係到build.xml文件中('libs/layoutlib.jar') – flipper83

+0

im使用eclipse,我已經添加了layoutlib.jar,但這個代碼仍然存在在onRemoveComplete覆蓋方法中返回包名null – Erum