I’ve been fighting to get Symbian Signed for my freeware, Screenshot for Symbian OS, in the last couple of days. It is not as easy as I thought. What is Symbian Signed actually? It is a certification for Symbian OS applications that meet certain criteria. There are some test cases that have to be passed for an application to get Symbian Signed logo. For example, an application shall not affect other phone functionalities, like voice call, messaging, etc.

My application is relatively simple and small, but it took two days to pass all Symbian Signed test cases. My application can pass almost all of test cases, except one, i.e. low memory test. It basically tests our application start-up during low memory situations. There is a tool from Symbian Signed site, called LowMem, which allows us to perform low memory test. Our application shall be able to handle low memory situations properly, otherwise it will fail. Handling properly means displaying “Out of memory” dialog and does not leave any “garbage” in the memory.

What have I done to make my application pass LowMem test? Here are some tips from me to pass LowMem:

  • Call BaseConstruct() at the first line of your AppUi::ConstructL() method. If not possible, call it as early as possible in the AppUi::ConstructL().
  • Make sure that your application can handle partially constructed object. For example, your destructor shall be able to handle the case where ConstructL() leaves. The most common mistake is to call a method without checking the pointer is valid (means not NULL). For example:iPointer->Close();If you have a statement like that in the destructor, HandleForegroundEvent(), SizeChanged(), etc. You have to prepare to handle the case where iPointer is not successfully instantiated by ConstructL().
  • If you TRAP something, let KErrNoMemory leave propagates to the Symbian OS framework’s default trap.
  • There is one very weird case for my application. When I instantiate an object at the end of AppUi::ConstructL(), it fails (with KERN-EXEC-3). However, when I instantiate the same object at the beginning of AppUi::ConstructL() after BaseConstructL(), LowMem no longer report any error.
    I don’t have a good explanation for this, but according to a Symbian discussion board, we have to instantiate objects right after BaseConstruct().
  • LowMem seems to have some known bugs too. If the application still fails, check this page out. You may request for a waiver from Symbian if you encounter this problem.

Now, the next step is to submit my application to one of the Symbian test houses. Wish me luck…. :)

Update (02-Feb-06): Another tip from Symbian about how to write a good Symbian OS applications.