×
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 03:05.
337 page views in the last 30 days.