Android 动态加载其他APK中API的方法

  

    类似于exe可以动态加载dll一样,Android中也存在动态加载的机制,通过反射机制可以动态加载另一个dex中的方法以及属性。这些方法和属性包括pulic或者private的方法。

 
    思路大致为:首先制作一个apk,里面存在一个private的方法getMoney(),然后通过DexClassLoader方法动态加载另一个apk中的类,在反射类中获取getMoney方法。
   
    具体的方法如下(代码可以参考: http://www.cnblogs.com/over140/archive/2012/03/29/2423116.html
    (1)编写被测apk,其源码如下:
package com.example.testb;

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

public class MainActivity extends Activity {

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

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if itis present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private StringgetMoney(){
return "2";
}

}
    (2)编写测试apk,其源码如下:
public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String path = "/data/";
String filename = "TestB.apk";
Context context =getApplicationContext();//获取Context对象;
     File dexOutputDir =context.getDir("dex", 0);
     //加入以上代码是因为指定路径无法readable或者writable
        System.out.println("path is:" + (path +filename));
DexClassLoader classLoader = new DexClassLoader(path +filename, dexOutputDir.getAbsolutePath(),  null,getClassLoader());
try {
Class mLoadClass =classLoader.loadClass("com.example.testb.MainActivity");
Constructor constructor = mLoadClass.getConstructor(newClass[]{});
Object TestBActivity = constructor.newInstance(newObject[]{});
Method getMoney = mLoadClass. getDeclaredMethod(" getMoney", null);
getMoney.setAccessible(true);
Object money = getMoney.invoke(TestBActivity, null);
Toast.makeText(this, money.toString(),Toast.LENGTH_LONG).show();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetExceptio n e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if itis present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}
关于动态调用私有类的方法见链接: http://www.cnblogs.com/penghongwei/p/3300084.html


注明:此为转载帖
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值