1. 安装的资源文件是否齐全
2. UID是否和其他程序重复、
3. 程序编译出来的版本与手机上安装的操作系统版本不一致。当前针对Symbian OS应用程序的开发版本有好多种,如:S60v1.0、S60v2.0、S60v3.0、UIQ2.1、UIQ3.0等,在开发前一定要先确定一下开发的程序是要在什么样的手机上运行,其中S60系列和UIQ系列的编码方法差别较大,Nokia的Symbian智能手机大部分是S60系列的,而索爱的Symbian智能手机大部分是UIQ系列的;
4. 应用程序中的程序ID号不一致。每个Symbian应用程序都有一个可以唯一标识该程序的ID号,且在整个应用程序中有多个地方用到这个ID号,如:mmp文件、pkg文件、app文件(程序入口文件)、XXXAIF.rss文件,这些文件中的程序ID号必须是一致的,否则会造成程序打不开;
5. 全局变量定义不当。Symbian OS v9.0版本可以支持全局变量了,但在以前版本是不支持全局变量的,如果要定义全局变量则必须把全局变量定义成“static const”的形式,而且在MMP文件中必须加入“EPOCALLOWDLLDATA”这样的标识,如果不这样做,则在模块器上可以运行,但在手机上会造成程序打不开的现象;
6. 资源文件定义不当。这个就比较麻烦,原因也是很多,如果发现在构造某个窗口时程序出现退出的现象,一般就要查一下有关这个窗口的资源文件定义是否对了;
7. 程序中使用了受限的API。这个主要出现在Symbian OS v9.0中,原以为Symbian OS v9.0可以支持全局变量会变量方便多了,但却在API上加了个“Capability”的级别限制,让程序员在开发程序时束手束脚了。
8. 内存不足程序无法运行 看看手机中的内存是否比 mmp文件中规定的内存小
9. 调用的DLL文件的能力高过exe的能力。
10. 仔细检查 reg.rss, pkg, rss, mmp, 以及代码里的uid3是否一致. 新手程序不能运行, 有 80% 是因为这个原因.
11. 仔细检查 reg.rss是否正确, 匹配.
12. 如果前面都没错, 就不好解决了, 可以看看是否引用了该手机不止的lib库等, 比如在mr手机上使用了 fp1 的lib.
13. 通过 RFileLogger 等检查有无执行到AppUi的construct函数, 如果执行到了, 那么就是代码问题(引用错资源导致leave), 否则应该就是上面 4个原因.
14. 平台安全性问题,导致无法打开文件
我的问题就在于14点,平台安全性没解决好,在第三版的手机上一点提示没有,搞了有两天,换到第五版手机,才提示安全性问题,检查MMP文件后发现使用了UserEnvironment能力,而我使用的又是自签名。所以。。。。
另附一篇WIKI的文章
如何解决平台安全问题
在应用软件开发过程中,我们通常会碰到各种与平台安全概念有关的问题,而弄清当前面临问题是否的确与平台安全有关却有点棘手。下面的检查列表将有助于分析平台安全相关问题。
Contents[hide] |
[edit]检查模拟器日志输出
可做的首要事情是检查模拟器日志输出,这个比较容易查找。从模拟器的Tools | Preferences菜单可启用模拟器日志输出,确保"Enable EPOCWIND.OUT logging"被选中。另外,从epoc.ini文件也能启用日志输出,确保LogToFile值为1。
LogToFile 1
然后运行应用程序,执行一些操作后退出。接着,打开EPOCWIND.OUT文件,这个文件位于%TEMP%文件夹(在DOS窗口键入"echo %temp%"命令行,即可获知%TEMP%的真实路径)。下面给出一个有平台安全问题的应用程序的例子。
151.975 *PlatSec* WARNING - Capability check would have failed - A Message
(function number=0x00000000) from Thread Screenshot[20000555]0001::screenshot,
sent to Server !Windowserver, was checked by Thread
WSERV.EXE[10003b20]0001::Wserv and was found to be missing the capabilities:
SwEvent . Additional diagnostic message: Capability check failed for
RWindowGroup::CaptureKeyUpsAndDowns API
153.600 *PlatSec* WARNING - Capability check would have failed - A
Message (function number=0x00000000) from Thread
Screenshot[20000555]0002::screenshot, sent to Server !MsvServer, was checked by
Thread !MsvServer[1000484b]0001::!MsvServer and was found to be missing the
capability: ReadUserData.
这个例子显示出此程序缺少两个能力,即:SwEvent and ReadUserData。
[edit]在模拟器上执行能力检查
这个与前面的那个基本类似。不是将问题写入日志文件,而是当有平台安全问题时模拟器会立即通知。
从模拟器的菜单Tools | Preferences可使能模拟器能力检查。也可从epoc.ini文件使能这个检查,就是将PlatSecDisabledCaps的值改为NONE。
PlatSecDisabledCaps NONE
意思是没有被禁用的capability。换言之,所有能力检查都被启用。 当启用这个功能后,模拟器在每次调用受限API时将显示一个对话框。下例给出一个例子:因为缺少能力显示的错误信息。
[edit]我所用的API需要哪些能力?
在检测到问题之后,下一步就是如何找到问题所在。调试代码总是有帮助。另外,也查看SDK帮助看应用程序是否有被拉掉的能力。下例是一个写在SDK帮助中的能力信息的例子。
Capability Information
Required capabilities:
ReadUserData WriteUserData ReadDeviceData WriteDeviceData
[edit]检查MMP文件
在收集到所有需要的能力之后,下一步就是检查.mmp文件,确保这个文件中列举了所有需要的能力。mmp文件中能力声明例子:
CAPABILITY SwEvent LocalServices NetworkServices ReadUserData WriteUserData
注意:Carbide.c++ 1.1不使用.mmp file。要在Carbide.c++ 1.1上修改capabilities,右击工程并选择Properties | C/C++ Build。 因此,推荐使用最新版本(当前为2.0版)。
[edit]Carbide.c++ 能力扫描工具
有一个Carbide.c++新插件,叫做Capability Scanner],它能在IDE中检测平台安全问题。这个插件在Carbide.c++ release v1.3之后可用。
[edit]检查DLL依赖关系
在平台安全中,可执行程序只能装载比它自身有更多能力的DLL。例如,具有A和B能力的可执行程序不能装载只有能力A的动态库(DLL)。确信可执行文件所装载的所有DLL都有更多的能力或者至少一样多且完全相同。
这个问题通常发生在使用第三方DLL时。大多数在ROM上的DLL都有"All -Tcb"能力;而大多数第三方应用的能力比ROM上的DLL的能力少。 检查可执行文件的能力,包括.exe和.dll,可通过elftran工具来进行。使用"-dump h"参数运行这个工具,然后检查运行结果中的capabilities 区段。
ELFTRAN - ELF file preprocessor V02.01 (Build 564)
Copyright (c) 1996-2006 Symbian Software Ltd.
E32ImageFile 'screenshot.exe'
Entry points are not called
...
Capabilities: 00000000 0001f000
...
上例中的可执行文件拥有0x0001 F000能力。能力位的定义可以在头文件e32capabilities.h中找到。这个文件随任何Symbian OS 9 SDKs而发行,包括S60 3rd Edition SDK。There is no such file as e32capabilities.h in either MR release or the FP1 release, there is a file named e32capability.h but that is not usefull at all.
然而,使用elftran -dump s <filename>命令可能更易获得可执行文件的能力。
ELFTRAN - ELF file preprocessor V02.01 (Build 573)
Copyright (c) 1996-2006 Symbian Software Ltd.
E32ImageFile 'HelloWorldBasic.exe'
Secure ID: 102ee322
Vendor ID: 10333333
Capabilities: 00000000 000ffffe
CommDD
PowerMgmt
MultimediaDD
ReadDeviceData
WriteDeviceData
DRM
TrustedUI
ProtServ
DiskAdmin
NetworkControl
AllFiles
SwEvent
NetworkServices
LocalServices
ReadUserData
WriteUserData
Location
SurroundingsDD
UserEnvironment
[edit]Internal links