仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1801|回复: 19
打印 上一主题 下一主题

[学习教程] IOS制作之Android玩乐系列:修正汇编代码撑持原生高清来电年夜头贴(二)仓酷云 ...

[复制链接]
柔情似水 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:30:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
很简单OBJCAVFoundation---播放视频相关的库最近正在学习这些算是学iOS开发的一些方法(前三节有关背景先容请至:《Android玩乐系列:修正汇编代码撑持原生高清来电年夜头贴(一)》)
4、修正前的筹办事情
=======
这里先容一些Android上的逆向工程的基本。起首,我们要操纵Phone.apk,它实在也就是一个.zip文件,个中包含四个次要信息:
-资本文件:res*.*和resources.arsc
-代码文件:classes.dex
-使用形貌:AndroidManifest.xml
-署名信息:META-INF*.*
apktool这个工具能够处置前三种数据,而署名信息则必需利用一个signapk.jar(有些工具包称为AutoSign)。

1)解包(缺省至Phone目次)
apktoold-fPhone.apk

注重我们接上去的修正都不会动到资本,以是现实上也能够不解开个中的资本文件。能够如许利用命令行:
apktoold-f-rPhone.apk

如许在编译归去的时分会快一点,并且也能够制止一些毛病。——但良多时分的修正必要对比着资本文件来看,以是你也能够解一份有资本文件的版本放在中间作参照。

2)编译回.apk(指定从Phone目次)
apktoolb-fPhonePhone2.apk

3)对Phone2.apk加署名
java-jarsignapk.jarplatform.x509.pemplatform.pk8Phone2.apkPhone2_signed.apk
注重这时候利用的署名文件为platform.x509.pem和platform.pk8,而不是我们寻常用的testkey*.*。这是很关头的一处:Phone.apk必需利用platform.*来署名。
5、修正:开端
=======
我们将Phone.apk解到Phone目次以后。能够找到以下子目次:
Phonesmalicomandroidphone
我们接上去次要修正两个文件:
CallCard.smali
InCallScreen.smali
注重这里的*.smali是另外一种格局的源代码,它反编译自Dalvik假造机中实行码(opcode)。基础上,你能够以为这*.smali就是汇编代码(基于存放器的假造机引擎)。好吧,但我们既然要“原生的”,那末就只好来改改这些汇编代码了。:(

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

  • .fieldprivatemMainFrame:Landroid/view/ViewGroup;
改成:

  • .fieldpublicmMainFrame:Landroid/view/ViewGroup;
我们必要在CallCard.smali中会见这个成员,以是它必需是公然的(public)。


2)修正CallCard.smali,针对updateDisplayForPerson()办法
---------
找到:

  • .methodprivateupdateDisplayForPerson(Lcom/android/internal/telephony/CallerInfo;...
在该办法中,找到独一一处showCachedImage()挪用:

  • invoke-static{v0,v1},Lcom/android/phone/CallCard;->showCachedImage(Landroid/widget/ImageView;Lcom/android/internal/telephony/CallerInfo;)Z
  • move-resultv4
  • if-nezv4,:cond_2
注重两点,一是我们要修正这个:

  • if-nezv4,:cond_2
以是要先记下这个cond_2。第二点,下面的v0,v1,v4大概在详细的代码中有所分歧,这也要寄望,查找时不克不及根据这些存放器。而修正时,也要注重存放器的抵触和利用,有修正履历的就未几言了;没有履历的,则要细心回忆一下汇编言语的常识。


接上去,我们修改上述一行,使之酿成为:

  • ##===》》》
  • if-eqzv4,:cond_20
  • move-object/from16v0,p0
  • move-object/from16v5,p4
  • invoke-virtual{v0,v1,v5},Lcom/android/phone/CallCard;->showCachedBackground(Lcom/android/internal/telephony/CallerInfo;Lcom/android/internal/telephony/Call;)Z
  • move-resultv4
  • goto:cond_2
  • :cond_20
  • ##endfix.
这里,if-nez酿成了if-eqz,而:cond_20这一标签用于拔出一段代码,当这些代码实行完成时,仍旧会到:

  • goto:cond_2
这就是下面要记着cond_2的缘故原由。至于:cond_20是能够随便取的,编译程序是按16进制主动升序来编号这些标签,而0x20号标签一样平常已对照年夜了,不会与现有的标签抵触。固然,写成cond_30或cond_50也行的。

别的,这里还必需要注重v0,v5,v1和v4这四个存放器的利用,必需参考这里的代码高低文为决意利用哪些个余暇的存放器。个中v1是承继利用了后面的存放器值,假如此前v1中不是放着CallerInfo的话,则要依据高低文再调剂。归正,假如存放器用错了的话……哈哈……Crash~~

【注:有一个复杂的办法能够制止用错存放器的成绩,就是在将办法入手下手处的.localsnnn这里的nnn值改年夜几个,必要用几个存放器,就加上几个。然后在我们拔出的代码中,只利用最初的这几个存放器号,也就不会抵触了。比方本来是.locals4,改成.locals8,则v4,v5,v6,v7这新增加的4个存放器号,就老是平安的。】

3)修正CallCard.smali,针对updatePhotoForCallState()办法
---------
这里的修正与上一例是类似的,只不外是针对updatePhotoForCallState()办法罢了。找到:

  • invoke-static{v9,v3},Lcom/android/phone/CallCard;->showCachedImage(Landroid/widget/ImageView;Lcom/android/internal/telephony/CallerInfo;)Z
  • move-resultv9
  • if-nezv9,:cond_2##《《《《===修正此处
修改下面最初一行。酿成:

  • ##===》》》
  • if-eqzv9,:cond_20
  • move-object/from16v5,p1
  • invoke-virtual{p0,v3,v5},Lcom/android/phone/CallCard;->showCachedBackground(Lcom/android/internal/telephony/CallerInfo;Lcom/android/internal/telephony/Call;)Z
  • move-resultv9
  • goto:cond_2
  • :cond_20
  • ##endfix.
4)增加新下面代码所必要的办法:showCachedBackground()
---------
下面两段函数都挪用了一个办法,这个showCachedBackground()是我们这里“来电全屏年夜头贴”的次要功效完成代码。别的的修正,实在只是插个桩罢了。代码以下,把它间接插到CallCard.smali这个文件的某个办法前/前面就能够了(我一样平常将它放在showCachedImage()函数声明的前面):

  • ##
  • ##【主函数:更新全屏年夜头贴】
  • ##
  • .methodpublicshowCachedBackground(Lcom/android/internal/telephony/CallerInfo;Lcom/android/internal/telephony/Call;)Z
  • .locals6
  • .parameter"ci"
  • .parameter"call"


  • .prologue
  • invoke-virtual{p2},Lcom/android/internal/telephony/Call;->getState()Lcom/android/internal/telephony/Call$State;
  • move-result-objectv0
  • invoke-virtual{v0},Lcom/android/internal/telephony/Call$State;->isAlive()Z
  • move-resultv0
  • if-nezv0,:cond_0


  • :goto_0
  • returnv0


  • :cond_0
  • if-nezp1,:cond_1


  • :goto_1
  • const/4v0,0x0
  • goto:goto_0


  • :cond_1
  • iget-booleanv2,p1,Lcom/android/internal/telephony/CallerInfo;->isCachedPhotoCurrent:Z
  • if-eqzv2,:goto_1


  • iget-objectv2,p1,Lcom/android/internal/telephony/CallerInfo;->cachedPhoto:Landroid/graphics/drawable/Drawable;
  • if-eqzv2,:goto_1


  • iget-objectv3,p0,Lcom/android/phone/CallCard;->mInCallScreen:Lcom/android/phone/InCallScreen;
  • const/16v4,0xF0
  • invoke-virtual{v2},Landroid/graphics/drawable/Drawable;->getIntrinsicWidth()I
  • move-resultv5
  • if-ltv5,v4,:goto_1


  • const/16v4,0xF0
  • invoke-virtual{v2},Landroid/graphics/drawable/Drawable;->getIntrinsicHeight()I
  • move-resultv5
  • if-ltv5,v4,:goto_1


  • iget-objectv3,v3,Lcom/android/phone/InCallScreen;->mMainFrame:Landroid/view/ViewGroup;
  • if-eqzv3,:goto_1


  • invoke-virtual{v3,v2},Landroid/view/ViewGroup;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V


  • const/16v2,0x8
  • iget-objectv3,p0,Lcom/android/phone/CallCard;->mPhoto:Landroid/widget/ImageView;
  • invoke-virtual{v3,v2},Landroid/widget/ImageView;->setVisibility(I)V


  • ##const/16v2,0x0
  • ##invoke-virtual{p0,v2},Lcom/android/phone/CallCard;->setPersonInfoStyle(Z)V


  • goto:goto_0
  • .endmethod
6、对开端修正的申明
=======
除2、3步中的插桩代码以外,全部功效实在就依附一个完整手写汇编的showCachedBackground()。它必要操纵到以后类CallCard的

  • CallCard.InCallScreen.mMainFrame
成员。而该成员在InCallScreen类中被声明为private,以是必要在第1步中把InCallScreen中的该声明改成public。

showCachedBackground()的思绪很复杂。因为CallCard.smali老是要从“接洽人”中装载头像,而此前我们已用“HDContactPhotos”把这个头像存成了“高清、全屏年夜头贴(图片)”,那末就只需将这个掏出来的头像贴在背景上就能够了。
高清全屏来电年夜头贴,不就是把年夜头贴在背景上嘛。^^.

以是在剖析全部Phone.apk时,我发明它底本取到一个mPhoto以后,为了便于显现就将它存在CallerInfo.cachedPhoto里了。既云云,那末在原有流程的updatePhotoForCallState()与updateDisplayForPerson()办法中,当它挪用showCachedImage()来显现了图片以后,我们也就只必要把这个图片在背景上“贴”一下就能够了。

而这个背景,就是:CallCard.InCallScreen.mMainFrame

很复杂嘛。

下面的showCachedBackground()汇编代码翻译成java代码就是:

  • publicbooleanshowCachedBackground(CallerInfoparamCallerInfo,CallparamCall)
  • {
  • //德律风是在用形态(来电或呼出或接通)
  • booleanbool=paramCall.getState().isAlive();


  • //paramCallerInfo.isCachedPhotoCurrent无效
  • bool=bool&&(paramCallerInfo!=null)&&paramCallerInfo.isCachedPhotoCurrent;


  • if(bool){
  • DrawablelocalDrawable=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);
  • }
  • }
  • returnbool;
  • }

继承自相应的不可变类比如NSMutableArray继承自NSArray他们都添加了可以改变对象内容的方法比如-(void)addObject:(id)anObject添加对象-(void)removeObject:(id)anObject删除对象上面只是一个大概的总结
第二个灵魂 该用户已被删除
沙发
发表于 2015-1-21 08:52:23 | 只看该作者
看完这个你就可以有多种选择来踏入做应用的阶段
不帅 该用户已被删除
板凳
发表于 2015-1-21 08:52:23 | 只看该作者
近期由于IOS7的发布,所以应用的适配潮可谓是都搞的锣鼓喧天,甚是热闹,因此呢,因适配IOS7而产生的问题也是铺天盖地的卷来,
爱飞 该用户已被删除
地板
发表于 2015-1-25 17:41:24 | 只看该作者
要学会通过各种方法将面前的事情变成自己感兴趣的,那专研起来就不会是无聊和折磨了。
莫相离 该用户已被删除
5#
发表于 2015-2-3 12:15:49 | 只看该作者
自从苹果公司开放iOS SDK以来,大量的国内外的软件开发者将关注的目光聚集在苹果的iOS平台上。由于iPhone和iPad自一出现就给人带来了颠覆性的感觉
兰色精灵 该用户已被删除
6#
发表于 2015-2-7 10:00:04 | 只看该作者
看完这个你就可以有多种选择来踏入做应用的阶段
再见西城 该用户已被删除
7#
发表于 2015-2-8 10:18:55 | 只看该作者
在百度搜索你想要了解的类名(苹果的cocoa和cocoatouch框架的类名很有特点很容易搜到,前缀都是NS or UI),看别人写的博客详解
柔情似水 该用户已被删除
8#
 楼主| 发表于 2015-2-25 09:08:20 | 只看该作者
特别是在校的学生,都存在一个小小的尴尬——虽然学习iOS开发的热情高涨,但由于没有多余的银子购买昂贵的Mac电脑而踟蹰不前。其实,针对初学者,如果想进入iOS开发的天地
乐观 该用户已被删除
9#
发表于 2015-2-27 23:59:14 | 只看该作者
众多研发人员积极参与到iOS平台的开发中来也就不足为奇了。
灵魂腐蚀 该用户已被删除
10#
发表于 2015-3-3 20:31:29 | 只看该作者
同很多iOS开发者一样,我也是通过培训进入到iOS开发这个行业,开始没有打算培训,只准备自己学习一些计算机编程相关的知识,毕业时找一份编程相关工作(本人是信息与计算科学这个专业,是数学系)。
飘灵儿 该用户已被删除
11#
发表于 2015-3-4 11:08:49 | 只看该作者
要学会通过各种方法将面前的事情变成自己感兴趣的,那专研起来就不会是无聊和折磨了。
再现理想 该用户已被删除
12#
发表于 2015-3-4 20:38:40 | 只看该作者
在此,某不才愿将安装成功的Mac OS X系统的vmware虚拟机向有志学习iOS开发的各位学友们免费开放出来,经测试,可以在WindowsXP/Win7系统上完美运行,即便你的机器只有2GB内存。
愤怒的大鸟 该用户已被删除
13#
发表于 2015-3-8 15:04:21 | 只看该作者
这个办法就是在WindowsXP或Win7的电脑上,使用vmware虚拟机来搭建一个真实的Mac OS X环境。
因胸联盟 该用户已被删除
14#
发表于 2015-3-16 02:35:07 | 只看该作者
还有开发工具是用Xcode,是在Mac系统的,你多摸索一下就可以开发简单的应用了,建议你买一本iphone开发秘籍第二版看看,希望可以帮到你,谢谢。
小女巫 该用户已被删除
15#
发表于 2015-3-18 03:44:55 | 只看该作者
看《iPhone 4与iPad开发基础教程》,跟着一步步来
深爱那片海 该用户已被删除
16#
发表于 2015-3-25 11:13:22 | 只看该作者
还有开发工具是用Xcode,是在Mac系统的,你多摸索一下就可以开发简单的应用了,建议你买一本iphone开发秘籍第二版看看,希望可以帮到你,谢谢。
海妖 该用户已被删除
17#
发表于 2015-4-1 23:59:49 | 只看该作者
从C语言入门,因为IOS开发用的是OC语言,是在C基础上的,不过也跟C不是很搭界,你可以直接学习OC语言也可以,
小魔女 该用户已被删除
18#
发表于 2015-4-3 19:47:21 | 只看该作者
培训的时候很痛苦,每天要待12个小时,上午讲课,下午和晚自习解决作业,看文档,学习的时候感觉就是资料太少,而且看着资料也不明所以,非常痛苦,
冷月葬花魂 该用户已被删除
19#
发表于 2015-4-8 22:24:11 | 只看该作者
有办法利用自己手头的电脑立刻开始这个美妙旅程的。
简单生活 该用户已被删除
20#
发表于 2015-4-10 23:28:40 | 只看该作者
iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 23:49

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表