×
Namespaces

Variants
Actions

如何预装Symbian应用

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

代码示例
兼容于
平台:
Symbian

文章
翻译:
Levin_Wei
最后由 hamishwillee 在 08 May 2013 编辑


本文将会介绍预置应用(Preinstalled applications),包括如果创建一个预置应用、如何升级预置应用,以及对于在开发预置应用中遇到的常见问题给出相应的解决方案。

Contents

介绍

预置应用,也就是用户在没有手动安装应用的情况下,手机终端上会自动安装的应用。
预置应用中所有的文件,例如二进制文件、资源文件等,都已经被放置在一张存储卡上的相应文件夹下。当该存储卡被插到手机终端上的时候,存储卡中的预置应用会自动进行安装,不需用户手动安装。
除了应用中用到的文件,还要把该应用的.sis文件放在存储卡的\private\10202dce目录下,该.sis文件的TYPE为PA,该.sis文件被成为存根,以为该.sis文件中没有任何应用的文件。当安装该.sis的时候,作用是在系统中注册该应用。
如果系统中存在一个应用,并且该应用的UID3与将要安装的预置应用的UID3相同,那么该预置应用不会被安装。

预置应用

如何创建一个PA包

创建PA的.sis文件的时候,应遵循以下几点要求:

  • 确定在.pkg文件中,TYPE的值为PA
  • 在.pkg文件中,将所有文件的安装目标盘符都改为MMC的盘符(E:)
  • 最后的.sis需要从受信任的权威机构获得证书,例如进行Symbian Signed。该证书必须被终端设备认为是受信任的,而且要拥有所有二进制文件所要求的所有能力。在开发过程中,可以使用开发者证书。如果该应用是为Nokia开发(拥有Nokia的商标),是不需要进行Symbian Signed的,该应用由Nokia进行签名。所有拥有开发商商标的应用都需要进行Symbian Signed。在进行Symbian Signed的时候,要相应提交.sis文件、.pkg文件、包含了所有的二进制文件的.zip文件,并且这些二进制文件要被放在相应的文件夹下:private、resource、sys
  • 不要使用FR(FILERUN)选项在PA包中
  • 可以使用FN,如果要被删除的文件不是只读的
  • 不要使用FT(FILETEXT),该选项会在PA包中被忽略掉
  • 在PA包中不可以内嵌安装.sis文件
  • 把.sis文件拷贝到存储卡的\private\10202dce\下,
    注意这里的sis至少是经过开发者证书签名后的sisx,自签名的sisx不行。
  • 把.pkg中列出的文件拷贝到存储卡的相应目录下
  • PA包例子:File:TestPreApp.zip
  • 在运行程序后,选择菜单中的“Show Version”:

PA.png

如何升级预置应用

SA升级包

  • 如果将SA升级包装在E:下,会改变PA包中的文件,如果将该存储卡再插入别的手机中,这个PA包中的文件已经是被改变了的。
  • SA升级包:File:UpgradePreAppSA.zip
  • 安装SA升级包后,运行程序:

UpgradeBySA.png

  • 将手机格式化后,重新自动安装存储卡上的应用,运行程序:

UpgradeBySA.png

  • 可以看到,在使用SA包升级原PA包的时候,已经将PA包的文件修改

SP升级包

  • SP包升级不会让用户选择安装目录,会自动安装在要升级的应用的目录下,由于SP包不能重写原PA包的文件,所以PA包里的文件不会被修改。
  • SP升级包:File:UpgradePreAppSP.zip
  • 升级后,运行程序:

UpgradeBySP.png

卸载预置应用

卸载预置应用,会将存储卡上面与该应用相关的文件删除。
如果想在“程序管理”中删除某一预置应用,但不将相应的文件删除,可以将\private\10202dce下的sis包改为只读的。

常见问题解决方案

安装文件已被修改

问题描述:在预置软件安装完成后,在使用的过程中,可能会对一些.ini文件进行修改,那么当把存储卡插在别的手机上重新安装使用的时候,该.ini文件就已经是修改过的了。
解决方案:在程序中,使用所有的可修改的文件的时候,都不要使用原始的文件,都在第一次使用的时候,将原始文件拷贝一份进行修改使用。

向C盘安装文件

问题描述:因为预置应用的pkg文件中,只能将文件安装在(E:)盘中,如果应用需要安装ECom插件或者注册开机自启动,那么就必须向(C:)盘安装相应的文件。
解决方案:将需要安装在(C:)盘中的文件打包在另外一个sis包中,然后在预置应用的pkg文件中增加下面这行:

"..\sis\CFiles.sisx" -"e:\private\E3985A09\CFiles.sisx"

CFiles.sisx的pkg文件:

&EN
 
#{"UpgradePackage"},(0xEAFEFE10),1,0,1,TYPE=SA
 
%{"Vendor-EN"}
 
:"Vendor"
 
;Supports Series 60 v 3.0
[0x101F7961], 0, 0, 0, {"Series60ProductID"}
 
"$(EPOCROOT)Epoc32\data\z\resource\apps\AutoStart.rSC"-"c:\private\101f875a\import\[E3985A09].rSC"

然后在预置应用启动的时候判断本机中是否有EAFEFE10的应用,然后判断安装该UpgradePackage,但是这里有一个问题,如果使用SA包进行安装,那么和预置程序是不同的程序,但是该UpgradePackage是作为一个“插件”包来安装的,所以对于用户来说,在删除了预置应用后,能够将其所有的“插件”也要删除。
所以,在这里,使用SP包最合适,在删除预置包的时候,插件包也同时删除。但是SP包也会有问题,应用中无法根据UID进行判断,所以在SP包中同时安装一个标示该SP包的文件,SP包的pkg文件如下:

&EN
 
#{"UpgradePackage"},(0xE3985A09),1,0,1,TYPE=SP
 
%{"Vendor-EN"}
 
:"Vendor"
 
;Supports Series 60 v 3.0
[0x101F7961], 0, 0, 0, {"Series60ProductID"}
 
"$(EPOCROOT)Epoc32\data\z\resource\apps\AutoStart.rSC"-"c:\private\101f875a\import\[E3985A09].rSC"
"..\sis\Identifier.txt" -"e:\private\E3985A09\Identifier.txt"

然后在预置应用启动的时候判断在private目录下时候有Identifier.txt,然后判断进行安装SP包。 安装sis包的代码:

RFile rFile;
RApaLsSession lsSession;
User::LeaveIfError(lsSession.Connect());
CleanupClosePushL(lsSession);
TThreadId threadId;
 
_LIT(KMySisFile, "e:\\private\\EAFEFE09\\UpgradePackage.sis");
 
if(BaflUtils::FileExists(CEikonEnv::Static()->FsSession(), KMySisFile))
{
User::LeaveIfError(rFile.Open(CEikonEnv::Static()->FsSession(), KMySisFile, EFileRead));
}
 
lsSession.StartDocument(rFile, threadId, NULL);
lsSession.ClearFsSession();
lsSession.Close();

如果想使用Silent Installer,请参考:Silent Installer
File:Sample.zip

相关链接

This page was last modified on 8 May 2013, at 00:05.
352 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×