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. Linux check whether hyperthreading is enabled or not

    There parameters need to be obained: no. of physical CPU; no. of cores on each CPU; no. of all threa ...

  2. redis_NoSql入门概述

    一.为什么要使用Nosql 今天我们可以通过第三方平台(如:google,facebook)可以很容易的访问和抓取数据.用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加. ...

  3. Hibernate 条件-分页查询

    这里我们继续跟着上一次的节奏继续学习Hibernate的查询. 1.条件查询一(占位符) 按照占位符的方式进行条件查询,这里query有一个setInteger(arg1, arg2)方法,其中第一个 ...

  4. 【hihoCoder 1513】小Hi的烦恼

    http://hihocoder.com/problemset/problem/1513 h[j][i]记录第j个学科排名小于等于i的状态,bitset压位就可以了. #include<bits ...

  5. 升级到php7和安装拓展(mac centos)

    Mac升级到php7 使用homebrew安装php7 brew update #更新源 brew search php #查找源中的php,发现有php7.1版本,安装最新的php7.1 brew ...

  6. ajax请求数据填充表格———使用art-template模板提高效率

    一.为什么要用art-template模板 在实习的一次项目中,因为需求中展示表格的字段有很多个,后端返回的也是json数据,这时候如果还是使用之前的字符串拼接,这样会开发得比较慢,而且容易出错,而且 ...

  7. 10.十进制转m进制

    时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description 将十进制数n转换成m进制数 m<=16 n<=1 ...

  8. Boost汉字匹配 -- 宽字符

      原文链接:http://blog.csdn.net/sptoor/article/details/4930069 思路:汉字匹配,把字符都转换成宽字符,然后再匹配. 需要用到以下和宽字符有关的类: ...

  9. Codeforces Round #300 C. Tourist's Notes 水题

    C. Tourist's Notes Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/538/pr ...

  10. List与ArrayList的区别

    http://www.cnblogs.com/aisiteru/articles/1151874.html List是一个接口,而ListArray是一个类. ListArray继承并实现了List. ...