该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
不知道哪里出了问题,折腾了好几天了
logcat显示
I load plugin class com.plugin.PluginMain
W dalvik Class resolved by unexpected DEX: Lcom/plugin/PluginMain;(0x42771290):0x50da8000 ref [LLogCatBroadcaster;] LLogCatBroadcaster;(0x42736e80):0x4006e000
.........
源码
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import dalvik.system.DexClassLoader;
import android.app.Activity;
import android.content.pm.PackageInfo;
import android.os.Bundle;
import android.util.Log;
import android.content.*;
public class PluginActivity extends Activity
{
private Context mContext = this;
private Class> localClass;
private Object localInstance;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
String dexpath = "/sdcard/AppProjects/plugin/bin/plugin.apk";
String cachePath = getApplication().getCacheDir().getPath();
String dexoutputpath = cachePath;
String libPath = cachePath;
LoadAPK(dexpath, dexoutputpath, libPath);
pluginActivityCreate();
}
public void LoadAPK(String dexpath, String dexoutputpath, String libPath)
{
try
{
ClassLoader classLoader = getClassLoader();
DexClassLoader localDexClassLoader = new DexClassLoader(dexpath, dexoutputpath, libPath, classLoader);
String activityname = getActivityName(dexpath);
if (activityname != null)
{
localClass = localDexClassLoader.loadClass(activityname);
Constructor> localConstructor = localClass.getConstructor(new Class[] {Context.class});
localInstance = localConstructor.newInstance(new Object[] {mContext});
Log.i("load plugin",localClass.toString());
}
return;
}
catch (Exception e)
{
e.printStackTrace();
}
}
public String getActivityName(String apkFile)
{
PackageInfo plocalObject = mContext.getPackageManager().getPackageArchiveInfo(apkFile, 1);
if ((plocalObject.activities != null) && (plocalObject.activities.length > 0))
{
return plocalObject.activities[0].name;
}
else
{
return null;
}
}
private void pluginActivityCreate(){
try
{
Method onCreate = localClass.getDeclaredMethod("onCreate", new Class[]{Bundle.class});
onCreate.setAccessible(true);
onCreate.invoke(localInstance, new Object[]{null});
}
catch (NoSuchMethodException e)
{
e.printStackTrace();
}
catch (IllegalArgumentException e)
{
e.printStackTrace();
}
catch (InvocationTargetException e)
{
e.printStackTrace();
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
}
}
插件
import android.app.*;
import android.os.*;
import android.util.*;
import android.view.*;
import android.view.ViewGroup.*;
import android.content.*;
import android.widget.*;
import android.graphics.*;
public class PluginMain extends Activity
{
protected Activity mProxyActivity = this;
private String TAG = "plugin";
public PluginMain()
{
super();
}
public PluginMain(Context context)
{
super();
this.mProxyActivity = (Activity) context;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
if (mProxyActivity == this)
{
super.onCreate(savedInstanceState);
}
else
{
mProxyActivity.setContentView(getView(mProxyActivity));
}
Log.d(TAG, "Plugin onCreate");
}
private View getView(Context context)
{
LinearLayout layout = new LinearLayout(context);
layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
layout.setBackgroundColor(Color.WHITE);
Button button = new Button(context);
button.setText("button");
layout.addView(button, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View p1)
{
// TODO: Implement this method
Toast.makeText(mProxyActivity, "HelloWorld", Toast.LENGTH_SHORT).show();
}
});
return layout;
}
}