Tuesday, February 12, 2008

Install iCosta on 1.1.3

关于 NativeCn 和 iCosta

NativeCn使用了苹果自己的固有的键盘机制,利用了日文输入法键盘,在没有针对1.1.3更新之前,可能尚无法直接支持1.1.3版。

iCosta本质上是一个附加库,通过dyld在启动SpringBoard时被自动载入, 并通过重载(override)部分方法(我猜测是UIKit的方法,没有逆向分析过)来实现中文输入,因此对于1.1.2的版本仍然可以用于1.1.3版。不过,目前的安装脚本不允许在1.1.3上直接安装,需要手工安装,这篇文章就是讲手工安装的方法的。

UPDATE: iCosta有比较明显的内存泄漏问题。在安装后,类似下面的这种错误随处可见:

*** _NSAutoreleaseNoPool(): Object 0x204680 of class NSConcreteValue autoreleased with no pool in place - just leaking
*** _NSAutoreleaseNoPool(): Object 0x206960 of class NSCFString autoreleased with no pool in place - just leaking

从错误信息看,显然是在创建可自动释放(autorelease)的对象之前没有创建NSAutoreleasePool实例,长期不重启的话,会逐渐导致系统可用内存越来越小。

安装方法

先下载好需要的iCosta 1.1.2版的PXL文件,我用的是拼音输入法,因此下载了 iCostaPy_1.1.2.pxl,其他的输入法安装方法与这里描述的完全一样。

1. 把文件改名成.zip,然后解压,得到以下一些内容:

PxlPkg.plist
README.txt
README_cn.txt
bin/iCosta.dylib (植入库)
iCostaImages/* (键盘需要的图片)
icon.png
util/iCostaCtl (用来安装和卸载的程序)


2. 在iPhone上建一个目录:

/Library/iCosta

然后把iCostaImages里面所有的PNG图片上传到建立的目录中去。完成后检查一下文件属性,应该所有人(Owner, Group, Other)都可读,否则调出输入法后看不见键盘的(注:原PXL中有权限错误),在 iPhone 上输入下面命令确保所有属性都正确:

chmod 755 /Library/iCosta
chmod 644 /Library/iCosta/*

3. 把bin目录中的iCosta.dylib上传到iPhone的/usr/lib目录中去。如果对文件属性不确定, 可以输入下面命令保证权限正确:

chmod 755 /usr/lib/iCosta.dylib

4. 把util目录中的iCostaCtl上传到iPhone的/usr/bin目录中去。如果对文件属性不确定, 可以输入下面命令保证权限正确:

chmod 755 /usr/bin/iCostaCtl

5. 确定存在/var/root/Library/Preferences/.GlobalPreferences.plist文件,如果这个文件不存在,可以用符号连接指向mobile账号下的同名文件:

ln -s /var/mobile/Library/Preferences/.GlobalPreferences.plist /var/root/Library/Preferences/.

感谢Tice指出缺少.GlobalPreferences.plist文件的这种可能性。因Dev JB 113把root有关文件移动到了mobile账号(假如安装时没有选择保留用户数据),因此在root账号下的有关配置可能是空的。

6. 在iPhone上执行下列命令安装植入库并载入字典:

iCostaCtl -install111

以上命令修改了com.apple.SpringBoard.plist,在其中插入了植入库,并修改了全局配置文件.GlobalPreferences.plist,加入了zh_CN条目。

7. 重启SpringBoard使植入库生效:

launchctl remove com.apple.SpringBoard
launchctl load /System/Library/LaunchDaemons/com.apple.SpringBoard.plist

SpringBoard重启动的时候会通过dyld载入iCosta.dylib植入库,并进行初始化。iCosta.dylib通过重载部分方法来实现中文输入法。至此,已经可以正常输入中文了。

卸载方法

1. 修改SpringBoard配置文件并恢复设置:

iCostaCtl -uninstall111

该命令恢复经过修改的配置文件。

2. 重新启动SpringBoard

launchctl remove com.apple.SpringBoard
launchctl load /System/Library/LaunchDaemons/com.apple.SpringBoard.plist

3. 删除安装文件:

rm -rf /Library/iCosta
rm -f /usr/lib/iCosta.dylib
rm -f /usr/bin/iCostaCtl

至此,已经彻底删除了iCosta

常见问题

为什么切换到中文输入法时看不到键盘,却可以“摸黑”输入?

这是因为用于输入法的键盘图片权限不对,无法读取造成的。iCosta的文件包里面iCostaImages目录中的文件权限不对,有部分文件只有所有者(Owner)才能读取,如果从 Unix操作系统上通过SCPSFTP传到 iPhone后就需要修改权限(因为Unix系统的这种复制会连带属性一起复制,除非目标文件已经存在),修改的方法前面已经讲过了。

为什么以前安装没有这个权限问题?

因为以前SpringBoard应用都是以root身份运行的,可以读取任何文件,而自1.1.3开始,SpringBoard改成了以mobile身份运行,而由于iCosta PXL文件本身的错误导致需要对文件权限进行调整。实际上,由于这个权限问题,很多第三方应用在1.1.3上都需要进行调整,比如Installer必须SUID root才能正确运行。

为什么用Natetrue的方法没有问题,用Dev Team的就有问题?

还是权限问题。Natetrue的方法最后mobile实际上是root,拥有与root同等的权限,当然不会有读不到文件的问题了。Dev Team的方法是遵循了苹果的模式,让mobileroot区分开来,所以有权限问题。

No comments: