PDF版本号:http://pan.baidu.com/s/1eQ8DVdo

结论:


同样的代码。使用不同版本号的SDK来编译。会影响MachO头中的值,
从而使程序表现出不同的外观。

代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
UIScreen *mainScreen = [UIScreen mainScreen];
CGRect frm = [mainScreen bounds];
UIWindow *win = [[UIWindow alloc] initWithFrame:frm];
win.backgroundColor = [UIColor blueColor];
self.window = win;
[win release];
[self.window makeKeyAndVisible];
return YES;
}

问题:

如上的代码很easy,没有不论什么功能,
分别使用 xcode v4.6.3 与 v5.0.2 编译。
然后安装到iOS8的设备上,表现却不同,
主要就是iOS6与iOS7之间关于状态条的区别。例如以下图:
__________

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvUHJvdGVhcw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

代码都是一样的。仅仅是使用了不同的SDK进行编译,
区别详细在哪里?

说明:

xcode版本号:4.6.3 VS 5.0.2
设备:iPhone 5s,iOS 8.0
可运行文件名称:
APIDiff-SDK61表示使用iOS SDK 6.1 编译出的可运行文件
APIDiff-SDK70表示使用iOS SDK 7.0编译出的可运行文件
IPA文件名称:
APIDiff-SDK61.ipa表示iOS SDK 6.1编译出的安装包
APIDiff-SDK70.ipa表示iOS SDK 7.0编译出的安装包

分析:



分析一:确认是可运行程序引起

验证方法:

用APIDiff-SDK70.ipa中的可运行程序替换APIDiff-SDK61.ipa中的可运行程序,

然后使用codesign命令又一次签名,

打包。安装到手机上后发现状态条是透明的。

说明区别确实在可运行程序中。

又一次签名方法:

codesign -f -s "证书名" --resource-rules Payload/*.app/ResourceRules.plist Payload/*.app




分析二:比較二进制区别


既然在可运行文件里。
首先想到的是使用二进制比較工具来看看二者的区别,
结果例如以下图:



能够看到区别太大,这样比較没什么意义,
这条路不可行。


分析三:比較代码区别


既然比較二进制没什么意义,
那我们就比較下反汇编代码,
看看是不是编译器做了什么手脚,



能够看到二者的代码差点儿一样,
详细的一点区别,
也是由不同版本号的编译器造成的,
逻辑是一样的。因此不是代码引起的程序外观不同。
另外,代码里没有读什么全局变量,
说明不是由于UIKit中有什么默认值被编译到程序中。
从而引起状态条的外观不同。


分析四:比較UIKit版本对程序的影响


既然代码没有区别,

我们首先会想到是不是因为UIKit版本号不同而引起的程序外观不同。

尽管程序是动态链接的UIKit,

而且设备上仅仅有一个版本号的UIKit库,

可是我们还是要验证下。

首先确定二者的区别。例如以下图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvUHJvdGVhcw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">



能够看到二者的版本确实有区别,
可是兼容版本号都是1.0。
理论上讲不是由于这个造成程序区别。
理论是理论,我们如今正在使用排除法确定问题原因,
还是要实打实的验证。

验证方法:将APIDiff-SDK61中的UIKit版本改成2903.23.0。
改动方法:这个值在二进制文件里的偏移为:0x6EC,
须要注意下小端问题。
改动后。又一次签名。打包安装到手机上,
发现状态条没有发生变化。
因此原因不是UIKit版本的区别。


分析五:使用MachOView逐项比較


走到这里。多少有点儿黔驴技穷了。

问题就在那里而我们却找不到原因。

那就上最原始的工具:体力劳动,使用MachOView一项一项的对照。

从"__LINKEDIT"

--->"LC_DYLD_INFO_ONLY"

--->"LC_LOAD_DYLINKER"

--->"LC_VERSION_MIN_IPHONEOS"

在"LC_VERSION_MIN_IPHONEOS"中发现了一个保留值的区别:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvUHJvdGVhcw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">


感觉有可能这就是问题的解决办法。
进行验证:改动APIDiff-SDK61。偏移地址0x69C,
将值改为00070000,
又一次签名,打包安装到手机,
发现状态条变成透明了。问题就在这里。


TODO:这样的区别又是怎样影响了程序的外观


这样的区别又是怎样影响了程序的外观,可能的原由于:

1、UIKit中会读这个属性。

可能性极小。UIKit仅仅是一个库,

而如上的区别会首先被载入器获得,

离UIKit还非常远。

2、SpringBoard及其相关服务。

可能性大。

①:SpringBoard几其服务本身就有画图的职责;

②:点击桌面上的图标,程序是由SpringBoard启动的。

只是不打算继续验证了。到这里已经满足了我的探知欲,欲望更强的兄弟能够继续分析。^_^

探寻不同版本号的SDK对iOS程序的影响的更多相关文章

  1. 使用Olami SDK 语音控制一个支持HomeKit的智能家居的iOS程序

    前言 HomeKit是苹果发布的智能家居平台.通过HomeKit组件,用户可以通过iphone.iPad和ipod Touch来控制智能灯泡,风扇.空调等支持HomeKit的智能家居,尤其是可以通过S ...

  2. IOS程序启动原理

    1.Info.plist 建立一个工程后,会在Supporting files文件夹下看到一个“工程名-Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 常见属性(红色 ...

  3. 写给iOS程序员的命令行使用秘籍

    http://www.jianshu.com/p/44d3b8f713f2 Mac OS是Unix系统的分支,有着强大的命令行功能.很多事情在命令行下处理会事半功倍,所以我就iOS程序员可能会用到的功 ...

  4. ios程序开发杂记

    ios程序开发杂记 一.程序构建 与一般的程序构建无太大区别,都是源文件编译链接这一套,通常是在mac上做交叉编译,也就是利用xcode里带的ios编译工具集去生成arm架构的ios程序(或是x86的 ...

  5. Info.plist和pch文件的作用,UIApplication,iOS程序的启动过程,AppDelegate 方法解释,UIWindow,生命周期方法

    Info.plist常见的设置 建立一个工程后,会在Supporting files文件夹下看到一个“工程名-Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 注:在旧 ...

  6. 移动端影像解决方案Adobe Creative SDK for ios

    移动端影像解决方案Adobe Creative SDK for ios 2015-12-20 分类:整理 阅读(390) 评论(0)  老牌影像界泰斗不甘落寞,正式推出了Adobe Creative ...

  7. iOS基础 - iOS程序启动原理

    一.UIApplicationMain 在main.m的main函数中执行了UIApplicationMain这个方法,这是ios程序的入口点 int UIApplicationMain(int ar ...

  8. 使用OLAMISDK实现一个语音输入数字进行24点计算的iOS程序

    前言 在目前的软件应用中,输入方式还是以文字输入方式为主,但是语音输入的方式目前应用的越来越广泛.这是一个利用 Olami SDK 编写的一个24点iOS程序,是通过语音进行输入. Olami SDK ...

  9. iOS程序自动检测更新的实现

      本文转载至 http://blog.csdn.net/davidsph/article/details/8931718 App Store自动更新itunes     之前项目需要用到app自动更 ...

随机推荐

  1. 【BZOJ 1221】 1221: [HNOI2001] 软件开发 (最小费用流)

    1221: [HNOI2001] 软件开发 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1581  Solved: 891 Description ...

  2. 【贪心】【高精度】zoj3987 Numbers

    题意:给你一个数n,让你找m个非负整数,使得它们的和为n,并且按位或起来以后的值最小化.输出这个值. 从高位到低位枚举最终结果,假设当前是第i位,如果m*(2^i-1)<n的话,那么说明这一位如 ...

  3. [转]Android:Activity+Fragment及它们之间的数据交换(一)

    2014-05-18         来源:Android:Activity+Fragment及它们之间的数据交换(一)   简介: 为什么要用Fragment?使用Fragment可以在一个Acti ...

  4. Google Code Jam Africa 2010 Qualification Round Problem B. Reverse Words

    Google Code Jam Africa 2010 Qualification Round Problem B. Reverse Words https://code.google.com/cod ...

  5. 一次经典的tcp三次握手

    TCP报头 在三次握手中使用的字段: 32位序列号 seq:表示的是本次报文发送的数据的第一个字节的序号. 32位确认号:ack  表示期望下一次应该接受到的报文的第一个字节的序号,若ack = N则 ...

  6. Low-cost ADC using only Digital I/O

    http://letsmakerobots.com/node/13843 Reading A Sensor With Higher Accuracy – RC Timing Method RC Tim ...

  7. springmvc 配置和spring配置?

    最近在接触mybatis,之间使用springmvc时,配置文件一直是,web.xml+XX-servlet.xml 的配置(xx为web.xml中servlet name名称).为了整合mybati ...

  8. JS学习笔记-事件绑定

    一.传统事件模型 传统事件模型中存在局限性. 内联模型以HTML标签属性的形式使用,与HTML混写.这样的方式无疑造成了改动以及扩展的问题,已经非常少使用了. 脚本模型是将事件处理函数写到js文件里, ...

  9. SpringSecurity3整合CAS实现单点登录

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  10. setTimeOut传參数

    function blink(e_Id, second) {var soccer = document.getElementById(e_Id); soccer.style.visibility = ...