文档章节

iOS批量自动打包和部署(Ⅱ):自动打包

hejunbinlan
 hejunbinlan
发布于 2016/07/29 17:46
字数 2278
阅读 121
收藏 0

网上有大把的文章讲了自动打包,其实无非就是那几条命令,但是我觉得有必要继续了解一下一个app包(即应用)的组成和app可执行文件的构建过程。这个里面非常复杂,也参考了一些文章,仅将自己了解的大概梳理出来备忘。

应用的构建过程和组成

想象一下平时的打包过程,在Xcode中选择对应的appid,bundleid,还要选择正确的配置文件(provisioning profile),然后点击run,我们看到Xcode上面有内容在不断的更新,正如猜想的,更新的内容实际就是app包编译的过程。

这个过程大概经过了:配置(编译器确定当前系统环境)-> 确定标准库和头文件的位置->确定依赖关系->头文件预编译(precompilation)->预处理(preprocessing)->编译(compilation)->连接(Linking)->打包,大致步骤是这些,但其中还有一些过程是没有讲的。

对于iOS的包来讲,在构建完成之后还会自动调用codesign命令进行签名,这个时候我们之前选择的bundleid啊,配置文件啊等等就排上用场了。经过签名后的应用是个相对来讲安全的应用,通过签名确保了包的来源合法,也能确保包的内容是否被修改过(理论知识上篇已讲过)。最后的包的本质实际上是一个Mach-O格式的二进制可执行文件(签名的数据就在这个二进制文件中)和一些资源文件。

Mach-O可执行文件

Mach是一种操作系统内核。它的大致历史是:Mach内核被NeXT公司的NeXTSTEP操作系统使用,NeXT是乔布斯苹果被赶出苹果后创建的公司。1996年,乔布斯将NeXTSTEP带回苹果,成为了OS X的内核基础。在Mach上,一种可执行的文件格是就是Mach-O(Mach Object file format)。iOS是从OS X演变而来,所以同样支持Mach-O格式的可执行文件。

搞iOS的肯定知道ipa包,它实际上就是一个zip压缩包,可以用mac自带的归档解压工具进行解压。解压之后会有一个Payload文件夹,其中有个XXX.app这样的.app文件,它实际上是文件夹,它里面除了有个各种资源、图片等,还有个和包名相同的文件——这个就是二进制可执行文件。可以用file命令查看文件类型,下图是微信包的截图:
wechat file

从上面看是支持arm7和arm64两种处理器架构的通用程序包,里面的格式是Mach-O。将微信的可执行文件WeChat用Sublime打开,二进制开始部分如下:

wechat file

开头的4个字节是cafebabe,这被称为“魔数”,反映文件的类型。查了下相关文章,OS X上还有如下几个标识:

cafebabe
feedface
feadfacf
还有一个格式,就是以#!开头的脚本

cafebabe就是跨处理器架构的通用格式,feedface和feedfacf则分别是某一处理器架构下的Mach-O格式,脚本的就很常见了,比如#!/bin/bash开头的shell脚本。

Mach-O可执行文件包含头部信息和加载命令。才疏学浅,这部分也没有深入了解,本篇也无法继续深入讲这块了。

其他资源文件

解压后的包中除了可执行文件还有其他资源文件,图片啊,plist啊等等。苹果对安全确实重视,这些资源文件其实大多数也是需要被设置签名的,可以见到的是包中还有一个_CodeSignature文件夹,这个文件夹中的CodeResources文件中存储了被签名的程序包中所有需要被签名文件的签名。更详细的介绍参见《代码签名探析》,从这些细节不难看出苹果对于安全的重视。

自动打包

苹果自带的xcodebuild命令行工具就可以打包,但是这里我更加推荐facebook出品的xctool,xctool的初衷就是要替代苹果的xcodebuild,它们的命令参数都是一样的,相比较xcodebuild,xctool有以下特点:

1.相比较xcodebuild输出的log杂乱,xctool更有结构
2.xctool有人性化的颜色输出
3.facebook声称xctool更快,据说能快2、3倍
4.完全用Ojbective-C实现

当然xctool只支持Xcode6及以上,并且Xcode Command Line Tools安装好。

xctool

xctool是可以使用homebrew安装的,或者下源码然后运行 xctool.sh脚本,homebrew安装命令如下:

brew install xctool

实战

接下来是实战篇,按照我的设想,如果想要实现自动化,需要攻克几个点:

1.自动打包
2.重新签名
3.分发部署

其中,自动打包是基础,打包完之后可以根据母包重新签名生成相似的包,生成的包可以自动部署。只要攻克这三个点就能实现全自动化,当然就需要写脚本了,带着这个性质我参考了一些文章并且在网上找到了一些脚本。最终,验证了这些东西都是实际可行的。但,下面的实战用到的脚本,一部分是网上找的,一部分是同事写的,当时虽然逐个研究了但是却没有精力在这个上,这部分的工作最后是同事做的。

为了讲的更清楚,新建了一个项目PackageExample(Demo已上传到这里),并且使用了CocoaPods(实验起见仅引用了AFNetworking),项目的证书是dev状态的。PackageExample项目在我机器上的路径和目录如下截图:

PackageExample同目录的还有PackageShell,里面的buildipa.sh为编译脚本,由于最后的目标是要做成可以随意配置的,所以还有一个PackageConfig文件夹,里面有配置文件packageExample.mobileprovisionpackageExample.plist,配置文件主要用来签名,plist文件的内容为可配置的,例如里面有app_Prefix、app_Name、app_ID等信息。Package文件夹为打的包的存放的地方。

完整的编译脚本如下:

#!/bin/sh

#从plist文件中读取ipa包名和配置文件名
profile_Name=`/usr/libexec/PlistBuddy -c "print profile_Name" ./PackageConfig/packageExample.plist`
ipa_Name=`/usr/libexec/PlistBuddy -c "print app_Name" ./PackageConfig/packageExample.plist`

#进入工程目录
cd ../PackageExample
echo "go to packageExample workspace path"

#报名时根据时间戳命名的,所以这里有用到
buildTime=$(date +%Y%m%d%H%M)

profile="${profile_Name}"

echo $profile $ipa_Name

#一下方法主要是创建打包的路径和最后导出的ipa的路径
if [ ! -d "../PackageShell/Package" ]; then
    mkdir ../PackageShell/Package
fi

if [ ! -d "../PackageShell/Package/ArchiveProduction" ]; then
    mkdir ../PackageShell/Package/ArchiveProduction
fi

if [ ! -d "../PackageShell/Package/ArchiveProduction/QA" ]; then
    mkdir ../PackageShell/Package/ArchiveProduction/QA
    echo "Create ArchiveProduction path"
fi

if [ ! -d "../PackageShell/Package/ipa" ]; then
    mkdir ../PackageShell/Package/ipa
fi

if [ ! -d "../PackageShell/Package/ipa/QA" ]; then
    mkdir ../PackageShell/Package/ipa/QA
    echo "Create ipa path"
fi

buildConfiguration="QA"

buildPath="../PackageShell/Package/ArchiveProduction/QA/${ipa_Name}_${buildTime}.xcarchive"
ipaName="../PackageShell/Package/ipa/QA/${ipa_Name}_${buildTime}.ipa"

#先进行clean操作
xctool -workspace PackageExample.xcworkspace -scheme PackageExample -configuration ${buildConfiguration} clean

#打包的命令
xctool -workspace PackageExample.xcworkspace -scheme PackageExample -configuration ${buildConfiguration} archive -archivePath ${buildPath}
#导出ipa包的命令,
xcodebuild -exportArchive -exportFormat IPA -archivePath ${buildPath} -exportPath ${ipaName} -exportProvisioningProfile "$profile"

做一些解释,脚本的开头有PlistBuddy命令,它是Mac下一个用来读写plist文件的工具,在/usr/libexec/下。xctool -workspace PackageExample.xcworkspace -scheme PackageExample -configuration ${buildConfiguration} clean,由于项目是workspace,所以这里必须要对应,如果是project则是project,clean的目的是进行清理缓存等。xctool -workspace PackageExample.xcworkspace -scheme PackageExample -configuration ${buildConfiguration} archive -archivePath ${buildPath}archive命令主要用来打包,最后包的格式为xcarchive。可以进入这个包里,目录结构如图:

主要是产生了 dsYM和 .app文件,并且可以看到的是它是已经经过签名的。虽然从命令中没有指定profile,但是我看到编译的log输出有以下这段:

Sign PackageExample.app,推测这步是进行签名了,至于为什么命令中没有指定也可以编译那是因为在Xcode中进行过手动设置(?:猜测是)。最后一步导入ipa主要用xcodebuild命令,至少在当时我找到的是这个命令而不是xctool。经过导出的ipa包,简单点的,可以邮件群发给同事进行测试。

小结

至此,差不多介绍完自动打包的一种方案。但其实还可以延伸,主要反映在两点上:

1.虽然能够成功打一个包,但是本系列文章第一篇开始部分中提到的,如何快速复制两个很相似但又不同的包?
2.导出来的ipa包,用邮件群发是否仍然麻烦,能否继续实现自动化?

上面的两点实际上都能很好的解决,也就是前面说到的要攻克2.重新签名 和 3.分发部署,下篇文章会介绍我的解决思路,里面涉及重新签名和一些上传工具。

本文转载自:http://www.vienta.me/2016/02/24/iOS%E6%89%B9%E9%87%8F%E8%87%AA%E5%8A%A8%E6%89%93%E5%8C%85%E5%92%8...

共有 人打赏支持
hejunbinlan
粉丝 41
博文 596
码字总数 21569
作品 0
浦东
高级程序员
私信 提问
2018-11-06 "libswiftRemoteMirror.dylib"导致iOS应用提交失败

最近提交iOS Application到Test Flight的时候遇到这个奇怪的错误: 说是应用包内多了这个"libswiftRemoteMirror.dylib"的文件,打开应用程序包后,的确发现多了很多 开头的类包: 你会看到,...

雨_树
2018/11/06
0
0
分享 Ionic 开发 Hybrid App 中遇到的问题以及后期发布 iOS/Android 的方方面面

此篇文章主要整理了最近在使用 Ionic 开发 Hybrid App 过程中遇到的一些疑难点以及后期发布生成 iOS 和 Android 版本过程中的种种问题。 文章目录 Ionic 简介和项目需求介绍 View 缓存的处理...

达摩院法师
2015/11/05
0
0
Genesis-3D新手入门——14.发布到iOS平台

发布到iOS平台 在游戏制作完毕后,需要进行平台打包才能最终发布。Genesis-3D是一个可以支持很多平台的编辑器,这一篇我们就来学习如何让你把制作出的游戏在iOS平台上运行。 准备步骤 1.注册...

lengche
2014/02/20
0
0
iOS APP上架App Store流程

上架iOS需要一个付费688的开发者账号,还没有的话申请一个或者借用。 申请苹果开发者账号教程 上架App Store之前是先安装到苹果手机测试调试好,app能正常运行再上架 iOS真机调试测试教程 上...

Code辉
2018/12/04
0
0
小驴拉磨之自动化打包—fastlane的安装

fastlane 简介 fastlane 是一套工具,帮助你简化和自动化 App 发布或部署的过程,将之变成一条平直的工作流。通过 fastlane,你可以实现 持续分发(CD,一种用于自动化和改进软件分发过程的设...

小驴拉磨
2017/11/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

多表查询

第1章 多表关系实战 1.1 实战1:省和市  方案1:多张表,一对多  方案2:一张表,自关联一对多 1.2 实战2:用户和角色 (比如演员和扮演人物)  多对多关系 1.3 实战3:角色和权限 (比如...

stars永恒
今天
7
0
求推广,德邦快递坑人!!!!

完全没想好怎么来吐槽自己这次苦逼的德邦物流过程了,只好来记一个流水账。 从寄快递开始: 2019年1月15日从 德邦物流 微信小app上下单,截图如下: 可笑的是什么,我预约的是17号上门收件,...

o0无忧亦无怖
昨天
7
0
Mac Vim配置

1.升级 vim   我自己 MacBook Pro 的系统还是 10.11 ,其自带的 vim 版本为 7.3 ,我们将其升至最新版: 使用 homebrew : brew install vim --with-lua --with-override-system-vim 这将下...

Pasenger
昨天
8
0
vmware安装Ubuntu上不了网?上网了安装不了net-tools,无法执行ifconfig?

1.重新设置网络适配器还是不行,如下指定nat 2.还需要指定共享网络,我是在无线环境下 3.无法执行ifconfig https://packages.ubuntu.com/bionic/net-tools到这个网站下载net-tools的deb文件...

noob_chr
昨天
6
0
解决SVN:E210007无法协商认证机制

svn:E210007 svn: Cannot negotiate authentication mechanism 执行下面代码即可 sudo yum install cyrus-sasl cyrus-sasl-plain cyrus-sasl-ldap...

临江仙卜算子
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部