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

时间:2016-08-26 21:58:43

标签: android android-gradle mobile-application dynamic-class-loaders

简短摘要是:我如何构建一个APK和单独的库(我指的是某些形式的类集合(理想情况下也是资源),例如JAR,AAR或DEX文件),但不包括那些APK中的图书馆;相反,应用程序在运行时加载它们?

详细

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

一个密切相关的问题是Java代码应该如何加载外部库并在运行时访问它们的类。对于后者,我希望accessing to classes of app from dex file by classloader所示的方法能够奏效。

我已尝试https://developer.android.com/studio/projects/android-library.html处的说明,但构建了 包含依赖库的APK。

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

背景

" X-Y problem"在这里,所以我更好地解释了背景。

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

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

我要提到的要求的一个方面,如果重要的是,在运行时加载的库应该存在于microSD卡上。这也有助于在没有互联网访问的情况下分发更新。

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

2 个答案:

答案 0 :(得分:6)

本教程是外部加载DEX文件的良好开端。 只有三个小文件源(MainActivity.java,LibraryInterface.java,LibraryProvider.java),它将secondary_dex.jar从assets文件夹复制到内部应用程序存储[outdex / dex](互联网也在教程中说明了) )。 您必须使用ant构建它,因为它使用自定义构建步骤。 我试过了,它工作正常。值得一看。
custom class loading in Dalvik and ART


更新 此代码已移植到Android Studio gradle(不需要ant)。 https://github.com/timrae/custom-class-loader
经过测试确定。将 com.example.toastlib.jar SD卡复制到内部应用程序存储 [outdex / dex],(不是资源文件夹)。 (您必须阅读项目中的 README.md 文件才能构建它。)

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

     

问:具有要添加到现有资源的资源的Jar   项目需要能够将其资源与项目合并   自己的资源(R.)。
答:黑客可用,数据文件......
Packaging Android resource files within a distributable Jar file

     

问:外部文件的权限错误。
答:进口。

     

问:我需要添加uses-permission。
答:使用API​​23,您可以通过编程方式添加使用权限(但它们仍然需要在清单中声明,因此new permissions model可能对我们没什么用处)。

本节适用于更多普通用户(@LarsH对更新有更多具体要求),上面的例子是17kb apk和1 kb jar。您可以将大部分代码放在一次性jar中,更新只需加载新的Apk(然后导入批量代码jar,以最大限度地减少数据传输)。 当Apk变得太大时,再次使用一个小Apk并且所有东西都迁移到另一个jar(导入2个jar)。您需要平衡编码工作量,用户体验,可维护性,可支持性,带宽,Android规则,播放商店规则(如果这些词甚至存在; O))。

NOTE Dalvik is discontinued

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

答案 1 :(得分:1)

您可以尝试使用相同的sharedUserId和相同的process来构建多个apk。

这是Threema

使用的插件机制

编辑:有关Theema的更多信息

Threema有一个主应用程序和两个插件:

这样做主应用程序不需要访问摄像头或麦克风的权限