怎么自动copyant build.xml copy出来的二进制文件

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
嵌入式软件开发导论-5操作系统开发解读.ppt 90页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:350 &&
嵌入式软件开发导论-5操作系统开发解读
你可能关注的文档:
··········
··········
Session2:TestingWindowsCE.NETAlanPage,Microsoft介绍PlatformBuilder一个定制基于WindowsCE的平台定制集成开发环境(IDE)提供所有与基于WindowsCE平台设计、创建、编译、测试和调试相关的开发工具该集成开发环境提供统一的与平台和项目相关的工作空间PB能做什么?(1)平台向导帮助你创建一个新的平台(platform)BSP向导帮助你创建新的板级支持包(BSP)目录(Catalog)显示用户定制的平台OS属性列表依赖性自动监测(Automateddependencychecking)可以确保与平台相关的所有属性都会被包含在OS镜像中导出向导可以导出目录中的属性给其它PB使用者基本配置(Baseconfigurations)是创建用户特定定制OS的起点PB能做什么?(2)WindowsCE测试套件(TestKit)提供了整套驱动测试工具内核调试器可以调试定制的OS镜像,同时提供给用户镜像运行状况的信息应用调试器可以调试在特定OS上运行的应用程序远程工具可以调试基于WindowsCE的目标机上运行任务,并获取相关信息模拟器通过模拟硬件可以加快和简化开发过程,使用户可以在宿主机上完成平台和应用程序的初步开发SDK导出向导可以为用户导出一个特定的软件支持包(softwaredevelopmentkit—SDK).平台向导(PlatformWizard)使用平台向导的4步选择一个安装的BSP为你的设备选择一个基本平台配置为你的设备选择配置变量为你的平台选择其它的属性目录(Catalog)目录(Catalog)项属性组(FeatureGroup)和属性(Feature)属性组定义了通用的属性而没有定义具体的实现。属性组在你选择一个实现的时候才被解析,这个实现决定了它的具体功能。一个属性是OS组件的任何一个逻辑群Feature图标Feature图标(2)Feature选项Feature依赖关系挑战挑战丰富的经验和知识没有这些不能设计合理的平台WindowsCE上可以使用简体中文?WindowsCE支不支持VBScript?关于属性的功能可参照:有关WindowsCE.NET-&CatalogFeaturesPlatformSettingBuildOptions(1)EnableCETargetControlSupport选择该选项可以在启动时使能目标控制功能(targetcontrolsupport).选择这一项同时也打开了内核无关传输层(KernelIndependentTransportLayer—KITL).EnableEbootSpaceinMemory选择该选项可以在Config.bib文件中预留内存空间,允许在启动过程中操作系统可以读取bootloader存储的数据.EnableEventTrackingduringBoot选择该选项可以开启事件跟踪子系统(event-trackingsubsystem).EnableFullKernelMode选择该选项可使线程运行在内核模式,选择该模式会使系统较脆弱,但是性能会有所提高.EnableImageforFlash选择该选项可以使编译好的镜像下载后被烧写的到Flash中BuildOptions(2)EnableKernelDebugger允许调试器建立宿主机和目标机间的链接和传送调试信息EnableKITL要建立宿主机和目标机间的通讯就必须选择该选项,取消该项也会同时取消被选定的“EnableCETargetControlSupport”选项EnableProfiling选择该选项可以将WindowsCE的有关内核的信息以日志的形式装入平台镜像中EnableShipBuild这是一个有条件编译的标志,设置它表示OS会提供详细的调试信息来帮助调试.FlushEventstoReleaseDirectory选择该选项将事件放入release目录,同时开启事件跟踪平台配置文件原码配置文件镜像配置文件配置文件:.BIB文件表明应该被包含在镜像中的模块和组件包含4个部分的文本文件:文件部分:为静态数据文件预留的内存模块部分:指定被装载到内存中的目标模块配置文件:.BIB文件内存部分定义平台的内存信息划分物理内存的数据存储和程序存储部分配置部分不是必须的用来设置属性等配置文件:.REG文件定义默认的注册设置COMMON.REG,IE.REG,WCEAPPS.REG,WCESHELL.REG:为WindowsCE模块定义注册设置PLATFORM.REG:与平台相关的注册设置,如驱动入口等PROJECT.REG:定义与你的工程相关的注册设置配置文件:.DAT文件定义镜像的文件夹结构COMMON.DAT,IE.DAT,WCEA
正在加载中,请稍后...1408人阅读
iOS基础(44)
今天在查阅自动化打包的相关资料,自动化打包,归根到底主要用到了xcodebuild和xcrun命令,及一些shell脚本实现自动化。
了解自动化打包之前,首先了解下传统的打包方式:
1) appstore 二进制程序包
打开你的项目,进入“Edit Project Settings”,进入Configuration页面,选中Release点击下面的Duplicate,复制一个新的配置项出来,命名为 Distribution。然后进入Build页面,顶上的Configuration下拉框选中Distribution,下面的Code Signing Identity里面的Any iPhone OS Device后面对应的值选中你的那个Distribution的证书。然后点击“Build”–& “Build” 就可以编译程序了
编译成功后,你就可以在相应的build目录下看到一个.app的二进制文件。
2) 渠道ipa包
根据以上步骤同样配置好Distribution 证书 ,然后点击 “Build”–& “Build and Archive” 就可以编译程序了。接着打开“Window””Organizer” 左边栏中选择”ARCHIVED APPLICATIONS” 然后再右侧列表中选中刚才编译的程序包 再点击右侧右边顶部的”Share”按钮 保存到磁盘即可。就会生成一个.ipa的文件 即为渠道包。
注意:以上运行设备必须选择“Deveice“
那自动化打包怎么做呢?详细的步骤如下:
a) 从源程序一次性打出所有渠道的ipa包 跟appstore的二进制包
为了让自动化脚本执行一次把所有的渠道包都打好,所以必须有一个配置文件用来存储所有的渠道名跟渠道号,而项目文件中也应该有个对应存储当前渠道号的文件,每次程序都从这个存放渠道号的文件中读取渠道号即可,大概的思路就是利用脚本循环执行打包过程,而每次打包前都通过脚本修改项目中存放渠道号的文件为当前循环的最新渠道号,让后逐个打包。
注:具体事例见附录
b) 提供一个ipa格式的母包 从母包生成其它所有的渠道包跟 appstore 包
qa的一些疑问,如何确保所有的渠道包就是他们验证过的那份代码呢?
的确,以上代码每次都是重新对程序进行打包,可qa往往测试验证的只有一个包,如果个个去验证无意中之中又增加了qa的工作量哈!!而且风险也不可控。因此基于上面的问题我们想出了一下办法:qa只验证一个程序包(即母包)如果这个包通过验证
我们就通过母包去生成其它渠道的包,这样一来qa也不用确认那么多的渠道包了,风险也得到了有效的控制。
可能你会问:用一个包生成其他的包可行么??
原因是这样的:因为每个渠道只是渠道号发生变化,而其他的内容又不会发生变化,而我们的渠道号又是存储在sourceid.dat这个文件中的,所以只要改变母包中的sourceid.dat文件的内容即可,而ipa包又是同zip格式进行压缩,所以基本思路就是通过zip先对母包进行解压,然后改变sourceid.dat的内容
最后再用zip进行压缩成相应的渠道包即可。
Ipa包的目录:
脚本如下:
利用xcode环境一次生成所有包的shell 脚本代码:
注:以上的data.dat文件为存放渠道号列表的文件 其格式为:3g:1001b 即 (渠道名:渠道号) sourceid.dat 为项目文件中存放渠道号的文件(内容只有一个渠道号)。当然了上面脚本只是说明了下如何利用xcodebuild 和 xcrun 进行打包 以及自动打包的一个逻辑,shell脚本好的同学可以自由发挥哈。。。
从ipa格式的母包生成其它渠道包的shell脚本实例:
复制内容到剪贴板
注:以上data.dat也是用来存储所有渠道号的,sourceipaname就是通过qa验证的母包,appname为ipa包加压后Payload 目录下的app文件名并且以上所有文件必须与脚本文件保持在同一目录下以及在mac环境中执行。
附上xcodebuild和xcrun的介绍:
1、xcodebuild:
也可以在终端输入:xcodebuild –help 或 –h查看具体的选项
显示xcodebuildversion:xcodebuild –version
显示当前系统安装的sdk:xcodebuild –showsdks
显示当前目录下project Information:xcodebuild –list
需要注意的是:执行以上命令时必须把位置定位在ios项目文件的根目录下 否则会提示找不相关命令的。
此工具主要用于将app文件打包成ipa格式的程序包。(主要用于已越狱手机)。
具体用法如下:
其中:-v 对应的是app文件的绝对相对路径 –o 对应ipa文件的路径跟文件名 –sign
对应的是 发布证书中对应的公司名或是个人名& –embed 对应的是发布证书文件
注意如果对应的Distribution 配置中已经配置好了相关证书信息的话 –sign 和 –embed可以忽略
(转自:http://www.weste.net//78382.html)
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:232125次
积分:3238
积分:3238
排名:第10389名
原创:74篇
转载:129篇
评论:12条
(1)(1)(2)(3)(4)(4)(1)(1)(3)(6)(12)(21)(28)(49)(16)(9)(3)(3)(20)(15)(1)新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
小富即安, 积分 2465, 距离下一级还需 2535 积分
论坛徽章:0
要发布二进制rpm包时,可以利用rpmbuild工具,前提是编写好spec文件,就像翻译时需要编写Makefile文件一样的道理。
要打包的文件如下所示:
[root@localhost BUILD]# pwd
/usr/src/redhat/BUILD
[root@localhost BUILD]# ll
-rw-r--r-- 1 root root -04-20 18:24 test.c
-rw-r--r-- 1 root root -04-20 18:24 test.h
-rw-r--r-- 1 root root& &802
18:24 Makefile
-rwxr-xr-x 1 root root 9-04-21 10:47 libfuse.so
-rw-r--r-- 1 root root&&-03-25 10:32 fuse.h
复制代码
Makefile文件如下所示:
JAVA_HOME = /usr/java/jdk1.6.0_11
OS_ARCH = i386
CC = gcc
CFLAGS =&&-g -Wall -O2
LDFLAGS = -L$(JAVA_HOME)/jre/lib/$(OS_ARCH)/server&&-L$(JAVA_HOME)/jre/lib/i386/ -ljvm -L.&&-lfuse
CPPFLAGS = -m32 -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
test : test.c
& && &&&$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $& -o $@
install :
& && &&&cp test /bin/
clean :
& && &&&rm -rf test
复制代码
spec文件如下所示:
[root@localhost SPECS]# pwd
/usr/src/redhat/SPECS
[root@localhost SPECS]# cat test.spec
%define test-0.1
Name: test
Version: 0.1.10
Release: 2Everest
Summary: test
License: GPL
Group: Applications/System
%description
test
%build
make
%install
make install
cp test /bin/
%files
/usr/src/redhat/BUILD/libfuse.so
/usr/src/redhat/BUILD/test
复制代码
接下来用rpmbuild打包二进制文件
[root@localhost SPECS]# rpmbuild -bb test.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.98294
+ umask 022
+ cd /usr/src/redhat/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.98294
+ umask 022
+ cd /usr/src/redhat/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ make
...
Processing files: test-0.1.10-2Everest
Provides: libfuse.so.2 libfuse.so.2(FUSE_2.2) libfuse.so.2(FUSE_2.4) libfuse.so.2(FUSE_2.5) libfuse.so.2(FUSE_2.6) libfuse.so.2(FUSE_2.7) libhdfs.so
Requires(rpmlib): rpmlib(CompressedFileNames) &= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) &= 4.0-1
Requires: libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1) libc.so.6(GLIBC_2.1.3) libc.so.6(GLIBC_2.2) libc.so.6(GLIBC_2.3) libdl.so.2 libdl.so.2(GLIBC_2.0) libdl.so.2(GLIBC_2.1) libfuse.so.2 libfuse.so.2(FUSE_2.2) libfuse.so.2(FUSE_2.5) libfuse.so.2(FUSE_2.6) libhdfs.so libjvm.so libjvm.so(SUNWprivate_1.1) libm.so.6 libm.so.6(GLIBC_2.0) libpthread.so.0 libpthread.so.0(GLIBC_2.0) libpthread.so.0(GLIBC_2.1) libpthread.so.0(GLIBC_2.2) libpthread.so.0(GLIBC_2.3.2) librt.so.1 librt.so.1(GLIBC_2.2) rtld(GNU_HASH)
Checking for unpackaged file(s): /usr/lib/rpm/check-files %{buildroot}
Wrote: /usr/src/redhat/RPMS/i386/test-0.1.10-2Everest.i386.rpm
[root@localhost SPECS]# cd ../RPMS/i386/
[root@localhost i386]# ll
total 212
-rw-r--r-- 1 root root 9-04-21 10:58 test-0.1.10-2Everest.i386.rpm
复制代码
在/usr/src/redhat/RPMS目录下,生成了二进制包test-0.1.10-2Everest.i386.rpm
接下来安装test-0.1.10-2Everest.i386.rpm
[root@localhost test]# rpm -ivh test-0.1.10-2Everest.i386.rpm
error: Failed dependencies:
& && &&&libjvm.so(SUNWprivate_1.1) is needed by test-0.1.10-2Everest.i386
复制代码
报错:错误的动态库依赖libjvm.so, 怎么处理呢?
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
论坛徽章:1
%files
/usr/src/redhat/BUILD/libfuse.so
/usr/src/redhat/BUILD/test
/path/to/your/libjvm.so复制代码
小富即安, 积分 2465, 距离下一级还需 2535 积分
论坛徽章:0
回复 #2 flw 的帖子
谢谢flw的回答!
[root@localhost test]# rpm -ivh test-0.1.10-2Everest.i386.rpm
Preparing...& && && && && & ########################################### [100%]
& &1:cloudNAS& && && && && &########################################### [100%]
[root@localhost test]# whereis test
test:
复制代码
在/bin目录下并没有test这个文件, 我想可能是spec文件的问题吧?
论坛徽章:1
你要想装完以后有什么文件,就得把那个文件写到你的 spec 文件里去。
%install 小节不是给 rpm -ivh 的时候用的。
%files
/usr/src/redhat/BUILD/libfuse.so
/usr/src/redhat/BUILD/test
/path/to/your/bin/test复制代码
BTW:永远都不要用 test 来命名你的程序。因为 test 是一个系统命令。
小富即安, 积分 2465, 距离下一级还需 2535 积分
论坛徽章:0
回复 #4 flw 的帖子
我就是希望其它人拿到该rpm包时
执行完rpm -ivh xxx.rpm时在指定的目录下(如/bin)有xxx的可执行程序。
%install 小节不是给 rpm -ivh 的时候用的。
那在spec文件中怎么写呢?
BTW:永远都不要用 test 来命名你的程序。因为 test 是一个系统命令。
以后会注意的,谢谢!
家境小康, 积分 1985, 距离下一级还需 15 积分
论坛徽章:0
原帖由 nbaloverme 于
11:43 发表
谢谢flw的回答!
[root@localhost test]# rpm -ivh test-0.1.10-2Everest.i386.rpm
Preparing...& && && && && & ########################################### [100%]
& &1:cloudNAS& && && && && &##### ...
您的“test”的路径是: /usr/src/redhat/BUILD/test 吧?
小富即安, 积分 2465, 距离下一级还需 2535 积分
论坛徽章:0
原帖由 diyself 于
13:03 发表
您的“test”的路径是: /usr/src/redhat/BUILD/test 吧?
%files
/usr/src/redhat/BUILD/libfuse.so
/usr/java/jdk1.6.0_11/jre/lib/i386/server/libjvm.so
/usr/src/redhat/BUILD/test
复制代码
在打包过程中发生的动作。就是你运行“rpmbuild -ba your_application.spec”后打包系统的一些自动的动作。 即使是install阶段,也只是打包过程中的一个阶段(这个阶段移动了某些临时文件)而已。和最终用户安装rpm包中的“安装”根本是两回事!!!
[ 本帖最后由 nbaloverme 于
15:39 编辑 ]C 如何编译出一个不需要操作系统的二进制? - 知乎423被浏览29420分享邀请回答9914 条评论分享收藏感谢收起$ gcc -c the_kernel.c
这样会生成the_kernel.o,反汇编得到如下的结果:$ objdump -d the_kernel.o
the_kernel.o:
file format elf64-x86-64
Disassembly of section .text:
0000 &the_kernel&:
1: 48 89 e5
4 &the_kernel+0x4&
此时我们已经得到了一个名为the_kernel的symbol,将它作为kernel的入口:$ ld -Ttext 0x1000 -e 0x1000 -o the_kernel the_kernel.o
这样我们就链接得到了一个可执行的elf。看一下:$ objdump -d the_kernel
the_kernel:
file format elf64-x86-64
Disassembly of section .text:
1000 &the_kernel&:
1004: eb fe
1004 &the_kernel+0x4&
我们把程序的入口放在了0x1000处。如果你不需要elf,那么可以:$ ld -Ttext 0x1000 -e 0x1000 -o the_kernel -oformat binary the_kernel.o
这样你得到的the_kernel里面就只包含6个字节的代码:55
1004 &the_kernel+0x4&
只要你把它放在0x1000这个地方,然后把你的程序指向这里,就可以执行它了。有兴趣你可以写个c程序,把这个二进制文件读进内存,然后搞一个函数指针指向这个地址。然后调用它,你的程序就顺利的死循环在这个不需要操作系统的代码上了。-----------------这段可以忽略,似乎跑题了--------------------当然对于一个真正的操作系统,刚刚我要你写的这个c程序,通常是一个汇编/C写成的bootloader。它会做同样的事情:读进内存,找到入口,开始执行。一个真正的操作系统,不会只有唯一的源代码和唯一的函数,但是他们都会被编译成object文件,然后链接起来。其他的函数都可以由你自己设计的入口(the_kernel)来调用执行。而且通常情况下会用到linker script来描述你程序的layout,而不是像上面一样直接给ld命令行参数。-----------------跑题结束-----------------------------------------所以编译一个不需要操作系统的程序,重点是:静态链接所有依赖,规定程序地址空间的layout。如果上面的一堆东西你完全看不懂,你就需要去了解一下“编译”这个概念了。编译和链接其实是两个过程,而我们通常所说的编译把他们混在一起了。我的意思是需不需要一个特定的编译器,(当然那种直接生成特定格式(exe/elf...)的不算)运行一段代码需要的只是知道你编译出来的东西“长什么样”,比如在这个文件里,哪里是代码,哪里是数据,代码应该放在内存的哪里,数据需要放在哪里。所以这个格式可以是elf,也可以是任何一种你自己能够理解的格式(而你可以自己写一个foo_loader,它能够理解你创造的bar格式)。不过因为elf已经很完善了,所以很多时候都选择直接编译为elf。10317 条评论分享收藏感谢收起查看更多回答}

我要回帖

更多关于 copy www build step 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信