为多个移动设备构建单个应用程序

时间:2020-03-05 18:55:39  来源:igfitidea点击:

是否有可能为多个移动设备(在BREW平台上)建立一个应用程序二进制构建,而不是使用带有条件编译的构建脚本为每个设备进行单独构建。

特别是可以将单个BREW应用程序构建用于多个屏幕分辨率吗?

请注意,目标是拥有一个单一的二进制版本。如果仅使用一个代码库,则条件编译和智能构建脚本将可以解决问题。

解决方案

回答

是的,有可能,我们能够在我以前的工作地点做到这一点。所需的是棘手的:

  • 编译为最低公分母BREW版本。 1.1版是目前所有现有手机的基础。
  • 代码必须能够处理多种分辨率。根据我的经验,检测屏幕宽度和高度的方法对于所有手机都是准确的。
  • 我们所有的资源必须在所有设备上加载。这将需要制作自己的自定义图像加载器来解决某些设备问题。对于声音,我知道简单的MIDI类型0可以全部使用,但QCP也可以使用(我自己对此没有经验)。
  • 使用位图字体。字体存在太多设备问题,因此值得使用系统字体。
  • 将代码结构设计为有限状态机。我不能足够强调这一点-做到这一点,许多问题就永远不会实现。
  • 有针对每个单个设备问题的解决方法。这是困难的部分!有可能,但是这个兔子洞深得难以置信...

最后,应用程序越复杂和高级,我们走这种路线的可能性就越小。某些设备属性在运行时根本无法可靠地检测到(例如平台ID),因此需要多次构建。

回答

另一个想法可能是根据屏幕尺寸将手机分为2至4类,并为它们创建组件。这也是一条更快的路线,因为我们将能够以更少的复杂性来支持我们想要支持的所有手机。

另一件事是我们要启动的手机上的BREW版本。如果说BREW 1.1在一台手机上,并且在目标市场中只有一小部分拥有,那么支持它就没有任何意义。

回答

我编写了Javaground上使用的J2ME到Brew的转换。编写多种分辨率的单个二进制代码是很有可能的。我们有一个设备缺陷数据库,因此它可以通过平台ID来检测设备,然后生成一系列标记来标记已标记的缺陷。例如,大多数(如果不是全部)摩托罗拉Brew手机都有一个错误,即在我们接听电话之前,来电不会中断应用程序,因此我使用TAPI监视来电并生成hideNotify事件(因为模拟Java,尽管生成的代码是纯C ++)。我在运行时对Brew版本进行了一些检查,如果是Brew 2而不是Brew 3,则禁用了某些API。

3D类型的游戏更容易使分辨率独立,因为我们正在缩放软件。

另外,还有2个单独的声音API,分别是IMEDIA和ISOUNDPLAYER,ISOUNDPLAYER是较旧的API,在所有设备上均受支持,但功能不多(只能使用IMEDIA进行多声道音频)。我创建了一个IMEDIA对象,如果无法获取IMEDIA对象,它将回退以创建一个ISOUNDPLAYER对象。

完全通用的构建的问题在于功能上的差异很大,因此值得进行一些构建,较旧的设备只有不到1MB的堆(并且屏幕尺寸很小),然后我们会得到很多6MB以上(176x204或者更大)。

尽管某些新设备是触摸屏(并且我们必须处理指针输入)和旋转屏幕,但使用Brew确实具有一组相当一致的键值集(与Java不同)。

也有一些旧的诺基亚电话使用大尾数模式,这意味着文件与普通的mod文件不同(除非我们要编写一些非常酷的汇编语言前缀标头来解码文件)