2018-06-27 10:30:01 ITjianghuxiaoxiong 阅读数 856

打开mac终端,输入以下命令查看.a库支持的平台架构

命令格式:lipo -info [.a文件]

 lipo -info ./Debug-iphoneos/libimsdk.a

如图该库支持armv7、arm64、armv7s。

实际开发中我们希望引入一个.a库同时支持真机和模拟器,那么就会涉及合并.a包,命令如下:

命令格式:lipo -create [待合并的.a] [待合并的.a] -output [要生成的文件名]

 lipo -create ./Debug-iphonesimulator/libimsdk.a ./Debug-iphoneos/libimsdk.a -output ./libimsdk.a

2017-07-27 16:31:51 chenya866 阅读数 1647

 在ios开发中,每个工程都会用到别人封装的一些好的框架,但是这些框架不一定全部支持真机和模拟器测试,所以我们需要提前判断一下它们是否支持真机或者模拟器,而且我们在制作自己的封装库时,如果我们想我们的框架能够既支持真机又支持模拟器,那就需要对生成的库进行合并!

    判断framework或.a文件支持框架:

lipo -info /Users/.../xFramework.framework/xFramework

lipo -info  /Users/.../libXYPlatform.a

    结果

Architectures in the fat file: xsdkFramework are: armv7 arm64 不支持模拟器

Architectures in the fat file: libUPPayPlugin.a are: armv7  arm64 i386 x86_64 支持真机和模拟器

     framework的合并

1.lipo -create /Users/.../RKPlatform.framework/RKPlatform /Users/.../RKPlatform.framework/RKPlatform -output /Users/.../Desktop/RKPlatform

前两个是分别支持真机和模拟器的framework的路径 -output后是合并后输出可执行文件的路径

2.然后把生成后的可执行文件RKPlatform替换合并前任意一个framework里面的可执行文件RKPlatform就OK了


常见错误如下:

iOS Framework lipo报错 lipo: can't map input file

fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: can't map input file: xxxFramework.framework/ (Invalid argument)

原因在于:

lipo -info xxxFramework.framework
而命令需要是

lipo -info xxxFramework.framework/xxxFramework
或者

cd xxxFramework.framework
lipo -info xxxFramework
参考:http://www.jianshu.com/p/99a5ac602123
2019-04-29 14:25:40 shifang07 阅读数 214

上一篇讲的是静态库.framework 依赖第三方库,是通过Cocoapod 提供的第三方库。而有时我们会依赖第三方.a 或者.framework 的。那么怎么样来制作依赖第三方.a 或者.framework 的静态库.a 尼?这篇文章演示一下制作依赖第三方.a 的静态库。

目标:将第三方的静态库(*.a)打包进我们自己的静态库.a中

实验例子:

我们将使用 iOS架构-静态库.a的打包及使用(3) 中的制作的静态库 VideoPlayerLib 文件夹集成到我们自己的静态库中去。

步骤

  1. 创建一个静态库项目,选择Static Library 生成.a的静态库,取名为:StaticIncludeStaticA
    在这里插入图片描述
  2. 将静态库拖入到项目中,并勾选Add to Targets到库中。
    在这里插入图片描述3. 添加静态库 libVideoPlayerLib.a 后的工程目录如图:
    在这里插入图片描述
    .h
#import <Foundation/Foundation.h>
@interface StaticIncludeStaticA : NSObject

/**
 使用第三方库方法
 */
+ (void)useVideoPlayerLibTest;

@end

.m


#import "StaticIncludeStaticA.h"
#import "VideoPlayerLib.h"

@implementation StaticIncludeStaticA

// 引用第三方静态库的代码
+ (void)useVideoPlayerLibTest {
    NSLog(@"useVideoPlayerLibTest");
    [[VideoPlayerLib sharedInstance] closePlayerWindow];
}
@end

⚠️:如果是其他的静态库.a 依赖的有系统的库,要根据文档把依赖的系统系统库一一添加即可。
例如:百度SDK所需要依赖的系统库
在这里插入图片描述4. 最后就是合并模拟器.a 、真机.a 加上头文件形成静态库SDK。
合并这里就不再重复写了,之前在iOS架构-静态库.a的打包及使用(2) 已经完成过。自动化也讲过在此不再赘述。
在这里插入图片描述
5. 导入使用验证,控制台打印结果。
在这里插入图片描述这样就完成了包含 第三方静态库.a 的静态库.a的制作了。

2019-04-11 17:21:09 shifang07 阅读数 408

接着iOS架构-静态库.a的打包及使用(一)继续研究静态库.a的打包

需求背景:

  1. 手动编译静态库工程是会生成模拟器和真机两个不同的.a包
  2. 终端合成 $:lipo -create 真机.a路径 模拟器.a路径 -output 合成后的.a路径
  3. 验证合成.a $:lipo -info 合成后的.a路径
  4. 将合成的.a 和头文件放在一个文件夹供外部使用

打个.a 都需要4步,要是每天打包5.6次,是不是要疯了!

明确需求:

一键自动化打包,最后形成一个SDK文件夹供外部使用

解决方案:

shell脚本:xcodebuild命令进行自动化打包

实验过程

  1. 用Xcode创建Script.sh的脚本,放到和VideoPlayerLib.xcodeproj 同一目录下
    (也可以创建一个Script.txt,改后缀.sh后放到上述目录)
    在这里插入图片描述Script.sh脚本位置
    在这里插入图片描述
  2. 书写脚本内容
#!/bin/sh

#  Script.sh
#  VideoPlayerLib
#
#  Created by lzz on 2019/4/10.
#  Copyright © 2019 lzz. All rights reserved.

#注意:脚本目录和xxxx.xcodeproj要在同一个目录,如果放到其他目录,请自行修改脚本。
#要build的target名
target_Name=VideoPlayerLib
echo "target_Name=${target_Name}"

#工程名
project_name=$target_Name
echo "project_name=${project_name}"

#打包模式 Debug/Release 默认是Release
development_mode=Release


#当前脚本文件所在的路径 $(pwd)
SCRIPT_DIR=$(pwd)
echo "======脚本路径=${SCRIPT_DIR}======"

#工程路径
#PROJECT_DIR=${SCRIPT_DIR} 和下面写法也样
PROJECT_DIR=$SCRIPT_DIR
echo "======工程路径=${PROJECT_DIR}======"

#build之后的文件夹路径
build_DIR=$SCRIPT_DIR/Build
echo "======Build路径=${build_DIR}======"

#真机build生成的头文件的文件夹路径
DEVICE_DIR_INCLUDE=${build_DIR}/${development_mode}-iphoneos/include/${project_name}



#真机build生成的.a文件路径
DEVICE_DIR_A=${build_DIR}/${development_mode}-iphoneos/lib${project_name}.a
echo "======真机.a路径=${DEVICE_DIR_A}======"

#模拟器build生成的.a文件路径
SIMULATOR_DIR_A=${build_DIR}/${development_mode}-iphonesimulator/lib${project_name}.a
echo "======模拟器.a路径=${SIMULATOR_DIR_A}======"


#目标文件夹路径(也就SDK的文件:.a文件 和 头文件)
INSTALL_DIR=${build_DIR}/Products/${project_name}
echo "======SDK的文件夹路径=${INSTALL_DIR}======"

#目标头文件的文件夹路径
INSTALL_DIR_Headers=${build_DIR}/Products/${project_name}/Headers
echo "======头文件的文件夹路径=${INSTALL_DIR}======"

#目标.a路径
INSTALL_DIR_A=${build_DIR}/Products/${project_name}/lib${project_name}.a
echo "======目标.a路径=${INSTALL_DIR}======"


#判断build文件夹是否存在,存在则删除
#rm -rf 命令的功能:删除一个目录中的一个或多个文件或目录
if [ -d "${build_DIR}" ]
then
rm -rf "${build_DIR}"
fi


#判断目标文件夹是否存在,存在则删除该文件夹
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi

#创建目标文件夹
mkdir -p "${INSTALL_DIR}"



echo "======盒子已经准备好了,开始生产.a 并合成装到盒子里吧======"

#build之前clean一下
xcodebuild -target ${target_Name} -configuration ${development_mode} -sdk iphonesimulator clean

xcodebuild -target ${target_Name} -configuration ${development_mode} -sdk iphoneos clean

#模拟器build
xcodebuild -target ${target_Name} -configuration ${development_mode} -sdk iphonesimulator

#真机build
xcodebuild -target ${target_Name} -configuration ${development_mode} -sdk iphoneos


#复制头文件到目标文件夹
#使用-R参数可实现递归功能,即所有子目录中的文件与目录均拷贝
cp -R "${DEVICE_DIR_INCLUDE}" "${INSTALL_DIR_Headers}"


#合成模拟器和真机.a包
lipo -create "${DEVICE_DIR_A}" "${SIMULATOR_DIR_A}" -output "${INSTALL_DIR_A}"

echo "======合成结束======"



# -f 判断文件是否存在
if [ -f "${INSTALL_DIR_A}" ]
then
echo "======验证合成包是否成功======"
lipo -info "${INSTALL_DIR_A}"
fi


#打开目标文件夹
open "${INSTALL_DIR}"

  1. 解释脚本过程
    脚本的执行的内容:其实就是需求背景的内容。代替我们手动操作。

在这里插入图片描述4. 执行脚本

Last login: Thu Apr 11 15:33:09 on ttys000
lzz-Mac-mini:~ suning$ cd /Users/suning/Desktop/ProjectDemos/VideoPlayerLib 
lzz-Mac-mini:VideoPlayerLib suning$ ./Script.sh
-bash: ./Script.sh: Permission denied
lzz-Mac-mini:VideoPlayerLib suning$ chmod 777 ./Script.sh

报错了,没有权限:
chmod 777 xx.sh,然后回车即可,但是要注意: chmod 777后面是脚本路径。
然后在执行脚本

lzz-Mac-mini:VideoPlayerLib suning$ ./Script.shh

在这里插入图片描述
5. 最终成功 支持x86_64 arm64 同时打开文件位置
在这里插入图片描述6. 最后,我们就可以把上面路径下的 VideoPlayerLib 文件夹丢给客户了,然后尼?然后就可以喝喝茶,刷刷手机了!岂不乐哉!使用方法和(一)一样。

脚本语法的介绍参考:https://www.jianshu.com/p/9cf90b9537fd

方法二:可以在公共新建Target:Aggregate
在Aggregate里面添加运行脚本,这里有个博客介绍的很详细
https://www.jianshu.com/p/69a9b6d9875e

2016-11-11 16:59:09 u012198553 阅读数 565

ios 静态库指令集
1:查看.a库内的架构

lipo -info libBjcaAlg.a

这里写图片描述

2:.a库架构的分离

Lipo -thin armv7 libBjcaAlg.a -output libBjcaAlg_armv7

3:打开 libBjcaAlg_armv7 包

//查看所有的文件
Ar -t libBjcaAlg_armv7

//可以通过grep 筛选文件
Ar -t libBjcaAlg_armv7 | grep Wifi

这里写图片描述

4:删除不需要的文件

Ar -dv libBjcaAlg_armv7 SoftAlg.o

这里写图片描述

5:分离架构的合并

Lipo -create libBjcaAlg_armv7 libBjcaAlg_arm64 -output libSBJSON.a

可以解决一些冲突问题;

没有更多推荐了,返回首页