第六章移植MIUIAPP
所有需要移植的MIUIAPP放在patchrom/miui/system/app目录下。移植APP相对简单,直接把对应的APK放到system分区app目录下即可。但是可惜的是,有一些限制导致我们需要做一些额外的工作。本节就具体的描述移植APP中可能遇到的一些问题。
1.MIUIAPP一览:
APKContacts.apk
ContactsProvider.apk
Mms.apk
TelephonyProvider.apk
TelocationProvider.apk
Music.apkNotes.apk
MIUISystemUI.apk
ThemeManager.apk
Updater.apkTorch.apk
Launcher2.apk
DownloadProvider.apk
DownloadProviderUi.apk
说明联系人程序联系人数据库短信程序短信相关数据库来电归属地相关数据库音乐程序便签程序系统通知栏程序主题管理器程序系统更新程序手电筒程序启动器程序
下载管理相关数据库下载管理程序
2.一个遗憾:打电话程序
打电话程序一般是位于system/app下的Phone.apk。在上面的列表中,我们并没有看到MIUI的Phone.apk,为什么呢?
与一般的APK不同,Phone.apk必须访问Android的私有API。Android的公有API对所有的第三方开发人员是一样的,即AndroidSDK开放的API。这也是为什么目前市场上有很多第三方的联系人,短信等程序,但是确没有打电话程序。这些私有API的实现和接口各个不同的机型有可能不一样,而且更复杂的是,虽然有的时候接口一样,但是语义不一样。(Phone.apk需要与RIL层通信,RIL层全称为radiointerfacelayer,这一层又是对底层RADIO通信的一个封装,Phone.apk通过发送称之为RILCommand的一些命令和RIL层通信,不同架构的机型这些命令有差别) 理论上说,MIUI的Phone.apk完全可以移植到新的机型,只是移植难度大一些。
在使用由framework层提供的私有API的地方,要保证使用目标机型framework层所提供的私有API。要了解目标机型支持的RILCommand以及相应的语义,使用目标机型所定义的RIL通信命令。这些需要对Phone的源代码很熟悉,要仔细研究目标机型Phone.apk反编译后的smali代码。
由于上述的一些限制,在项目初期我们做了一个艰难的决定,不移植Phone.apk。
3.一个遗憾引发的问题
容易理解的是,打电话程序访问联系人信息,当拨打或接听电话时,显示号码所对应的联系人,在相应的联系人下面存取通话记录等。
Android系统为这些操作定义了一套接口。如果目标机型的Phone.apk只是使用这些接口访问联系人信息,那么我们无需对Phone.apk做任何修改。但是可惜的是,现实往往没有那么简单。
举个例子,在移植i9100时我们发现在联系人程序里没有通话记录信息,Android定义了一个类CallLog,调用其中的allCall方法来保存通话记录信息。通过反编译Phone的代码,我们发现i9100使用了一个专有的LogsProvider来存取通话记录,完全没有调用allCall方法。通过修改Phone中的CallLogAsync$AddCallTask.smali文件,调用allCall来保存通话记录信息。
之后又陆续碰到一些电话相关的问题,比如拨打接听电话无法显示联系人,点击通知栏的未接电话通知无法进入拨号界面等。有一些问题比较好解决,可以在adblogcat中看到异常信息或错误信息。有一些问题没有错误提示,比如说接听电话无法显示联系人,只显示来电号码等。这个时候就需要从问题回溯找出原因,当接听电话的时候,系统中一定有一个方法能够通过来电号码查找联系人,那我们就需要找到这个方法,然后看看这个方法是否有问题。
总而言之,电话和联系人程序的结合是比较紧密的,而我们在移植过程中发现的种种问题也基本上是由于电话和联系人的一些通信接口导致的,这个时候我们就需要细心的逐个排查这些问题。
4.系统通知栏
在开发MIUIAPP时,我们严格遵循一条规则:不使用framework私有的资源。这个原因在之前我们介绍android资源内部机制的时候有涉及过,framework资源是放在framework-res.apk中。对于私有资源,不同的framework-res.apk这些私有资源的ID一般也是不同的。但是系统通知栏是其中的一个特列,系统通知栏必须访问某些私有资源ID,这个情况怎么办呢。
我们在开发系统通知栏程序的时候也考虑到了这一点,把所有对私有资源的访问封装在一个类中,位于patchrom/miui/system/app/MIUISystemUI/ResourceMapper.java。
publicfinalclassResourceMapper{
privatestaticSparseIntArraysMapping;
static{
sMapping=newSparseIntArray();
sMapping.put(com.android.internal.R.drawable.stat_sys_battery,
com.miui.internal.R.drawable.stat_sys_battery);
sMapping.put(com.android.internal.R.drawable.stat_sys_battery_charge,
com.miui.internal.R.drawable.stat_sys_battery_charge);
sMapping.put(com.android.internal.R.drawable.stat_sys_battery_unknown,
com.miui.internal.R.drawable.stat_sys_battery_unknown);
sMapping.put(com.android.internal.R.layout.status_bar_latest_event_content,
com.miui.internal.R.layout.status_bar_latest_event_content);
}
publicstaticintget(intresid){
intresult=sMapping.get(resid);
returnresult!=0?result:resid;
}
}
这个类的作用很简单,就是就对私有资源的访问完全封装起来,这样使得系统通知栏程序的其它代码都不直接访问私有资源。
为了移植系统通知栏,我们需要先反编译MIUISystemUI.apk,修改反编译后的ResourceMapper.smali文件,即将com.android.internal.R.drawable.stat_sys_battery的资源ID修改成在目标机型中对应的资源ID。(如何获取目标机型中对应的资源ID,可以查看framework-res/res/values/publics.xml中该资源名称对应的ID)。
5.其它程序
其它程序基本上直接放到system分区的app目录下即可使用。启动器程序可能需要做一些小的修改,这些修改基本上都比较容易,都是从问题回溯,找到出现问题的根源。
可能对你有帮助的内容:极客币获取 | 话费充值 | 下载帮助 | 刷机必看 | 阿里云代金券
文章名称:【JK团队|MIUI移植第六课】移植MIUI APP
文章链接:https://www.xtdiguo.com/7197.html
免责声明:根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。