`
iaiai
  • 浏览: 2204185 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

dynamic-load-apk-Apk动态加载框架使用初体验

 
阅读更多
因为想要将本网站上的开源代码直接做成一个能显示效果的app,决定摸索下android的插件开发,发现只有两个开源的插件系统可选:

AndroidDynamicLoader

dynamic-load-apk

因为第一个只允许在fragment的基础上开发插件,第二个没有此限制并且是国人开发,文档比较齐全,所以选择了第二个。



下载dynamic-load-apk

dynamic-load-apk 简称DL框架,从github上下载DL,如下:

lib是Library,sample是例子程序,打开sample如下:

根据官方的解释,有三种模式,其中main目录下才是其推荐的独立插件模式,所以直接不管depend_on_interface这个文件夹了。

其中main-host是宿主,他需要引用DL的Library才能运行,main-plugin-a,以及main-plugin-b是插件。



运行sample中的宿主和插件

我将main直接import到eclispe中,并且将DL的Library也导入,将main-host添加Library依赖,运行main-host程序,当然了 显示的是没有插件,因为main-host程序需要在sdcard的根目录下建立DynamicLoadHost目录,然后DynamicLoadHost目录中放入插件的apk。这主要是因为main-host程序的代码是这样写的:
private void initData() {
    String pluginFolder = Environment.getExternalStorageDirectory() + "/DynamicLoadHost";
    File file = new File(pluginFolder);
    File[] plugins = file.listFiles();
    if (plugins == null || plugins.length == 0) {
        mNoPluginTextView.setVisibility(View.VISIBLE);
        return;
    }
    for (File plugin : plugins) {
        PluginItem item = new PluginItem();
        item.pluginPath = plugin.getAbsolutePath();
        item.packageInfo = DLUtils.getPackageInfo(this, item.pluginPath);
        if (item.packageInfo.activities != null && item.packageInfo.activities.length > 0) {
            item.launcherActivityName = item.packageInfo.activities[0].name;
        }
        mPluginItems.add(item);
        DLPluginManager.getInstance(this).loadApk(item.pluginPath);
    }
    mListView.setAdapter(mPluginAdapter);
    mListView.setOnItemClickListener(this);
    mPluginAdapter.notifyDataSetChanged();
}

pluginFolder指定为DynamicLoadHost。

当然你自己写的宿主程序完全可以指定为其他目录,甚至直接来源于网上(只是猜想),如果不支持直接加载远程的apk,我们可以先从网上下载下来,放到我们程序指定的一个目录。

接着我们再运行main-plugin-a,产生一个apk放到刚刚在sdcard建立的DynamicLoadHost目录。

然后再次打开宿主程序,点击这个插件,和预期是一致的,插件就像一个apk一样执行了。



尝试自己的apk

虽然官方文档已经说明插件apk需要满足一些要求(context不能用this,jar不能打包在apk中(主要是DL的jar以及surport的jar)等),但是我还是忍不住要尝试一下直接把我的apk放进sdcard的DynamicLoadHost目录,运行宿主程序,列表中能看到我的apk程序,点击,没反应。。。。。。。。。

虽然在意料之中,但是小心脏还是小小的失落。

先说下我运行的这个程序叫GossipView,在github上可以下载,因为GossipView非常简单且具有代表性,没有依赖其他库(GossipView是直接在demo中一起的),有activity,有一个自定义的GossipView。对于我准备开发的东西来说,如果这个东西都不能运行,那就没什么意义了。

我开始改造我的GossipView,让他可以作为插件了:增加了external-jars 将DL的jar放进去,并且将surport的jar也放进去,同时在.classpath中追加如下两句:

<classpathentry kind="lib" path="external-jars/dl-lib.jar"/>
<classpathentry kind="lib" path="external-jars/android-support-v4.jar"/>

这样,编译的时候就能够正常进行,但是打包的时候,就不会把上面两个jar包打入到插件apk中。



接下来不是要改this为that吗,改呗,我发现我的activity中只有一处用了this,替换成that,运行。得到了一个apk,但是很奇怪的是我的插件居然能直接运行,不是说那样做两个jar不会被打包进去吗怎么还能运行了呢。。。。

管他的哦,先将这次的apk放进去再说。

运行宿主,点开我的插件,报错了:

看来还真的是包多了,也就是说我的插件apk中其实把DL和surport的jar打包进去了。



我找啊找啊找,发现是自己粗心了,我在插件项目中添加了两次DL,一次是用jar,一次是直接添加了Library的依赖。fuck。

好吧改过来之后,完全可以了,只是原本我应用的白色背景变成了黑色背景。
  • 大小: 8.1 KB
  • 大小: 12.1 KB
  • 大小: 9.2 KB
  • 大小: 29 KB
  • 大小: 742.1 KB
分享到:
评论

相关推荐

    安卓插件机制相关-dynamic-load-apkApk动态加载框架.rar

    动态加载APK(Apk Dynamic Load)就是这种技术的一种实现,它允许主应用程序在运行时加载外部的APK文件,从而扩展其功能。下面我们将深入探讨这一技术及其相关的知识点。 首先,我们来理解一下“插件机制”。在...

    dynamic-load-apk(android模块化,热更新,插件化)

    常见的插件化框架如ApkPatch、Dexposed、DynamicLoad等,通过修改或扩展Android系统的ClassLoader来实现对插件的加载。插件化不仅实现了模块间的解耦,也使得应用能够根据需求动态扩展功能,如添加新的服务、活动或...

    dynamic-load-apk:动态加载 apk

    #动态加载 Apk 框架##动态加载apk框架可以加载本地apk文件,启动目标apk活动,使用资源和资产##Thanks for ##base of this: ##I add apk md5 check(如果运行时更改apk文件,即使是相同的类文件也会导致...

    Android代码-dynamic-load-apk

    DL : Apk动态加载框架 开发文档 (Development Help) English README [使用Android Stuido导入项目](Android Studio.md) APK动态加载框架(DL)解析 DL 2.0的新特性 支持多进程模式,插件可以运行在单独的DL进程中...

    Android项目源码把其他安卓例子作为插件加载展示的项目.zip

    插件的实现得益于 dynamic-load-apk-Apk动态加载框架,目前本项目已经不再更新,在功能方面类似于本站的例子大全部分,对所有的小例子进行分类展示,只不过提供一个动态的加载预览功能。本站的小例子虽然不提供动态...

    java类加载修改源码-android-dynamic-load-awesome:android-dynamic-load-awesome

    动态加载卸载的 APK(也称为插件) android上的插件框架,无需安装、修改或重新打包即可运行任何第三方apk 提供英文和中文文档,由@Qihoo360 提供支持。 更少的代码侵入,但遗憾的是,它是一个 Eclipse 风格的项目。...

    Android动态加载未安装apk, jar

    在Android开发中,动态加载未安装的apk或jar包是一项重要的技术,它允许应用程序在运行时根据需要加载和执行新的功能..."dynamic-load-apk-master"这个压缩包可能包含了实现这种技术的源码示例,是学习和研究的好材料。

    Android项目源码把其他安卓例子作为插件加载展示的项目

    插件的实现得益于 dynamic-load-apk-Apk动态加载框架,插件源码在例子大全(http://www./demo)有收录,目录例子大全\系统相关\插件机制。(目前本项目已经不再更新,在功能方面类似于本站的例子大全部分,对所有的小...

    Android代码-副作用小的在线热更新View库,可将View作为一个独立模块进行更新抽换

    Dynamic-load-view can load View in external apk. you can use it to hotfix View or update module in your App. ScreenShot download Demo APK PicUrl Future The plugin is independent to host App totaly....

    Android_Apk_Dex_dynamic_load_sourcecode.zip

    在动态加载Apk时,可以模拟安装流程,生成`PackageInfo`,然后使用`DexClassLoader`加载Apk内的Dex。 3. 注册与卸载:动态加载的Apk需要在运行时注册到系统,以便能够执行其组件。这通常通过反射调用`...

    Android-针对DynamicLoadApk做的一些上层工作

    "Android-针对DynamicLoadApk做的一些上层工作"的标题表明,我们将探讨一个基于开源项目Dynamic-load-apk的上层封装框架,该框架增加了新的功能,如将插件动态加载到`libs`目录以及对模块Service的注入。 首先,让...

    一个强大的插件化框架

    源码Direct-load-apk,Direct - load - apk 是一个强大的插件化框架, 通过使用它, 你可以实现看似不可能实现的功能 ----- 直接加载一个普通apk! 优势: Direct - load - apk 能够加载插件的全部 资源. 支持 插件间 ...

    动态加载apk或者jar或者dex.docx

    ### 动态加载APK或JAR或DEX详解 #### 前言 在移动应用开发领域,用户体验一直是开发者关注的核心。随着技术的发展,Native App 和 Web App 在用户体验上各有千秋,但频繁的版本更新成为了 Native App 面临的一大...

    ClassLoader动态加载dex

    在提供的文件列表中,`Dynamic`和`ForceApkObj`可能分别代表动态加载相关的源代码文件和类对象。在`ForceApkObj`中,可能包含了一个强制加载APK中特定类的对象,这在处理插件化或模块化时非常有用。通过分析这些源...

    Android 插件加载

    从https://github.com/singwhatiwanna/dynamic-load-apk上面下载的Lib,自己动手新建了几个工程做的,免安装apk的加载,对开发过程中的一些问题做了一些使用说明,方便自己日后使用

    CodeBox:开源项目演示演示-Box source code

    插件的实现得益于dynamic-load-apk-Apk动态加载框架 。目前已经完成的插件非常少,还需要大量的编译插件的工作。希望能有更多的朋友参与进来。 插件 如果您该项目顾问,可以加入到我们的插件开发中,将您根据dl框架...

    插件化预习资料12345.pdf

    目前,Android社区提供了多种插件化框架,如DynamicAPK、dynamic-load-apk、SmallDroid、Plugin、RePlugin和VirtualAPK。这些框架各有特点,选择时需根据实际需求考虑。例如,如果插件与宿主无耦合且无需通信,...

    Android插件化开发之Atlas初体验

    在Android应用开发中,插件化技术是一种将应用程序的部分功能以插件的形式动态加载到主程序中,使得应用能够实现...在实际工作中,结合其他优秀开源项目如Dexposed、DynamicLoad等,可以构建出更完善的插件化解决方案。

Global site tag (gtag.js) - Google Analytics