本文正在参加「金石方案」
前语
make是一个指令工具,是一个解释makefile中指令的指令工具。其本质是文件依赖,Makefile文件制定编译和链接所涉及的文件、结构、库等信息,将整个进程自动化。 一般来说,大多数的IDE都有这个指令,比方:Delphi的make,Visual C++的nmake,Linux下GNU的make。
比如: 运用别号配置IP
I 准备常识
make指令履行时,需求一个 Makefile 文件,以告诉make指令需求怎么样的去编译和链接程序。那么先来了解下什么是编译?
- 编译: 把源文件编译成中心代码文件,在Windows下也便是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译。
- 链接: 把很多的Object File组成履行文件
源文件首要会生成中心方针文件,再由中心方针文件生成履行文件。
每个源文件都应该对应于一个中心方针文件(OBJ文件)
1.1 编译
在编译时,编译器只检测程序语法,和函数、变量是否被声明。假如函数未被声明,编译器会给出一个正告,但能够生成Object File。
只要一切的语法正确,编译器才能够编译出中心方针文件。至于函数与变量的声明的正确,便是指头文件的所在位置。
1.2 链接
主要是链接函数和全局变量,所以能够运用这些中心方针文件来链接咱们的应用程序。
在链接程序时,链接器会在一切的Object File中找寻函数的完成,假如找不到,那到就会报链接过错码(Linker Error)。
II Makefile的规矩
target... : prerequisites ...
command
...
...
-------------------------------------------------------------------------------
- 比如
THEOS_DEVICE_IP=iphone #5C9 #配置IP的host 别号
TARGET = iphone:latest:8.0
ARCHS = armv7 arm64
THEOS=/opt/theos
THEOS_MAKE_PATH=$(THEOS)/makefiles
include $(THEOS)/makefiles/common.mk
TWEAK_NAME =
Taoke_FILES = Taoke.xm
Taoke_FRAMEWORKS = UIKit, Foundation, Security, IOKit, JavaScriptCore
include $(THEOS_MAKE_PATH)/tweak.mk
after-install::
install.exec "echo '' > /var/log/syslog"
install.exec "killall -9 WeChat"
install.exec "killall -9 Moon"
-
target也便是一个方针文件,能够是Object File ,也能够是履行文件。还能够是一个标签(Label),对于标签这种特性,在后续的“伪方针”章节中会有叙说。
-
prerequisites便是要生成那个target所需求的文件或是方针
-
command也便是make需求履行的Shell指令
-
make clean
铲除一切的方针文件,以便重编译。
一个简略的比如
ARCHS = armv7 arm64
TARGET = iphone:latest:7.0
include theos/makefiles/common.mk
TWEAK_NAME = iOSREProject
iOSREProject_FILES = Tweak.mk
iOSREProject_PRIVATE_FRAMEWORK = BaseBoard
incluce $(THEOS_MAKE_PATH)/tweak.mk
after-install:: install.exec "killall -9 SpringBoard"
注意:BaseBoard这个private framework只存在于8.0以上的版别的SDK中,在IOS7 里并没有,所以这个tweak在IOS 7 中由于不会找到framework 而无法进行工作。这种情况能够通过弱引证( “makefile weak linking”)或dlopen()、dlsym() 和 dlclose()系列函数动态调用private framework来处理。
- 链接Match-o对象(Match-O object)
Theos 选用GUN Linker来链接Mach-O对象,包含.dylib、 .a 和 .o 。 例如,要链接libsqlite3.0.dylib 、libz.dylib 和dylib1.0像下面这样写就OK
iOSREProject_LDFLAGS = -lz -lsqlite3.0 -dylib1.o
- 开启arc: 不必自己手动进行内存办理
$(TWEAK_NAME)_CFLAGS += -fobjc-arc
- 独自为单个文件指定mrc
ZKSwizzle/ZKSwizzle.m_CFLAGS = -fno-objc-arc
III 集成第三方库
3.1 编译参数指定一些编译链接参数、搜索途径
TweakDemo_CFLAGS = -fobjc-arc -Wno-int-to-void-pointer-cast -Wno-int-to-pointer-cast -I./BookLib/include -F./BookFramework # 指定头文件位置
ZKSwizzle/ZKSwizzle.m_CFLAGS = -fno-objc-arc # 设置单个文件的MRC
TweakDemo_LDFLAGS = -L./BookLib -F./BookFramework # 链接
TweakDemo_LIBRARIES = BookLib #.a
TweakDemo_FRAMEWORKS = BookFramework # framke
- 导入头文件直接调用
// 这个第三方库或许头文件也能够放到 /opt/theos/对应的目录
#import <BookLib/BookLib.h> //.a
#import <BookFramework/BookFramework.h>// framework
3.2 运用 ASIHTTPRequest 的比如
20 RESOURCE_DIR = Resources
#编译 ----------------------------ASIHTTPRequest--------------------
32 service_FILES += ASIHTTPRequest/ASIAuthenticationDialog.m
33 service_FILES += ASIHTTPRequest/ASIDownloadCache.m
34 service_FILES += ASIHTTPRequest/ASIFormDataRequest.m
35 service_FILES += ASIHTTPRequest/ASIHTTPRequest.m
36 service_FILES += ASIHTTPRequest/ASIInputStream.m
37 service_FILES += ASIHTTPRequest/ASINetworkQueue.m
38 service_FILES += ASIHTTPRequest/Reachability.m
39
40 #编译 ----------------------------Encoder---------------------------
41 service_FILES += Encoder/CrypHelper.m
42 service_FILES += Encoder/GTMBase64.m
43 service_FILES += Encoder/NSData+Base64.m
44 service_FILES += Encoder/NSString+MD5Addition.m
45 service_FILES += Encoder/UIDevice+IdentifierAddition.m
46
47 #编译 ----------------------------TBXML-----------------------------
48 service_FILES += TBXML/NSDataAdditions.m
49 service_FILES += TBXML/TBXML.m
50
51 #编译 ----------------------------Regex-----------------------------
52 service_FILES += Regex/RegexKitLite.m
53
54 #编译 ----------------------------Constant--------------------------
55 service_FILES += Constant/Constant.m
56 service_FILES += Constant/UserDefaults.m
57
#衔接单元
87 #
88 #衔接 ----------------------------framework--------------------------
89 service_FRAMEWORKS = Foundation UIKit QuartzCore Foundation CoreFoundation CoreGraphics MobileCoreServices
90 service_FRAMEWORKS += SystemConfiguration CFNetwork CoreTelephony CoreLocation MapKit
91
92
93 #衔接 ----------------------------dylib------------------------------
94 service_LDFLAGS = -lxml2 -lz -licucore -lgcc -lgcc_eh -lstdc++
95 service_LDFLAGS += -L./BaiduMap/inc -R./BaiduMap/inc/ -lbaidumapapi
96
97 #编译器 ----------------------------------------------------------
98 #service_CFLAGS += -std=c99
99 #service_CFLAGS += -all_load
100
101 #资源文件 ----------------------------------------------------------
102 internal-package::
103 ifneq ($(wildcard $(RESOURCE_DIR)/*.png), )
104 mkdir -p $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)
105 cp $(RESOURCE_DIR)/*.png $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)/
106 endif
107 ifneq ($(wildcard $(RESOURCE_DIR)/*.lproj), )
108 mkdir -p $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)
109 rsync -avC $(RESOURCE_DIR)/*.lproj $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)
110 endif
111 ifneq ($(wildcard $(RESOURCE_DIR)/$(TWEAK_NAME).plist), )
112 mkdir -p $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)
113 cp $(RESOURCE_DIR)/$(TWEAK_NAME).plist $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)
114 endif
115
20行寄存资源文件的本地目录称号:能够自定义 主要是在生成包复制时运用。
- CFLAGS 指定头文件(.h文件)的途径
CFLAGS=-I/usr/include -I/path/include
TWEAK_NAME_CFLAGS += -I./include
有时分LDFLAGS指定-L尽管能让链接器找到库进行链接,可是运行时链接器却找不到这个库,假如要让软件运行时库文件的途径也得到扩展,那么咱们需求添加这两个库给”-Wl,R”:
LDFLAGS = -L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib
IV deploy 布置脚本
#!/bin/sh
cd `dirname $0`
make clean
make package install
scp ./taoke.lua iphone:/private/var/mobile/Media/TouchSprite/lua/#配置IP的host 别号
rm -f ./debs/*
exit 0
4.1 layout的应用
应用场景: 新增图片、文件等资源文件,或许二进制可履行文件;然后在代码中调用运用它们。这个时分能够运用layout目录指定文件到特定的途径。
- 获取文件的代码如下
NSString* resourcePath = @"/Library/Application Support/TweakDemo/";
NSDictionary* resourceDict = [[NSDictionary alloc] initWithContentsOfFile:[resourcePath stringByAppendingPathComponent:@"resource.plist"]];
NSLog(@"resourceDict:%@", resourceDict);
4.2 运用ssh config配置文件来办理ssh衔接
config 文件:设置IP
blog.csdn.net/z929118967/…
# Private 192.168.2
Host iphone
HostName 192.168.2.131
User root
IdentityFile ~/.ssh/id_rsa_Theos125
Host gitlab.cn
HostName gitlab.cn
User git
IdentityFile ~/.ssh/id_rsa_q
# Private github
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa
一个SSH的认证文件能够重复运用到不同的host
devzkndeMacBook-Pro:.ssh devzkn$ ssh-copy-id -i id_rsa_Theos125.pub root@192.168.2.150
V 总结
# 体系配置部分 export THEOS=/opt/theos/
# RESOURCE_DIR = Resources 寄存资源文件的本地目录称号:能够自定义 主要是在生成包复制时运用 #资源文件 ----------------------------------------------------------102 internal-package::
# 调试设备的IP地址
THEOS_DEVICE_IP=iphone150 #5C9
TARGET = iphone:latest:8.0
ARCHS = armv7 arm64
THEOS=/opt/theos
THEOS_MAKE_PATH=$(THEOS)/makefiles
# 引入常用的一般模板
include $(THEOS)/makefiles/common.mk
# 工程称号
TWEAK_NAME =
# :常用的一个宏设置是否显现NSLog 区分是debug仍是release 也能够自己尝试设置其他宏变量
DEBUG = 0
# 编译所需求的的源文件
Taoke_FILES = Taoke.xm
# sdk中的framework
Taoke_FRAMEWORKS = UIKit, Foundation
#CXXFLAGS 表示用于 C++ 编译器的选项。
ADDITIONAL_CCFLAGS = -Qunused-arguments
# gcc等编译器会用到的一些优化参数 也能够在里面指定库文件的位置;例如需求的一些体系静态库和第三方静态库 例如,要链接libsqlite3.0.dylib 、libz.dylib 和dylib1.0 TWEAK_NAME_LDFLAGS = -lz -lsqlite3.0 -dylib1.o 或许运用TWEAK_NAME_OBJ_FILES += libcurl.a 指定库文件的位置的用法:LDFLAGS=-L/usr/lib -L/path/to/your/lib -WL,R 运行时库文件的途径也得到扩展-Wl,R/var/xxx/lib
ADDITIONAL_LDFLAGS = -Wl,-segalign,4000
# CFLAGS 表示用于 C 编译器的选项, 际上涵盖了编译和汇编两个步骤 编译器参数设置 #service_CFLAGS += -std=c99 #service_CFLAGS += -all_load RedRobert_CFLAGS += -Wno-error 忽略的编译过错 TWEAK_NAME_CFLAGS += -I./include
ADDITIONAL_CFLAGS = -Werror -Wobjc-method-access
# 引入tweak模板
include $(THEOS_MAKE_PATH)/tweak.mk
after-install::
install.exec "echo '' > /var/log/syslog"
install.exec "killall -9 WeChat"
install.exec "killall -9 Moon"
see also
iOS 逆向: 批量布置Tweak插件到iOS设备的方案(how to host cydia repo?)
kunnan.blog.csdn.net/article/det…