Android通过DexClassLoader加载apk文件

String apkFileDir = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "test.apk";
		String optDir = getDir("optdex", Context.MODE_PRIVATE).getAbsolutePath();
		new File(optDir).mkdirs();
		
		//public DexClassLoader (String dexPath, String optimizedDirectory, String libraryPath, ClassLoader parent)
		DexClassLoader classLoader = new DexClassLoader(
				apkFileDir, //the list of jar/apk files containing classes and resources, delimited by File.pathSeparator, which defaults to ":" on Android
				optDir, //directory where optimized dex files should be written; must not be null
				null, //the list of directories containing native libraries, delimited by File.pathSeparator; may be null
				getClassLoader());
		
		try {
			Class<?> testClass = classLoader.loadClass("com.example.dynamicapk.MainActivity");
			Method testMethod = testClass.getMethod("testMethod", String.class);
			testMethod.setAccessible(true);
			String str = (String) testMethod.invoke(testClass.newInstance(), "hello world");
			//Toast.makeText(MainActivity.this, str, Toast.LENGTH_LONG).show();
		} catch (Exception e) {
			e.printStackTrace();
		}


DexClassLoader的构造方法中,第一个参数是apk或jar文件的路径(多个文件以:分隔)第二个参数是优化之后的dex文件保存的目录(Android 4.1以上只能是/data/data/包名下的文件夹)第三个参数是用到的.so文件的路径。之后直接用ClassLoader获取Class,然后调用动态加载的类中的方法就可以了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值