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. Codeforces Round #346 (Div. 2) B. Qualifying Contest 水题

    B. Qualifying Contest 题目连接: http://www.codeforces.com/contest/659/problem/B Description Very soon Be ...

  2. python相对包导入报“Attempted relative import in non-package”错误

    文章是从stackoverflow翻译过来的,原文地址:Relative imports for the billionth time 本文要在原理上解决  python当中相对包导入出现的问题. 问 ...

  3. Android Studio安装后提示No JVM installation found解决办法

    Android Studio安装后提示No JVM installation found解决办法 问题描述:Android Studio安装完毕,打开时出现提示"No JVM install ...

  4. (转)Ext.Button点击事件的三种写法

    转自:http://maidini.blog.163.com/blog/static/377627042008111061844345/ ExtJs的写法太灵活了,现在收集了关于Button点击事件的 ...

  5. JLink Support for the Nuvoton NUC1xx devices

    http://forum.segger.com/index.php?page=Thread&threadID=1441 Friday, April 19th 2013, 7:25pm Hi M ...

  6. Spring EL运算符实例

    Spring EL支持大多数标准的数学,逻辑和关系运算符. 例如, 关系运算符 – 等于 (==, eq), 不等于 (!=, ne), 小于 (<, lt), 小于或等于 (<= , l ...

  7. cadence学习(1)常规封装的建立

    1.建立焊盘. (1)首先要获得datasheet(或可用pcb matrix ipc-7531标准的可查询封装软件)中元器件的封装信息. (2)建立.pad文件.打开PCB Editor Utili ...

  8. mysql localhost登录和tcp/ip登录 strace

    http://blog.itpub.net/15480802/viewspace-1755100/

  9. Jquery实战——横纵向的菜单

    横纵向的菜单效果,点击纵向菜单显示其子菜单.鼠标指向横菜单的时候.显示其子菜单,鼠标离开,子菜单隐藏. HTML代码: <span style="font-size:18px;&quo ...

  10. 解决 Operation must use an updateable query

    在asp.net 开发环境下,用jet 4.0连接access数据库, 有时会产生Operation must use an updateable query,这是由于相关用户mdb文件没有Modif ...