【问题标题】:Porting java server to Android将 java 服务器移植到 Android
【发布时间】:2011-09-06 00:50:08
【问题描述】:

我正在开发一个使用 OpenMRS 作为 Android 后端的医疗记录系统。 OpenMRS 依赖于一些重量级的库,包括 Hibernate 和 Spring。

“Dexing”整个 OpenMRS 应用程序会生成一个即使对于 Android classes.dex 文件格式来说也太大的文件(这个大小限制已经有据可查)。为了解决这个问题,我目前正在从依赖项创建多个 dex 文件,并在运行时使用 Android 的 dex 类加载器加载它们。

由于实际使用服务器的移动版本的方式,尽管存在巨大的依赖关系,但实际处理需求将非常低。我不想在我的手机上运行企业服务器。

在我花费数周的时间尝试设计这个之前,我只是想问问开发者社区:这个策略只是一个白日梦吗?如果我加载所有这些库,整个二进制文件会被加载到 RAM 中并破坏系统吗?有没有优化这样一个应用程序的好方法?我在这里遗漏了一些明显的问题或解决方案吗?

【问题讨论】:

  • 乍一看,我会说在 Android 上运行 Hibernate 和 Spring 的梦想是不现实的。为所有这些依赖项拥有足够 RAM 的简单问题会让你陷入困境。
  • 你见过android-developers.blogspot.com/2011/07/… 吗?这里的难点似乎是各种 dex 文件不能在没有额外代码或预处理的情况下相互调用。 (假设有足够的内存来做你需要的事情。)
  • 这绝对需要“客户端/服务器”。此应用程序的一个重要问题是确保隐私(HPIAA 法规等)
  • 我没看过安卓开发者的帖子,非常有帮助! RAM 似乎是每个人心中的限制......加载一个类实际上会将整个文件加载到 RAM 中吗?据我了解,桌面虚拟机仅加载引用并引用代码的存储。我想我可以将类库要求减少到大约 50MB,我可以在具有 256MB RAM 的平板电脑上运行它吗?

标签: java android hibernate medical dex


【解决方案1】:

简短的回答是:不要。

答案很长,大多数设备仍然只为每个堆分配相对少量的内存(40-128 兆 RAM 之间)。您真的真的需要考虑构建应用程序,以便大部分逻辑以及库和重量级代码仍然驻留在服务器上,而移动应用程序只是从服务器读取轻量级数据(JSON?)进行显示。设备实际上应该只使用诸如位置数据之类的本机项目,并为用户提供与 Android 世界其他部分一致的界面。除此之外,您应该寻找方法尽可能多地将逻辑排除在本机应用程序之外。如果没有其他原因,只是为了让它更安全。逆向工程 Android 应用程序微不足道,您在服务器端保留的越多,您就越安全。

【讨论】:

  • 谢谢马特,我在跟进 cmets 后得出了类似的结论。看起来我将不得不对原始来源进行比我想象的更多的重新编码。在我自己的电脑上实际记录了它所占用的 RAM,我意识到任何小于 1GB 的东西都行不通!但不幸的是,我们的目标是最终让整个服务器在平板电脑上运行,因为我们将其发送到无法访问互联网的贫困地区。我想这需要一些真正的工程。叹息。