加载未安装APK中的类

当前哪些API可用于动态加载

 DexClassLoader

这个可以加载jar/apk/dex,也可以从SD卡中加载。

PathClassLoader  

只能加载已经安装到Android系统中的apk文件。 

一、工程TestB

1、ITest.java

package cn.jiepu.testb;

public interface ITest {
	
	String getMoney();

}

2、TestBActivity.java

package cn.jiepu.testb;

import android.os.Bundle;
import android.app.Activity;


public class TestBActivity extends Activity implements ITest{

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}

	@Override
	public String getMoney() {
		
		
		return "hehe";
	}

}

将生成后的TestB.apk拷贝到SD卡的根目录下。

二、工程TestA

1、TestAActivity.java

package cn.jiepu.testa;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

import dalvik.system.DexClassLoader;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;
import android.app.Activity;

public class TestAActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		String path=Environment.getExternalStorageDirectory()+"/";
		String fileName="TestB.apk";
		DexClassLoader classLoader=new DexClassLoader(path+fileName, path, null, getClassLoader());
		try {
			Class mLoadClass=classLoader.loadClass("cn.jiepu.testb.TestBActivity");
			Constructor constructor=mLoadClass.getConstructor(new Class[]{});
			Object TestBActivity=constructor.newInstance(new Object[]{});
			Method getMoney=mLoadClass.getMethod("getMoney", null);
			getMoney.setAccessible(true);
			Object money=getMoney.invoke(TestBActivity, null);
			Toast.makeText(this, money.toString(), Toast.LENGTH_LONG).show();
			Log.i("wjh", "success");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}


}

添加
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


你可能感兴趣的:(加载未安装APK中的类)