仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2182|回复: 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-3-31 20:57:17 | 显示全部楼层
近期由于IOS7的发布,所以应用的适配潮可谓是都搞的锣鼓喧天,甚是热闹,因此呢,因适配IOS7而产生的问题也是铺天盖地的卷来,
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-17 00:29

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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