首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

Android玩乐系列:批改汇编代码支持原生高清来电大头贴(二)

2012-09-18 
Android玩乐系列:修改汇编代码支持原生高清来电大头贴(二)【本文分三篇。本篇提供一个最小的修改案例。更详细

Android玩乐系列:修改汇编代码支持原生高清来电大头贴(二)

本文分三篇。本篇提供一个最小的修改案例。更详细的修改请参考篇三:

http://blog.csdn.net/aimingoo/article/details/7939132


(前三节有关背景介绍请至:http://blog.csdn.net/aimingoo/article/details/7939093)


4、修改前的准备工作
=======
这里介绍一些Android上的逆向工程的基础。首先,我们要操作Phone.apk,它其实也就是一个.zip文件,其中包括四个主要信息:
  - 资源文件:res\*.*和resources.arsc
  - 代码文件:classes.dex
  - 应用描述:AndroidManifest.xml
  - 签名信息:META-INF\*.*
apktool这个工具可以处理前三种数据,而签名信息则必须使用一个signapk.jar(有些工具包称为AutoSign)。


1)解包(缺省至Phone目录)
apktool d -f Phone.apk


注意我们接下来的修改都不会动到资源,所以事实上也可以不解开其中的资源文件。可以这样使用命令行:
apktool d -f -r Phone.apk


这样在编译回去的时候会快一点,而且也可以避免一些错误。——但很多时候的修改需要对照着资源文件来看,所以你也可以解一份有资源文件的版本放在旁边作参照。




2) 编译回.apk(指定从Phone目录)
apktool b -f Phone Phone2.apk




3) 对Phone2.apk加签名
java -jar signapk.jar platform.x509.pem platform.pk8 Phone2.apk Phone2_signed.apk


注意这时使用的签名文件为platform.x509.pem和platform.pk8,而不是我们平常用的testkey*.*。这是很关键的一处:Phone.apk必须使用platform.*来签名。




5、修改:初步
=======
我们将Phone.apk解到Phone目录之后。可以找到如下子目录:
Phone\smali\com\android\phone\


我们接下来主要修改两个文件:
CallCard.smali
InCallScreen.smali
注意这里的*.smali是另一种格式的源代码,它反编译自Dalvik虚拟机中执行码(opcode)。基本上,你可以认为这*.smali就是汇编代码(基于寄存器的虚拟机引擎)。好吧,但我们既然要“原生的”,那么就只好来改改这些汇编代码了。:(


1)对InCallScreen.smali只需要做一处修改
---------
找到:

public boolean showCachedBackground(CallerInfo paramCallerInfo, Call paramCall){  // 电话是在用状态(来电或呼出或接通)  boolean bool = paramCall.getState().isAlive();  // paramCallerInfo.isCachedPhotoCurrent有效  bool = bool && (paramCallerInfo != null) && paramCallerInfo.isCachedPhotoCurrent;  if (bool) {    Drawable localDrawable = paramCallerInfo.cachedPhoto;    if ((localDrawable.getIntrinsicWidth() < 240) || (localDrawable.getIntrinsicHeight() < 240)) {      bool = false    }    else {      // 置mMainFrame的背景      this.mInCallScreen.mMainFrame.setBackgroundDrawable(localDrawable);          // 使mPhoto不显示(原来的头像就不必显示了嘛)      this.mPhoto.setVisibility(8);      // 修改作个人信息的显示风格(备用,后文解释)      // setPersonInfoStyle(false);    }  }  return bool;}


热点排行