如何构建 APK 和应用程序动态加载的单独库

2024-05-31

简短的总结是:如何构建 APK 和单独的库(我指的是某种形式的类集(理想情况下也是资源),例如 JAR、AAR 或 DEX 文件),但不将这些库包含在应用程序;相反,应用程序在运行时加载它们?

Detail

所以我的主要问题是如何构建这样的应用程序(例如 Gradle 配置)。如何指定哪些类进入哪些 JAR 或 DEX 文件?我是否要为我想要最终得到的每个 DEX 文件创建一个 Android Studio 模块?

一个密切相关的问题是 Java 代码应该如何加载外部库并在运行时访问它们的类。对于后者,我希望所显示的方法通过类加载器从 dex 文件访问应用程序的类 https://stackoverflow.com/questions/20068040/accessing-to-classes-of-app-from-dex-file-by-classloader/20068461会工作。

我已经尝试过以下说明https://developer.android.com/studio/projects/android-library.html https://developer.android.com/studio/projects/android-library.html,但这会构建一个 APKdoes包括依赖库。

我也尝试过 Multidex (https://developer.android.com/studio/build/multidex.html https://developer.android.com/studio/build/multidex.html),但这似乎并没有让开发人员能够控制哪些类进入哪个 DEX 文件,而且,将它们全部打包到一个 APK 中。 AFAICT 无法在运行时控制这些 DEX 文件的加载。

背景

有一种可能性是“X-Y问题 http://mywiki.wooledge.org/XyProblem” 说到这里,我最好先解释一下背景。

我正在为客户构建一个应用程序。它不会通过应用程序商店分发,因此无法访问正常的更新机制。相反,客户端希望应用程序能够通过下载自身的新组件来替换旧组件来更新自身,而不需要手动旁加载新的 APK。这里的主要动机是更新必须对非技术用户来说很容易。如果应用程序可以控制更新过程,则可以使其顺利并引导用户。

此外,该应用程序将在互联网接入稀缺且昂贵的地区使用,因此客户希望能够以较小的块(例如 2MB)发布应用程序更新,而不是强迫用户重新下载整个应用程序以接收更新。小更新。

我应该提到的要求的一个方面(以防万一)是运行时加载的库应该位于 microSD 卡上。这也有助于在没有互联网访问的情况下分发更新。

该应用程序的当前状态是大约已编写 50%:也就是说,已经发布了几个早期版本,但该应用程序现在需要修改(重组)以满足上述要求以及其他要求。


本教程是外部加载 DEX 文件的良好开端。 只有三个小源文件(MainActivity.java、LibraryInterface.java、LibraryProvider.java),它将 secondary_dex.jar 从资产文件夹复制到内部应用程序存储 [outdex/dex](教程中也尽可能说明了互联网) )。 你必须用它来构建它ant http://ant.apache.org/bindownload.cgi,因为它使用自定义构建步骤。 我试过了,效果很好。值得一看。
Dalvik 和 ART 中的自定义类加载 http://android-developers.blogspot.co.uk/2011/07/custom-class-loading-in-dalvik.html


UPDATE此代码已移植到 Android Studio gradle(不需要 ant)。https://github.com/timrae/custom-class-loader https://github.com/timrae/custom-class-loader
测试正常。副本com.example.toastlib.jar来自SDcard into 内部应用程序存储[outdex/dex],(不是资产文件夹)。 (您必须阅读自述文件.md文件中的项目来构建它)。

问:如何添加活动,我无法将其添加到清单中?
答:使用 片段,它们不需要清单中的条目。

问:一个包含资源的 Jar,旨在将其添加到现有资源中 项目需要能够将其资源与项目的资源合并 自己的资源(R.)。
答:黑客可用,数据文件......
将 Android 资源文件打包到可分发的 Jar 文件中 https://stackoverflow.com/questions/1995004/packaging-android-resource-files-within-a-distributable-jar-file

问:外部文件权限错误。
答: 导入吧。

问:我需要添加使用权限。
答:使用 API23,您可以以编程方式添加使用权限(但它们仍然需要declared在清单中,所以新的权限模型 https://developer.android.com/training/permissions/index.html对我们来说可能没有多大用处)。

本部分适用于更一般的用户(@LarsH 对更新有更具体的要求),上面的示例是 17kb apk 和 1 kb jar。您可以将大部分代码放入一次性 jar 中,更新只需加载一个新的 Apk(然后导入批量代码 jar,以最大程度地减少数据传输)。 当 Apk 变得太大时,从一个小 Apk 重新开始,并将所有内容迁移到另一个 jar(导入 2 个 jar)。你需要平衡编码工作、用户体验、可维护性、可支持性、带宽、android 规则、游戏商店规则(如果这些词存在的话;O))。

注意 Dalvik 已停产 https://en.wikipedia.org/wiki/Dalvik_(software)#cite_note-1

Dalvik 的后继者是 Android Runtime (ART),它使用相同的字节码和 .dex 文件(但不是 .odex 文件),其继承目标是对最终用户透明的性能改进。新的运行环境首次作为技术预览包含在Android 4.4“KitKat”中,并在后续版本中完全取代了Dalvik; Android 5.0“Lollipop”是第一个版本,其中 ART 是唯一包含的运行时。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何构建 APK 和应用程序动态加载的单独库 的相关文章

随机推荐

  • Akka中有轻量级的actor吗?

    我的用例非常简单 在两个对象之间交换少量 现在我正在从 Scala Actors 迁移到 Akka 但是我再也找不到那些轻量级 Actors 使用Akka 我不仅需要为Actor创建创建ActorSystem Props 还需要照顾Acto
  • 带有嵌入 Flash 视频的 PDF 示例?

    有谁知道我在哪里可以查看嵌入 Flash 视频的 PDF 示例 我知道问这个问题很愚蠢 因为你会认为任何面向技术的用户都应该能够使用谷歌找到一个 但我真的找不到 我的另一个问题是 使用 C 中的 API 将 Flash 视频嵌入 PDF 文
  • Rust 期货中的“then”、“and_then”和“or_else”有什么区别?

    我正在学习使用 Rust future 我发现它非常令人困惑 我觉得我很蠢 但什么时候才能then and then and or else使用 预期返回什么类型 请提供一些您希望看到的不同情况的示例 TL DR then当你想做某事而不管
  • 将所有气流连接导出到新环境

    我正在尝试将所有现有的气流连接迁移到新的气流 我正在查看 cli 选项airflow connections help 它提供了列出的选项 但没有提供从 json 格式导出 导入的选项 有没有办法通过 cli airflow ui 跨多个气
  • 在单元格更改时循环遍历一系列单元格,以将序列中的下一个数字显示为单元格的新值

    我了解如何循环范围 For Each cell In Range A1 A5 If condition Then End If Next 我知道 OnChange 事件 Private Sub Worksheet Change ByVal
  • 我应该如何将更改从一个提交转移到另一个提交?

    我在同一个分支上有两个提交 一个接一个 我在第一次提交中添加了对文件 A 的更改 然后对其他文件进行了一些更改 然后进行了另一次提交 现在我希望对文件 A 的更改是在第二次提交而不是第一次提交 最优雅的方式是什么 我知道这是一个老问题 但我
  • python:UnboundLocalError:赋值前引用的局部变量“open”[重复]

    这个问题在这里已经有答案了 def read lines readFileName readfile txt f open readFileName r contents f read and so on read lines 当我运行这个
  • 如何用 jQuery 替换击键?

    我需要能够用 jQuery 替换击键 当按下右箭头时 我希望改为按下 Tab 键 到目前为止我有
  • Phonegap 上基于 Cookie 的身份验证

    我面临基于phonegap cookie的身份验证的问题 在我强制iPhone关闭我的应用程序 双击物理按钮并关闭 后 我丢失了与服务器建立的cookie 我怎样才能避免它 有什么配置吗 或者有替代方法吗 当我第一次运行它时它工作正常 当我
  • MongoDB 嵌套数组查询

    我问这个作为评论another https stackoverflow com questions 5250652 query a nested array in mongodb问题 还发了一个question https groups g
  • 从 php 对 Active Directory/ISA 进行身份验证 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个复杂的问题 而且由于我真的不知道从哪里开始而加剧 在过去的几年里 我开发了许多基于 php Web 的系统 当我构建它们时 我
  • 从网站上抓取数字和详细信息的数据

    我想从网站上抓取联系电话以及快递服务的相应详细信息 我无法从所有快递服务中获取联系电话和其他详细信息 例如姓名地址和评级 我分析的数据位于脚本标签中 请提出修复此问题的建议 import requests import pandas as
  • 有没有一种好方法来计算 ruby​​ 中范围元素的总和

    计算范围总和的好方法是什么 Input 4 10 Output 4 5 6 7 8 9 10 49 您可以使用EnumerableRange 对象上的方法 在本例中使用Enumerable inject 4 10 inject gt 49
  • t /= d 是什么意思? Python 和错误

    t current time b begInnIng value c change In value d duration def easeOutQuad swing function x t b c d alert jQuery easi
  • PHP Netbeans:xdebug 在每个 include() 或 require() 上停止

    我刚刚发现使用 netbeans IDE 中集成的 xdebug 进行 PHP 调试 我认为这很棒 没有它我怎么生活 但有一个问题 如果我在代码深处设置了一个断点 我必须在到达断点之前多次按 继续 F5 因为脚本会在每个 include 和
  • 将项目导入 Eclipse 后出现“必须重写超类方法”错误

    任何时候我必须将我的项目重新导入到 Eclipse 中 如果我重新安装了 Eclipse 或者更改了项目的位置 几乎全部我的重写方法的格式不正确 导致错误 该方法必须重写超类方法 值得注意的是 无论出于何种原因 Android 项目中方法参
  • 是否可以使用“WHERE”子句来选择SQL语句中的所有记录?

    晚上好 我很好奇是否可以在 SQL 语句中创建一个 WHERE 子句来显示所有记录 下面一些解释 随机 SQL 语句 Java JSP示例 正常情况 String SqlStatement SELECT FROM table example
  • 析构函数与成员函数竞赛

    当我在析构函数内时 其他线程是否可能开始执行对象的成员函数 遇到这种情况该如何处理呢 C 没有内在的保护来防止在删除对象后使用它 忘记竞争条件 另一个线程可以在完全删除你的对象后使用你的对象 Either 确保只有一个位置 代码拥有该对象
  • 当键盘出现时滚动布局

    当键盘出现并隐藏工具栏 FrameLayout 时 我的屏幕大小调整到顶部 我只需将聊天项目滚动到顶部并将框架布局保持在顶部 我尝试了谷歌和SO的一些例子 但对我没有任何帮助
  • 如何构建 APK 和应用程序动态加载的单独库

    简短的总结是 如何构建 APK 和单独的库 我指的是某种形式的类集 理想情况下也是资源 例如 JAR AAR 或 DEX 文件 但不将这些库包含在应用程序 相反 应用程序在运行时加载它们 Detail 所以我的主要问题是如何构建这样的应用程