Android添加缅语字体与Root

缅甸的客户要求手机内置缅语与输入法,小语种在android源码中没有添加.客户给出了相关的APK.其中一个是缅甸语键盘输入法,直接安装即可,但此时在编辑界面输入时无缅语输出.还有一个APK,安装运行自动重启,此时再次输入即可以正常显示缅文.

但此APK需要有Root权限,即使编译为ENG版本,依然提示设备未Root.这里省过千言万语的寻找root的过程(MTK的E-Service不回答此类Root问题),直接给出最终的Root方案.

修改su程序对临时用户的限制,默认su只允许root和shell用户执行

vi system/extras/su/su.c

注释掉语句块

  1. /*
  1. myuid = getuid();
  1. if (myuid != AID_ROOT && myuid != AID_SHELL) {
  1. fprintf(stderr,”su: uid %d not allowed to su\n”, myuid);
  2. return 1;
  1. }
  2. */

就安全性而言这种方式是不太可取的,因此才有了类似于superuser.apk的出现,它们的作用就是在外面再提供一层保护。

功能是好用了,但到这里还没有完,正式出货的版本发布ENG及修改后的SU,相当的危险.

接下来看看这个APK里面有什么,为什么需要Root权限.把APK解压后,发现assets里面有四个字体文件,bold.ttf,dsf2.ttf,dsf3.ttf,regular.ttf.此时想到大致的思路应该是把这些字体文件放到/system/fonts/目录下,从而为系统添加一种新的字体.但通过adb 把这些文件Push进去之后发现,仍无法正常输入缅文.

深入分析就需要反编译此APK,到底对这些字体文件做了什么操作.省略……反编译过程.

1.源中显示,把这些ttf文件,先保存到了SD上.

InputStream localInputStream = this.mContext.getAssets().open(“bold.ttf”);

FileOutputStream localFileOutputStream = new FileOutputStream(“/sdcard/data/fonts/bold.ttf”);

2.然后替换掉了系统字体.

File localFile2 = new File(“/system/fonts/DroidSans-Bold.ttf”);

this.fBold = localFile2;

File localFile3 = new File(“/system/fonts/DroidSans.ttf”);

this.fRegular = localFile3;

File localFile4 = new File(“/system/fonts/Roboto-Bold.ttf”);

this.fRoboBold = localFile4;

File localFile5 = new File(“/system/fonts/Roboto-Regular.ttf”);

this.fRoboRegular = localFile5;

File localFile6 = new File(“/system/fonts/DroidSansFallback.ttf”);

这里找到了为什么直接添加此四个ttf文件到system/fonts/中不好用的原因,是替换而不是新增了系统字体.

通过对比运行此APK前后的/system/fonts/文件,发现其实此APK只替找了一个文件DroidSansFallback.ttf,Baidu一下”DroidSansFallback可以显示生僻字和粤语口语字”,再次通过Adb替换手机内的此文件,终于可以正常显示.

此问题到此可以结束,但这个APK为什么要先把这些字体文件放到SD中,而不是直接替找掉/system/fonts/里的同名文件,还需进一步研究.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.