zoukankan      html  css  js  c++  java
  • 打包framework 涉及到得架构问题

    一、在项目开发过程中 ,为了适配不通的设备 ,需要我们手动的增加支持设备的架构。那么就需要我们对苹果手机对应的架构所有了解

    现在列出目前需要适配的集中机型对应的架构

    上图中还少一个基于模拟器的x86_64位得架构

    我们在打包framework时,不可避免的要对架构进行设置。如下图:

    现对上诉字段进行说明:一下文字引用自网页:http://www.tuicool.com/articles/aeiaUr

    Architectures 
    这代表,在这个项目里你想要Xcode编译的目标设备列表。 
    Valid Architectures 
    还不是太明确这个设置的意图,但是一般来说是不需要更改的,和Architectures一样就可以。

    在Xcode6.1.1里的 Valid Architectures  设置里, 默认为 Standard architectures(armv7,arm64),如果你想改的话,自己在other中更改。

    原因解释如下: 
    使用 standard architectures (including 64-bit)(armv7,arm64) 参数,则打的包里面有32位、64位两份代码,

    在iPhone5s( iPhone5s的cpu是64位的 )下,会首选运行64位代码包, 

    其余的iPhone( 其余iPhone都是32位的,iPhone5c也是32位 ), 只能运行32位包,

    但是包含两种架构的代码包,只有运行在ios6,ios7系统上。 

    这也就是说,这种打包方式,对手机几乎没啥要求,但是对系统有要求,即ios6以上。 
    而使用 standard architectures (armv7,armv7s) 参数, 则打的包里只有32位代码, iPhone5s的cpu是64位,但是可以兼容32位代码,即可以运行32位代码。但是这会降低iPhone5s的性能。 其余的iPhone对32位代码包更没问题, 而32位代码包,对系统也几乎也没什么限制。 
    所以总结如下:  

    要发挥iPhone5s的64位性能,就要包含64位包,那么系统最低要求为ios6。 如果要兼容ios5以及更低的系统,只能打32位的包,系统都能通用,但是会丧失iPhone5s的性能。

    Build Active Architecture Only

    这个属性设置为yes,是为了debug的时候编译速度更快,它只编译当前的architecture版本。 
    而设置为no时,会编译所有的版本。 
    这个是设备对应的architecture: 
    armv6:iPhone 2G/3G,iPod 1G/2G 
    armv7:iPhone 3GS/4/4s,iPod 3G/4G,iPad 1G/2G/3G 
    armv7s:iPhone5, iPod5 
    arm64:iPhone5s,ipad air,ipad mini2 
    编译出的版本是向下兼容的,比如你设置此值为yes,用iphone4编译出来的是armv7版本的,iphone5也可以运行,但是armv6的设备就不能运行。 
    所以,一般debug的时候可以选择设置为yes,release的时候要改为no,以适应不同设备。

    个人遇到的问题,纠结了一早上,终于搞定了

    问题:生成的framework在模拟器5s 中测试,一直报错:缺少对x86_64为架构的支持。但是真机能运行

    然后就一直在修改Architectures  ,把所有跟Architecture相关的地方都改成armv7、armv7s、arm64、i386、x86_64 补全所有的架构,然后打包出来的framework也报错。

    然后在我把所有的设置都删掉,重来,只添加了最基本的三种结构(armv7、armv7s、arm64)以后,打包出来的包居然可以在模拟器和真机中同时运行 ,亲测所有的模拟器都可以运行 ,现贴出Architecture 的设置截图:

     

    只要保证打包framework的项目和引用framework的项目按照上图设置,就不会出现恶心的缺少对某一种架构的定义了 。

    三、打包framework。不得不提的就是合成包、虽然这会导致app包得容量增大,但是无疑是一种比较方便得方法

    合成包得两个方法:1、利用终端,手动合成、

    lipo -create /所在路径/Release-iphoneos/libMyStaticLibraryDemo.a /所在路径/Release-iphonesimulator/libMyStaticLibraryDemo.a -output /Users/pingk/Desktop/libUniversal.a
     
    另一种方法就是在项目中新增脚本来完成
     
    贴出脚本代码:

    # Sets the target folders and the final framework product.

    # 如果工程名称和FrameworkTarget名称不一样的话,要自定义FMKNAME

    # 例如: FMK_NAME = "MyFramework"

    FMK_NAME=${PROJECT_NAME}

    # Install dir will be the final output to the framework.

    # The following line create it in the root folder of the current project.

    INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework

    # Working dir will be deleted after the framework creation.

    WRK_DIR=build

    DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework

    SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework

    # -configuration ${CONFIGURATION}

    # Clean and Building both architectures.

    xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build

    xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build

    # Cleaning the oldest.

    if [ -d "${INSTALL_DIR}" ]

    then

    rm -rf "${INSTALL_DIR}"

    fi

    mkdir -p "${INSTALL_DIR}"

    cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"

    # Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.

    lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"

    rm -r "${WRK_DIR}"

    open "${INSTALL_DIR}"

     

     

    运行:

     

    经过接近1分钟的等待以后,脚本回打开包所在的路径。如下图:

    执行中,比编译一般得app要慢,执行完以后,回自动弹出窗口

    此时,将包拷贝出来,或者直接拖到要用的项目工程里,不用反复的选中包。然后执行show in finder 的操作了 。

    真心推荐

     

  • 相关阅读:
    Oracle使用序列创建自增字段(主键自动增长)
    Oracle 增加修改删除字段
    JavaScript trim函数大赏
    js跨域问题
    document.getElementsByClassName的理想实现
    IIS启用Gzip的方法与优缺点分析
    浅释跳转漏洞
    js跨域及解决方法
    C#编写COM组件
    50种方法巧妙优化你的SQL Server数据库
  • 原文地址:https://www.cnblogs.com/tianlin106/p/4191715.html
Copyright © 2011-2022 走看看