android 动态库 apk里面,Android动态加载——加载未安装APK中的类

前言

近期做换肤功能,由于换肤程度较高,受限于平台本身,实现起来较复杂,暂时搁置了该功能,但也积累了一些经验,将分两篇文章来写这部分的内容,欢迎交流!

关键字:Android动态加载

声明

欢迎转载,但请保留文章原始出处:)

博客园:外链网址已屏蔽

农民伯伯: 外链网址已屏蔽;

Android中文Wiki:外链网址已屏蔽

正文

一、前提

目的:动态加载SD卡中Apk的类。

注意:被加载的APK是未安装的。

相关:本文是本博另外一篇文章:Android动态加载jar/dex的升级版。

截图: 成功截图:

A151826234-99960.jpg_small.jpg

二、准备

准备被调用Android工程:TestB

ITest

public interface ITest {

String getMoney();

}

TestBActivity

A151828328-99961.gif

public class TestBActivity extends Activity implements ITest {

/**Called when the activity is first created.*/

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}

@Override

public String getMoney() {

return "1";

}

}

A151828328-99961.gif

代码说明:很简单的代码。将生成后的TestB.apk拷贝到SD卡的根目录下。

三、调用

调用工程TestA

A151828328-99961.gif

public class TestAActivity extends Activity {

/**Called when the activity is first created.*/

@Override

public 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("com.nmbb.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();

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (SecurityException e) {

e.printStackTrace();

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

}

}

A151828328-99961.gif

执行的时候可以发现会自动生成TestB.dex文件。动态加载方面还可以搜索一下"Java动态加载"方面的资料,很有参考价值。可以发现比Android动态加载jar/dex使用起来方便得多。

四、下载

五、注意

6.1  别忘了加上SDCARD的写权限:

android.permission.WRITE_EXTERNAL_STORAGE

6.2  同样注意,不要再两个工程包含package和名称相同的接口,否则报错。(参见Android动态加载jar/dex的后期维护)

六、扩展阅读

(强烈推荐:QQ游戏动态调用Activity的方法:通过ClassLoader,loadClass Activity类,然后分别在主工程的onDestroy、onKeyDown、onPause、onRestart、onResume等生命周期方法中反射调用(Method、invoke)子工程的类方法来模拟实现整个生命周期。此外巧妙的通过解压缩APK文件来获取游戏的资源)

Android中文Wiki:DexFile

七、缺点

6.1  由于是使用反射,无法取得Context,也就是TestBActivity与普通的类毫无区别,没有生命周期。

八、推荐

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值