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. python的进阶--爬虫小试

    代理之说 [ python实现代理服务功能实例 ]  --  https://www.jb51.net/article/43266.htm [检测代理是否有效] -- https://blog.csd ...

  2. BZOJ3052 [wc2013] 糖果公园 【树上莫队】

    树上莫队和普通的序列莫队很像,我们把树进行dfs,然后存一个长度为2n的括号序列,就是一个点进去当作左括号,出来当作右括号,然后如果访问从u到v路径,我们可以转化成括号序列的区间,记录x进去的时候编号 ...

  3. loj2480 [CEOI2017]One-Way Streets 边双+树上差分

    边双无法确定 缩完边双就是一棵树 树上差分随意弄一下吧... #include <vector> #include <cstdio> #include <cstring& ...

  4. CodeForces - 1009D Relatively Prime Graph

    题面在这里! 直接暴力找点对就行了,可以证明gcd=1是比较密集的,所以复杂度略大于 O(N log N) #include<bits/stdc++.h> #define ll long ...

  5. BZOJ1509 [NOI2003]逃学的小孩 树型DP

    题目: 分析: 首先明确我们是要求 min(dist[C][A],dist[C][B])+dist[A][B]. 我们把C当成树根,第一我们可以发现min里面取dist[C][A]或者dist[C][ ...

  6. bzoj1502 simpson求面积

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1502 题解: simpson积分求面积,s = (f(a)+f(b)+4*f(c))/6*Δx ...

  7. PAT甲级1045. Favorite Color Stripe

    PAT甲级1045. Favorite Color Stripe 题意: 伊娃正在试图让自己的颜色条纹从一个给定的.她希望通过剪掉那些不必要的部分,将其余的部分缝合在一起,形成她最喜欢的颜色条纹,以保 ...

  8. nodejs 导入导出模块module.exports向外暴露多个模块 require导入模块

    .moudel.exports 导出模块 导出单个模块 // user.js moudel.exports = 函数名或者变量名: //app.js 导入 require('user.js') 当然. ...

  9. OpenCV2马拉松第10圈——直方图反向投影(back project)

    收入囊中 灰度图像的反向投影 彩色图像的反向投影 利用反向投影做object detect 葵花宝典 什么是反向投影?事实上没有那么高大上! 在上一篇博文学到,图像能够获得自己的灰度直方图. 反向投影 ...

  10. Openfire更服务器名称后报Found RSA certificate that is not valid for the server domain的解决方法

    原文:http://blog.sina.com.cn/s/blog_ae5a3d3f0102wdrb.html Openfire更服务器名称的方法: 1.登陆openfire管理页面,在主页面下方选择 ...