`

Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类

 
阅读更多

前言

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

  关键字:Android动态加载

 

声明

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

    博客园:http://www.cnblogs.com

    农民伯伯: http://over140.cnblogs.com 

    Android中文Wiki:http://wikidroid.sinaapp.com

 

正文

  一、前提

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

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

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

 

    截图: 成功截图:

      

 

  二、准备

    准备调用Android工程:TestB

    ITest

public interface ITest {
    String getMoney();
}

     TestBActivity

复制代码
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";
    }

}
复制代码

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

 

  三、调用 

    调用工程TestA

复制代码
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();
        }
    }
}
复制代码

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

 

  四、下载

    TestA.zip

    TestB.zip    

 

  五、注意

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

      android.permission.WRITE_EXTERNAL_STORAGE

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

 

  六、扩展阅读

    探秘腾讯Android手机游戏平台之不安装游戏APK直接启动法

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

 

    Android中文Wiki:DexFile

 

 

  七、缺点

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

 

  八、推荐

    Android版 程序员专用搜索

 

结束 

  忙着换工作、忙着把翻译组转动Wiki平台、忙着推广翻译组...忙这忙那的,博客已经有近2个月没有写Android方面的文章,终于又可以回来,继续挤时间来写博客,与大家一同探讨与分享。 

分享到:
评论

相关推荐

    Android动态加载(下)——加载已安装APK中的类和资源

    在Android开发中,动态加载是实现插件化和热修复技术的关键部分,它允许应用程序在运行时加载新的功能或更新代码而无需重新安装整个应用。本文将深入探讨如何在已安装的APK中加载类和资源,这在提高用户体验和减少...

    2011.09.21——— android 动态壁纸开发

    完成动态壁纸的开发后,将其打包成APK,用户可以通过安装APK将动态壁纸添加到系统中。在设置界面,用户可以选择已安装的动态壁纸作为当前桌面背景。 六、进一步学习 开发动态壁纸涉及到OpenGL ES、动画框架、多...

    C#开发Android应用实战——使用Mono for Android和.NETC#.rar

    在本资源包中,我们探讨的是使用C#语言和Mono for Android框架开发Android应用程序的方法。 Mono for Android是Xamarin公司(现已被微软收购)推出的一个工具,它允许开发者利用.NET Framework和C#来构建原生的...

    安卓Android源码——更换软件主题(apk方式).rar

    综上所述,"安卓Android源码——更换软件主题(apk方式).rar"这个压缩包很可能是提供了一个实际的项目实例,用于教学如何在Android应用中实现主题更换。通过对源码的分析和学习,开发者可以掌握这一功能的实现原理...

    Android课程设计——背单词软件

    【Android课程设计——背单词软件】是一个典型的移动应用开发项目,展示了如何利用Android Studio这一强大的集成开发环境(IDE)来创建一个实用的教育类应用程序。这个项目的核心目标是帮助用户学习和记忆单词,可能...

    Android源码——实现皮肤打包成apk的demo.zip

    4. **安装和加载皮肤**:在主应用中,你需要提供一个接口或者服务,用于安装和加载皮肤APK。这通常涉及到动态加载资源、替换应用程序的资源引用、重新设置主题等操作。关键在于正确处理资源的替换逻辑,避免因资源...

    Android应用开发新路线【技术文档】(用HTML5开发Android应用)

    【Android应用开发新路线——用HTML5开发Android应用】 在当今快速发展的移动应用领域,开发者们正在寻找更高效、更具跨平台能力的开发方式。HTML5作为一种强大的网页开发语言,正逐渐被引入到Android应用开发中,...

    安卓Android源码——实现皮肤打包成apk的demo.zip

    通过动态加载APK中的资源,应用可以在不重启的情况下实现界面皮肤的实时切换,提供更好的用户体验。 总结起来,这个源码demo涵盖了Android应用皮肤打包的核心技术,包括APK结构的理解、资源管理、构建流程的掌握...

    安卓Android源码——douBanList(滚动到底部加载新的,软缓存,懒加载).zip

    这个压缩包文件“安卓Android源码——douBanList(滚动到底部加载新的,软缓存,懒加载).zip”包含的是一个Android应用的源代码,主要关注的是列表滚动到末尾时自动加载更多数据的功能,以及软缓存和懒加载技术的...

    面向动态加载的Android恶意行为动静态检测方法.pdf

    【摘要】中提到的面向动态加载的Android恶意行为动静态检测方法,主要针对的是Android平台上的一种新型执行体分类的运行时加载机制——动态加载。动态加载允许程序在运行时加载和执行新的代码,增强了应用程序的灵活...

    安卓Android源码——更换软件主题(apk方式).zip

    本教程将通过一个名为“安卓Android源码——更换软件主题(apk方式)”的示例项目,深入讲解如何在Android应用中实现主题更换。 首先,我们来理解主题的概念。在Android中,主题是通过样式(Style)和主题资源...

    安卓Android源码——douBanList(滚动到底部加载新的,软缓存,懒加载).7z

    这个压缩包文件"安卓Android源码——douBanList(滚动到底部加载新的,软缓存,懒加载).7z"显然包含了开发一个特定安卓应用的源代码,特别是涉及到豆瓣(douban)列表的展示,具备下拉刷新和上拉加载更多功能,以及...

    安卓开发框架工具类相关-Android快速开发系列10个常用工具类.rar

    【标题】"安卓开发框架工具类相关-Android快速开发系列10个常用工具类.rar" 涉及的是Android应用程序开发中的一个关键方面——工具类的集合。在Android开发中,工具类通常包含一系列静态方法,用于执行常见的、重复...

    安卓Android源码——FBReader修改epub快速加载.zip

    这个压缩包文件"安卓Android源码——FBReader修改epub快速加载.zip"显然包含了FBReader源代码的修改版,专门针对EPUB格式电子书的快速加载进行了优化。下面我们将深入探讨这个主题,了解相关知识点。 1. **EPUB格式...

    安卓Android源码——几行代码实现动态图片.rar

    在安卓(Android)平台上开发应用时,经常需要处理各种图像展示,包括静态图片和动态图片。动态图片通常指的是GIF格式的图片,它能够显示连续的画面,形成动画效果。本资源"安卓Android源码——几行代码实现动态图片...

    Android源码——笑话故事android应用源码.zip

    在深入解析这个"Android源码——笑话故事android应用源码.zip"之前,我们需要了解Android应用的基本结构和开发流程。Android应用主要由Java或Kotlin语言编写,通常包括Activity、Service、BroadcastReceiver、...

    安卓Android源码——几行代码实现动态图片.zip

    本资源包"安卓Android源码——几行代码实现动态图片.zip"提供了简单易懂的示例,帮助开发者快速理解如何在Android应用中实现动态图片的展示。下面将详细解析这个主题,以及涉及到的关键技术点。 首先,动态图片在...

Global site tag (gtag.js) - Google Analytics