仓酷云

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

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

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

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

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

x
关于iOS开发的学习打个比方就像把汽车分解最底层的原料有塑料钢铁再用这些底层的工具造出来发动机座椅最后再加上写螺丝胶水等把汽车就拼起来了iOS基本都是英文的资料(接上去进一步细化上一篇的修正,前六节请拜见:《Android玩乐系列:修正汇编代码撑持原生高清来电年夜头贴(二)》)
7、一些遗留成绩的修正
=======

下面是最简版本,只是为了凸起中心功效的完成,但实践留下的成绩仍是很多的。上面逐一道来。

1)呀。是乐成了呢,不外一会儿就被改返来了。
---------
[修正,2012.09.04。办法名写错的,应当是updateInCallBackground(),而不是updateScreen()]
这并非广泛性的成绩,有些拔号面板是有背景的,有些则是背景通明而间接显现桌面的。关于有背景的拔号面板,Phone.apk一般会在InCallScreen.smali中有一个updateInCallBackground()办法,找到它的几处挪用,正文失落便可。大概爽性把updateInCallBackground()改成空函数就行了。

假如找不到updateInCallBackground()函数,则实验找一个setBackgroundResource()这个办法,看那里重绘了mMainFrame的背景便可。

2)下一次德律风呼进的时分,会残留上一个德律风利用的年夜头贴
---------
是的。这应当在此次德律风停止时清算失落。这很复杂,修正InCallScreen.smali,找到

  • .methodprivatedelayedCleanupAfterDisconnect()V
这个办法。然后找到个中return-void这行代码,往上数几行找个中央拔出以下代码便可:

  • ...


  • ##fixedbyaimingoo
  • ##重置背景
  • const/4v0,0x0
  • iget-objectv1,p0,Lcom/android/phone/InCallScreen;->mMainFrame:Landroid/view/ViewGroup;
  • invoke-virtual{v1,v0},Landroid/view/ViewGroup;->setBackgroundResource(I)V


  • ##这里拜见本遗留成绩第5项有关setPersonInfoStyle()的申明
  • const/4v0,0x1
  • iget-objectv1,p0,Lcom/android/phone/InCallScreen;->mCallCard:Lcom/android/phone/CallCard;
  • invoke-virtual{v1,v0},Lcom/android/phone/CallCard;->setPersonInfoStyle(Z)V
  • ##endfix.
  • :cond_3
  • :goto_0
  • return-void##<<-注重从这行代码往上找


  • ...
3)好象本来的头像仍是会闪一下?
---------
本来的头像是如许的一个取得历程:
-起首入手下手接听或拔打德律风
-拔号程序显现面板,面板中头像地位显现为“无头像”的icon
-异步倡议挪用,从接洽人数据库中读取头像
-当上述异步伐用前往时,更新显现下面的“无头像”icon为真实的头像图片

以是现实上原生的使用在“显现头像”时城市是两步,这是为了更快地绘制出拨号面板以便用户操纵。而们的代码现实上也是依附这个道理,在上述的历程异步失掉“高清年夜头贴”的数据以后,显现在背景上的。

那末总的来讲,现实上头像总会闪一下。而且在异步读取到头像之前,原生界面上就是会显现一个“无头像”的icon。只管这个历程一般很短,多半时分在你抓过去德律风之前就已闪已往了,可是关于那些正盯着德律风看效果的玩实来讲,这仍是不爽的。

基础下去说,能够正文失落一切修正mPhoto的中央。假如需要,保存一些用于在没有年夜头贴的情形下显现原本的mPhoto的代码是能够的。作为一个示例,一个复杂的中央就是修正showCachedImage()。这起首在CallCard.smail中找到showCachedImage(),然后正文失落个中上面的两行:

  • #
  • #不用在失掉头像时更新cardCard中的头像
  • #
  • .methodprivatestaticfinalshowCachedImage(Landroid/widget/ImageView;Lcom/android/internal/telephony/CallerInfo;)Z
  • ...


  • ##iget-objectv0,p1,Lcom/android/internal/telephony/CallerInfo;->cachedPhoto:Landroid/graphics/drawable/Drawable;
  • ##
  • ##invoke-static{p0,v0},Lcom/android/phone/CallCard;->showImage(Landroid/widget/ImageView;Landroid/graphics/drawable/Drawable;)V
  • ...
这里间接修正showCachedImage(),是由于Phone.apk只为mPhoto成员挪用showCachedImage(),别的的会间接挪用showImage()。

4)界面上年夜头贴显现不全,被一些元素遮住了。如果它们有通明度就行了。
---------
有些时分,界面上的元素是经由过程贴图来绘制的,也就是在资本文件中,它的背景是一张图片。关于指定色彩的背景,比方#xxRRGGBB,我们能够在资本文件中经由过程指定xx值来使它通明化。但假如背景是图,那末在较低的android版本的资本文件中又不撑持alpha属性,那末就只能在源代码中经由过程setAlpha()来使之通明了。

前面这类情形(也包含后面这类设置color代码的情形)能够在CallCard.smali与InCallTouchUi.smali中增加代码来完成,某些情形下,你也大概要改到InCallScreen.smali中的代码的。但总的来讲,都与详细的Phone.apk有关。上面是我在修正Mokee的Phone.apk中利用的代码。注重,这些代码都应当写在onFinishInflate()办法里,这里恰好初始化完界面,并将界面元素联系关系到Java对象的成员上。

  • #---------
  • #在完成初始化后,处置一些背景
  • #-CallCard.smali
  • #---------
  • .methodprotectedonFinishInflate()V
  • ……
  • iput-objectv0,p0,Lcom/android/phone/CallCard;->mPrimaryCallInfo:Landroid/view/ViewGroup;


  • ##fixedbyaimingoo
  • ##forcallCardPersonInfo.clild(0)
  • constv0,0x7f070020
  • invoke-virtual{p0,v0},Lcom/android/phone/CallCard;->findViewById(I)Landroid/view/View;
  • move-result-objectv0
  • check-castv0,Landroid/view/ViewGroup;


  • constv1,0x0
  • invoke-virtual{v0,v1},Landroid/view/ViewGroup;->getChildAt(I)Landroid/view/View;
  • move-result-objectv0


  • invoke-virtual{v0},Landroid/view/View;->getBackground()Landroid/graphics/drawable/Drawable;
  • move-result-objectv0


  • const/16v1,0x40
  • invoke-virtual{v0,v1},Landroid/graphics/drawable/Drawable;->setAlpha(I)V


  • ##forphoneMsgContainer
  • constv0,0x7f070028
  • invoke-virtual{p0,v0},Lcom/android/phone/CallCard;->findViewById(I)Landroid/view/View;
  • move-result-objectv0


  • invoke-virtual{v0},Landroid/view/View;->getBackground()Landroid/graphics/drawable/Drawable;
  • move-result-objectv0
  • invoke-virtual{v0,v1},Landroid/graphics/drawable/Drawable;->setAlpha(I)V
  • ##endfix.




  • #---------
  • #在完成初始化后,处置一些背景
  • #-InCallTouchUi.smali
  • #---------
  • .methodprotectedonFinishInflate()V
  • ……
  • iput-objectv1,p0,Lcom/android/phone/InCallTouchUi;->stop_layout:Landroid/widget/LinearLayout;


  • ##fixedbyaimingoo
  • ##forbottomButtons@mInCallControls
  • iget-objectv1,p0,Lcom/android/phone/InCallTouchUi;->mInCallControls:Landroid/view/View;
  • constv2,0x7f070074
  • invoke-virtual{v1,v2},Landroid/view/View;->findViewById(I)Landroid/view/View;
  • move-result-objectv0


  • const/16v1,0x40
  • invoke-virtual{v0},Landroid/view/View;->getBackground()Landroid/graphics/drawable/Drawable;
  • move-result-objectv0
  • invoke-virtual{v0,v1},Landroid/graphics/drawable/Drawable;->setAlpha(I)V




  • ##forendButton@mEndButton
  • iget-objectv1,p0,Lcom/android/phone/InCallTouchUi;->mEndButton:Landroid/widget/Button;
  • invoke-virtual{v1},Landroid/widget/Button;->getBackground()Landroid/graphics/drawable/Drawable;
  • move-result-objectv0
  • const/16v1,0x60
  • invoke-virtual{v0,v1},Landroid/graphics/drawable/Drawable;->setAlpha(I)V
  • ##endfix.

    5)下面谁人mPhoto切实其实不显现了,但好象还占着地位,仍是很丢脸。
    【话说,真的有需要经由过程汇编代码来调款式哇?GG,你间接改资本文件欠好哇?】
    ---------
    假如我们真的要完成:
    -有年夜头贴时,不显现小小的头像mPhoto
    -没有年夜头贴时,显现一下“无头像”icon,大概
    -由于头像图片不敷年夜,以是某些时分仍是显现图片到头像mPhoto两头往更悦目

    现实上,后面showCachedBackground()的完成代码中,还的确反省了头像图片的巨细,当它长宽之一小于240px,我们就不作为全屏年夜头贴来显现了。以是,我们切实其实仍是要将mPhoto处置成:有年夜头贴时埋没,不然在需要时还得显现。

    这个,改资本文件还真不成。还得动代码。

    下面我们在showCachedBackground()中留下了一个setPersonInfoStyle()没做申明。谁人办法,实在就是留给这里用的。传进参数toDefault。当toDefault为false时,就显现我们定制的年夜头贴界面,不然就切回原生界面(就是小头像)来显现。这个办法就与详细的Phone.apk有关了,由于每一个Phone.apk的来电面板界面都纷歧样,显现哪些,不显现哪些,实在都要靠程序员剖析着资本文件一点点来改。只管贫苦,但效果也的确惊人。上面是我为Lezo界面写的一个setPersonInfoStyle()办法:

  • .methodpublicsetPersonInfoStyle(Z)V
  • .locals2
  • .parameter"toDefault"


  • if-nezp1,:cond_0


  • ##42.0F
  • const/high16v0,0x4228


  • ##CallCard.pA==mName
  • iget-objectv1,p0,Lcom/android/phone/CallCard;->pA:Landroid/widget/TextView;
  • invoke-virtual{v1,v0},Landroid/widget/TextView;->setTextSize(F)V


  • ##28.0F
  • const/high16v0,0x41b8


  • ##CallCard.pC==mPhoneNumber
  • iget-objectv1,p0,Lcom/android/phone/CallCard;->pC:Landroid/widget/TextView;
  • invoke-virtual{v1,v0},Landroid/widget/TextView;->setTextSize(F)V


  • ##CallCard.pB==mLocation
  • iget-objectv1,p0,Lcom/android/phone/CallCard;->pB:Landroid/widget/TextView;
  • invoke-virtual{v1,v0},Landroid/widget/TextView;->setTextSize(F)V


  • ##bacground
  • constv0,0x80CCCCCC
  • invoke-virtual{v1},Landroid/widget/TextView;->getParent()Landroid/view/ViewParent;
  • move-result-objectv1
  • check-castv1,Landroid/view/ViewGroup;
  • invoke-virtual{v1,v0},Landroid/view/ViewGroup;->setBackgroundColor(I)V


  • :goto_0
  • return-void


  • :cond_0
  • ##25.0F
  • const/high16v0,0x41c8


  • ##CallCard.pA==mName
  • iget-objectv1,p0,Lcom/android/phone/CallCard;->pA:Landroid/widget/TextView;
  • invoke-virtual{v1,v0},Landroid/widget/TextView;->setTextSize(F)V


  • ##18.0F
  • const/high16v0,0x4190


  • ##CallCard.pC==mPhoneNumber
  • iget-objectv1,p0,Lcom/android/phone/CallCard;->pC:Landroid/widget/TextView;
  • invoke-virtual{v1,v0},Landroid/widget/TextView;->setTextSize(F)V


  • ##CallCard.pB==mLocation
  • iget-objectv1,p0,Lcom/android/phone/CallCard;->pB:Landroid/widget/TextView;
  • invoke-virtual{v1,v0},Landroid/widget/TextView;->setTextSize(F)V


  • ##bacground
  • constv0,0x0
  • invoke-virtual{v1},Landroid/widget/TextView;->getParent()Landroid/view/ViewParent;
  • move-result-objectv1
  • check-castv1,Landroid/view/ViewGroup;
  • invoke-virtual{v1,v0},Landroid/view/ViewGroup;->setBackgroundResource(I)V


  • goto:goto_0
  • .endmethod
这个setPersonInfoStyle()函数会在showCachedBackground()中挪用并传进false值,别的也应当在InCallScreen.smali的delayedCleanupAfterDisconnect()办法中挪用。后一种情形应传进true值,以使得“下一次”来电面板将以缺省情势翻开。


6)全屏!!要真的全屏!!!
---------
实在年夜多半拨号面板是其实不撑持“全屏”的,它一般会留下形态栏。既然我们这里说的是“全屏来电年夜头贴”,那末就加高低面这段代码好了:

  • #---------
  • #使拔号面板全屏
  • #-inInCallScreen.smali
  • #-修正代码必需位于InCallScreen;->setContentView()挪用之前!!!
  • #---------
  • .methodprotectedonCreate(Landroid/os/Bundle;)V
  • ……
  • ##fixedbyaimingoo.
  • invoke-virtual{p0},Lcom/android/phone/InCallScreen;->getWindow()Landroid/view/Window;
  • move-result-objectv2
  • const/16v1,0x400
  • invoke-virtual{v2,v1,v1},Landroid/view/Window;->setFlags(II)V
  • ##fixend.


  • ……
  • constv1,0x7f030012
  • invoke-virtual{p0,v1},Lcom/android/phone/InCallScreen;->setContentView(I)V

    7)好象你忘了说HDContactPhotos怎样改了!
    ---------
    嗯嗯。是的是的,欠好意义。补过。


    实在很复杂。反编译它,然后找到
    smalicomjgarrisonhdcontactsNewEntry.smali


    这个文件。将上面的代码正文失落,就能够了:

  • ##---------
  • ##正文失落上面的代码,使翻开图片拔取时显现一个“自在的”截图框
  • ##-.linexxx如许的代码大概与详细的反编译有关,不用在乎。
  • ##---------
  • ##.line406
  • ##const-stringv12,"outputX"
  • ##
  • ##const/16v13,0x100
  • ##
  • ##invoke-virtual{v8,v12,v13},Landroid/content/Intent;->putExtra(Ljava/lang/String;I)Landroid/content/Intent;
  • ##
  • ##.line407
  • ##const-stringv12,"outputY"
  • ##
  • ##const/16v13,0x100
  • ##
  • ##invoke-virtual{v8,v12,v13},Landroid/content/Intent;->putExtra(Ljava/lang/String;I)Landroid/content/Intent;
  • ##
  • ##.line408
  • ##const-stringv12,"aspectX"
  • ##
  • ##const/4v13,0x1
  • ##
  • ##invoke-virtual{v8,v12,v13},Landroid/content/Intent;->putExtra(Ljava/lang/String;I)Landroid/content/Intent;
  • ##
  • ##.line409
  • ##const-stringv12,"aspectY"
  • ##
  • ##const/4v13,0x1
  • ##
  • ##invoke-virtual{v8,v12,v13},Landroid/content/Intent;->putExtra(Ljava/lang/String;I)Landroid/content/Intent;
然后重编译它,如许在用它设置年夜头贴时,我们能够自在拔取图片巨细。固然,为了失掉“恰好是一个全屏巨细”的年夜头贴,我们也能够借助一下工具。这里激烈保举“快图扫瞄”,它在截取时能够按巨细(像素数)和长宽比来设置截取框。假如你按巨细来设置,好比480x800的屏幕巨细,那末不管你截选图片多年夜,终极城市等比缩放到这个巨细——相称好用!

n)别的之别的
---------
!夸大!!!

1:永久记着:拔出代码的时分,要确认你在利用着符合的存放器!

2:分歧的Phone.apk是纷歧样的,下面的代码次要基于CyanogenMod及其衍生版的ROM,大抵在它们之间都是能够通用的。但要注重细节上的差别,特别(再次夸大)存放器在反汇编代码中是大概分歧的!

3:十分多的ROM衍生自CyanogenMod,包含Lewa、Lezo、DianxinOS、Mokee、Shendu、Norma、Joyos,和部分Miui的定制版。

4:分歧版本ROM中的Phone.apk,多半都是不克不及换在别的ROM顶用的。次要的缘故原由之一,是Phone.apk依附framework-res.apk中的资本来完成了锁屏形态下的接听面板(TouchUi),而不必ROM的framework-res差别较年夜。别的,也多是它们用到的TelephonyProvider.apk版本纷歧致,尝尝换个看,尝尝手气呵。

5:必定要用platform.*的两个key来署名Phone.apk,它请求必需是这个权限的署名。

6:没需要往实验改原厂的Phone.apk,比方sesen原生界面的。由于你拿不到他们公有的platformkeys。因而你签不了名,因而你改了也放不到原生ROM中往。用到其余ROM?你忘了,framework-res还纷歧样呢。

7:写程序嘛,不外是汇编嘛,不怕不怕啦!

很简单OBJCAVFoundation---播放视频相关的库最近正在学习这些算是学iOS开发的一些方法
兰色精灵 该用户已被删除
沙发
发表于 2015-1-21 08:52:15 | 只看该作者
众多研发人员积极参与到iOS平台的开发中来也就不足为奇了。
山那边是海 该用户已被删除
板凳
发表于 2015-1-23 21:47:02 | 只看该作者
要学会通过各种方法将面前的事情变成自己感兴趣的,那专研起来就不会是无聊和折磨了。
简单生活 该用户已被删除
地板
发表于 2015-1-30 07:33:54 | 只看该作者
在此,某不才愿将安装成功的Mac OS X系统的vmware虚拟机向有志学习iOS开发的各位学友们免费开放出来,经测试,可以在WindowsXP/Win7系统上完美运行,即便你的机器只有2GB内存。
莫相离 该用户已被删除
5#
发表于 2015-2-6 08:31:59 | 只看该作者
自从苹果公司开放iOS SDK以来,大量的国内外的软件开发者将关注的目光聚集在苹果的iOS平台上。由于iPhone和iPad自一出现就给人带来了颠覆性的感觉
透明 该用户已被删除
6#
发表于 2015-2-15 20:28:27 | 只看该作者
看《iPhone 4与iPad开发基础教程》,跟着一步步来
小魔女 该用户已被删除
7#
发表于 2015-2-27 08:26:42 | 只看该作者
特别是在校的学生,都存在一个小小的尴尬——虽然学习iOS开发的热情高涨,但由于没有多余的银子购买昂贵的Mac电脑而踟蹰不前。其实,针对初学者,如果想进入iOS开发的天地
若相依 该用户已被删除
8#
发表于 2015-3-12 11:23:49 | 只看该作者
这个办法就是在WindowsXP或Win7的电脑上,使用vmware虚拟机来搭建一个真实的Mac OS X环境。
金色的骷髅 该用户已被删除
9#
发表于 2015-3-19 21:19:10 | 只看该作者
众多研发人员积极参与到iOS平台的开发中来也就不足为奇了。
爱飞 该用户已被删除
10#
发表于 2015-3-22 21:19:53 | 只看该作者
培训时可以选择安卓,iOS,Java,因为实习的时候我选了安卓,当时实习时间只有三周,学的晕头转向,而java我也没学过,iOS的基础是C语言,这个大学里还是学过的,于是选择了iOS。
愤怒的大鸟 该用户已被删除
11#
发表于 2015-3-28 22:05:48 | 只看该作者
培训的时候很痛苦,每天要待12个小时,上午讲课,下午和晚自习解决作业,看文档,学习的时候感觉就是资料太少,而且看着资料也不明所以,非常痛苦,
因胸联盟 该用户已被删除
12#
发表于 2015-3-29 14:11:57 | 只看该作者
到大三时,学院与我去培训的机构成立了实习基地,并让我们寒假去实习了一段时间,感觉还不错,于是在大四的时候去培训了
13#
发表于 2015-3-31 07:51:03 | 只看该作者
iPhone文件系统:创建、重命名以及删除文件,NSFileManager中包含了用来查询单词库目录、创建、重命名、删除目录以及获取/设置文件属性的方法(可读性,可编写性等等)。
精灵巫婆 该用户已被删除
14#
 楼主| 发表于 2015-3-31 20:57:17 | 只看该作者
近期由于IOS7的发布,所以应用的适配潮可谓是都搞的锣鼓喧天,甚是热闹,因此呢,因适配IOS7而产生的问题也是铺天盖地的卷来,
第二个灵魂 该用户已被删除
15#
发表于 2015-4-21 17:15:06 | 只看该作者
在百度搜索你想要了解的类名(苹果的cocoa和cocoatouch框架的类名很有特点很容易搜到,前缀都是NS or UI),看别人写的博客详解
admin 该用户已被删除
16#
发表于 2015-4-26 11:20:12 | 只看该作者
以上可以同时进行,学习过程中尽量不要纠结细节和底层,要知道ios是封闭的、OC是高级语言,我们不可能过多地去了解它的原理,至少在新手阶段没有必要。用迭代的方式更新你的知识,而不是死抠一个知识点。
乐观 该用户已被删除
17#
发表于 2015-5-1 18:10:42 | 只看该作者
以上可以同时进行,学习过程中尽量不要纠结细节和底层,要知道ios是封闭的、OC是高级语言,我们不可能过多地去了解它的原理,至少在新手阶段没有必要。用迭代的方式更新你的知识,而不是死抠一个知识点。
蒙在股里 该用户已被删除
18#
发表于 2015-6-6 18:48:24 | 只看该作者
因为我们老师也是自学的,给我们讲课说的最多的就是百度,谷歌,查文档。
冷月葬花魂 该用户已被删除
19#
发表于 2015-6-12 00:37:31 | 只看该作者
每个行业都一样,想要一天学有所成是不可能的,一定要做好努力的准备,做ios不是简单的学会oc语言。不怕多走弯路,就怕不肯动手。
飘飘悠悠 该用户已被删除
20#
发表于 2015-6-25 22:24:15 | 只看该作者
好处就是运行速度会变快,ios6针对系统的优化进一步加强了,很多网友测试ios6,第一感觉就是速度快,而且ios69会有一些新功能,新浪微博,facetime支持3G网等等。。弊端就是,现在的ios6只能算是正式版本的第一个版本,bug很多,不少人刷完ios6都出现了很多毛病,开不开机,缺少图标等等。。最好现在不要升级,等官网放出下一个版本的时候,再选择升级。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-22 19:41

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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