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