【问题标题】:Blackberry 7 - releasing SDK to multiple apps causes issuesBlackberry 7 - 向多个应用程序发布 SDK 会导致问题
【发布时间】:2014-10-05 15:50:36
【问题描述】:

以下问题已单独讨论,但我找不到可行的解决方案。因此发布了完整的故事和问题列表。
我们正在构建一个供多个应用程序使用的 SDK(midlet jar)。此 SDK 使用持久存储来存储某些数据。现在有几个问题困扰着我们:
1. SDK中已经硬编码了进入商店的密钥。现在,多个应用程序尝试使用相同的键值访问商店,从而导致冲突问题。
2. Persistable 对象包/类名在多个应用中是相同的。因此,我们在启动应用程序时收到“Class Multiply defined”错误。

现在对于 2,我们一直在考虑以下选项,但似乎都没有解决问题:
1. 不要扩展Vector等标准对象,使用标准对象。
问题:数据回收丢失导致冲突。
2. 为使用它的每个应用程序构建具有唯一名称的库。
问题:这意味着我们必须为每个想要使用它的客户发布不同的 SDK。
3.在为下一个应用加载包之前检查Persistable对象类是否已经存在。
问题:当第一个包未安装时会发生什么?类类型会被删除吗?
4. 让应用实现 Persistable 接口,并在回调中传递 key。
仅仅因为我们无法使用持久存储就要求应用程序传递一些值听起来是不对的。

所以到目前为止,使用 Persistable 对象的 SDK 似乎完全被破坏了。还是我们错过了什么?
也非常欢迎任何其他替代建议来完成这项任务。

【问题讨论】:

    标签: blackberry sdk conflict persistent-storage multiple-definition-error


    【解决方案1】:

    在整个设备上只能有一个具有给定类名的持久类。如果两个应用程序具有相同的可持久类,您将收到 Class Multiply Defined 验证错误,并且根本不会安装第二个应用程序。

    唯一的方法是使用内置的可持久类在 SDK 中存储可持久数据。但是,即使包含 SDK 的所有应用程序都已被用户删除,这些可持久数据也不会被删除。您还必须注意数据的版本以向后兼容。

    您使用内置类(如 Hashtable、IntHashtable 或 Vector)来存储数据。然后你编写一个包装类来获取和设置这些信息。基本上,您会将可持久类映射到 Hashtable 或 Vector。

    再次记住,您永远不应该将任何非内置类放入此数据存储区。否则,数据存储区将在应用卸载时被删除。

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      如果有可以在不同应用程序之间共享功能的库,则将其制作为库 cod 文件,并在编译依赖项目时将此 cod 文件指定为库。

      例如,如果库名称是mylib_version1_00.cod,那么您的其他项目在编译后可能包含以下文件:

      对于项目1:

      • project1.cod
      • mylib_version1_00.cod

      对于项目2:

      • project2.cod
      • mylib_version1_00.cod

      ......

      对于ProjectN:

      • projectN.cod
      • mylib_version1_00.cod

      在安装每个项目时你会安装mylib.cod文件,如果已经安装了mylib.cod文件,它将被覆盖,它会避免“类xxx多次定义”。

      出现此错误是因为所有应用程序都在一个 JVM 实例下运行。因此,如果您要向设备上传一个名称为已存在的 cod 文件,它将被重写。

      如果您将发布库的下一个版本,请将 cod 文件命名为

      mylib_version2_00.cod

      并在包名中使用版本号,例如:

      com.yourcompany.yourpoduct.yourlibary.version1

      com.yourcompany.yourpoduct.yourlibary.version2

      在这种情况下,您可以在同一设备上拥有 cod 文件:mylib_version1_00.cod 和 mylib_version2_00.cod,并且不会产生“class xxx multiply defined”错误。

      现在关于持久性。不要在您的库中硬编码持久性密钥。创建一个抽象类并声明一个抽象方法,如:

      public long getPersistenceKey();

      返回一个对象的唯一持久键。并在将信息保存在抽象类中的代码中使用此方法调用。

      在您的自定义应用程序中使用的子类中,只需为每个产品使用不同的值覆盖此方法。也不会再有冲突了。

      希望这会有所帮助。

      【讨论】:

      • 嗨拉斐尔,感谢您的回复。然而,我能找到的唯一记录在案的添加库依赖项的解决方案是“添加一个 midlet jar 作为依赖库”。任何关于使用 cod 文件作为依赖库的文档的指针?
      • 在项目(假设是project B)设置中,您可以指定该项目是库项目。然后在另一个项目中,比如说project A,你指定它是“应用程序”(不是库),你可以设置它依赖于project B。编译完成后,您需要将project A 和project B 的代码文件安装到设备上。
      • 嗨 Rafael,很抱歉不清楚,但 SDK 必须提供给外部各方,我无法与他们共享项目(实际代码)。是否可以在没有实际项目的情况下仅针对 .cod 文件开发应用程序?
      • @Lokesh 您可以将 jar 文件转换(使用 rapc.exe 编译)为 cod 文件。检查此链接:stackoverflow.com/questions/3094043/… 并注意可以在此处找到 bb ant 工具:bb-ant-tools.sourceforge.net
      猜你喜欢
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      相关资源
      最近更新 更多