Lar*_*rsH 31 android dynamic-class-loaders mobile-application android-gradle-plugin
简短的总结是:我如何构建一个APK和单独的库(我指的是某些形式的类集合(理想情况下也是资源),例如JAR,AAR或DEX文件),但不包括那些库中的库. APK; 相反,应用程序在运行时加载它们?
所以我的主要问题是如何构建这样的应用程序(例如Gradle配置).如何指定哪些类进入哪些JAR或DEX文件?我是否为每个想要最终使用的DEX文件创建了一个Android Studio模块?
一个密切相关的问题是Java代码应该如何加载外部库并在运行时访问它们的类.对于后者,我希望通过类加载器从dex文件访问app类时显示的方法可行.
我试着在说明https://developer.android.com/studio/projects/android-library.html,但是这是建立一个APK 不包括依赖库.
我也尝试过Multidex(https://developer.android.com/studio/build/multidex.html),但这似乎并没有让开发人员控制哪些类进入哪个DEX文件,此外,将它们打包成一个APK.AFAICT无法在运行时控制这些DEX文件的加载.
这里有" XY问题 " 的可能性,所以我最好解释一下背景.
我正在为客户构建一个应用程序.它不会通过应用程序商店分发,因此它无法访问正常的更新机制.相反,客户希望应用程序能够通过下载自身的新组件来更新自己,以替换旧组件,而无需手动加载新的APK.这里的主要动机是非技术用户的更新必须容易.如果应用程序可以控制更新过程,它可以使其流畅并引导用户.
此外,该应用程序将用于互联网访问稀缺和昂贵的领域,因此客户希望能够以较小的块(例如2MB)发布应用程序更新,而不是强迫用户重新下载整个应用程序以接收小更新.
如果重要的话,我应该提到的要求的一个方面是,在运行时加载的库应该存在于microSD卡上.这也有助于在没有互联网访问的情况下分发更新.
该应用程序的当前状态是大约50%写入:即,已发布了几个早期版本,但现在需要修改(重组)应用程序以满足上述要求以及其他要求.
本教程是外部加载DEX文件的良好开端.只有三个小文件源(MainActivity.java,LibraryInterface.java,LibraryProvider.java),它将secondary_dex.jar从assets文件夹复制到内部应用程序存储[outdex/dex](互联网也在教程中说明了) ).您必须使用ant构建它,因为它使用自定义构建步骤.我试过了,它工作正常.值得一看.
Dalvik和ART中的自定义类加载
更新
此代码已移植到Android Studio gradle(不需要ant).
https://github.com/timrae/custom-class-loader
测试好了.将SD卡中的com.example.toastlib.jar复制到内部应用程序存储 [outdex/dex],(不是资源文件夹).(您必须阅读项目中的README.md文件才能构建它).
问:如何添加活动,我无法将其添加到清单中?
答:使用片段,它们不需要清单中的条目.问:具有要添加到现有项目的资源的Jar需要能够将其资源与项目自己的资源(R)合并.
答:黑客可用,数据文件......
在可分发的Jar文件中打包Android资源文件问:外部文件的权限错误.
答:导入它.问:我需要添加使用权限.
答:使用API23,您可以以编程方式添加使用权限(但它们仍然需要在清单中声明,因此新的权限模型可能对我们没有多大用处).
本节适用于更多普通用户(@LarsH对更新有更多具体要求),上面的示例是17kb apk和1 kb jar.您可以将大部分代码放在一次性jar中,更新只需加载新的Apk(然后导入批量代码jar,以最大限度地减少数据传输).当Apk变得太大时,再次使用一个小Apk并且所有东西都迁移到另一个jar(导入2个jar).您需要平衡编码工作量,用户体验,可维护性,可支持性,带宽,Android规则,播放商店规则(如果这些词甚至存在; O)).
Dalvik的继任者是Android Runtime(ART),它使用相同的字节码和.dex文件(但不是.odex文件),其目标是为最终用户提供透明的性能改进.新的运行时环境首次作为技术预览安装在Android 4.4"KitKat"中,并在以后的版本中完全取代了Dalvik; Android 5.0"Lollipop"是ART是唯一包含运行时的第一个版本.
| 归档时间: |
|
| 查看次数: |
2946 次 |
| 最近记录: |