標籤:des android http io ar color os 使用 sp
01 January 2014Mobile Substrate和Theos
Mobile Substrate是Cydia的作者Jay Freeman (@saurik)的另外一個牛X的作品,也叫Cydia Substrate,它的主要功能是hook某個App,修改代碼比如替換其中方法的實現,Cydia上的tweak都是基於Mobile Substrate實現的。目前支援iOS和Android平台。
根據github上的介紹,theos是一個跨平台iPhone Makefile系統。它的主要功能是產生iPhone 越獄App、tweak等程式的架構結構,並提供makefile來編譯、打包和安裝。
需要的準備工作:
####Mac * 安裝Theos,從Theos的GitHub上clone下來一份,放到某個目錄下,這裡我放到了/opt/
下。 * 安裝Xcode Command Line Tools,可以在命令列下執行xcode-select --install
來安裝或者參考SO來安裝,安裝完之後再進行下一步。 * 安裝dpkg ,首先安裝MacPorts,可以通過它的官網,根據自己的系統版本來選擇。安裝好之後,重啟Terminal,執行port version
,顯示出版本號碼說明安裝成功。如果提示command not found
,嘗試在/etc/paths
檔案中加入下面兩個路徑:/opt/local/bin
/opt/local/sbin
,需要使用root許可權來編輯,比如用Vim的話:sudo vi /etc/paths
. 重啟Terminal,再次輸入port version
就應該會顯示版本號碼了,然後執行sudo port selfupdate
來更新一下,之後執行sudo port install dpkg
來安裝dpkg. 安裝dpkg的目的是把我們寫的tweak打成deb包。
JailBreaked iPhone iOS 5/6
- 安裝OpenSSH,開啟Cydia的主介面就能看到
OpenSSH Access How-To
以及Root Password How-To
的選項,可以按照它的提示一步一步安裝,這裡不贅述了,需要提醒的是一定要改掉root的密碼,防止別人通過SSH串連到你的手機。這一步是為了後面我們通過SSH串連到手機,把deb包安裝到手機上準備的。
iOS7上的Mobile Substrate還有bug,32位的系統下每次重啟後需要重新安裝Mobile Substrate才能正常使用, 64位今天貌似才能用。推薦暫時在iOS5/6的機器上測試[2014-01-01]。
- apt. 在cydia中搜尋Apt檢查是否已經安裝,沒有安裝就安裝一下。
- ldid. 全名是Link Identify Editor,也直接可以在Cydia中搜尋全名安裝。
建立Tweak並安裝到手機上
首先我在案頭上建立一mytweaks
的檔案夾,儲存我們要建立的tweak程式。
? ~ cd ~/Desktop? Desktop mkdir mytweaks? Desktop cd mytweaks
然後執行我們剛才的獲得的theos來產生一個tweak的模板:
? mytweaks /opt/theos/bin/nic.plNIC 2.0 - New Instance Creator------------------------------ [1.] iphone/application [2.] iphone/library [3.] iphone/preference_bundle [4.] iphone/tool [5.] iphone/tweakChoose a Template (required): 5Project Name (required): FirstTweakPackage Name [com.yourcompany.firsttweak]: com.joeyio.firsttweakAuthor/Maintainer Name [Joey]:[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]:[iphone/tweak] List of applications to terminate upon installation (space-separated, ‘-‘ for none) [SpringBoard]:Instantiating iphone/tweak in firsttweak/...Done.
在建立模板的時候,我們選擇5,建立一個iPhone的tweak.其他4個選項可以自己去搜尋下。名字輸入FirstTweak,包名我輸入com.joeyio.firsttweak,下面的三個選項都直接斷行符號使用預設值。
MobileSubstrate Bundle filter
這一項表示要hook的程式,預設是com.apple.springboard
,就是hook Spring Board,如果你想hook別的App,這裡改成那個App的BundleID.
OK,那麼我們的第一個tweak就建立好了,好像一點也不難啊。進入到firsttweak目錄下,使用make
編譯一下,可能結果是這樣的:
? firsttweak make/Users/qiaoxueshi/Desktop/mytweaks/firsttweak/theos/makefiles/targets/Darwin/iphone.mk:41: Deploying to iOS 3.0 while building for 6.0 will generate armv7-only binaries.Making all for tweak FirstTweak... Preprocessing Tweak.xm...Name "Data::Dumper::Purity" used only once: possible typo at /Users/qiaoxueshi/Desktop/mytweaks/firsttweak/theos/bin/logos.pl line 615. Compiling Tweak.xm... Linking tweak FirstTweak... Stripping FirstTweak... Signing FirstTweak... /bin/sh: ldid: command not found
我們看到裡面有2個警告,第一個我沒有搜尋到什麼結果,第二個是只要手機上安裝ldid就行了,這裡不用管它。我自己試了一下,是可以安裝到手機上的,可以暫時忽略,如果哪位小夥伴知道什麼原因,歡迎告知。
在部署到手機之前確認手機和電腦在一個wifi環境下,並且可以通過SSH串連到手機,方法是在Terminal下,通過SSH串連到手機,之後會提示你輸入root密碼(上面安裝SSH步驟中有提到),確保串連成功再往下進行。手機的IP地址可以在wifi設定中看到。
ssh [email protected]手機IP地址
然後把手機IP地址放在THEOS_DEVICE_IP
環境變數中,這樣theos才知道安裝到哪裡,如下:
export THEOS_DEVICE_IP=手機IP地址
然後執行make package install
打包並安裝到手機上 (如果Cydia在前台,把它退到後台,否則安裝會失敗):
? firsttweak make package install/Users/qiaoxueshi/Desktop/mytweaks/firsttweak/theos/makefiles/targets/Darwin/iphone.mk:41: Deploying to iOS 3.0 while building for 6.0 will generate armv7-only binaries.Making all for tweak FirstTweak...make[2]: Nothing to be done for `internal-library-compile‘.Making stage for tweak FirstTweak...dpkg-deb:正在建立軟體包“com.joeyio.firsttweak”,包檔案為“./com.joeyio.firsttweak_0.0.1-2_iphoneos-arm.deb”。install.exec "cat > /tmp/_theos_install.deb; dpkg -i /tmp/_theos_install.deb && rm /tmp/_theos_install.deb" < "./com.joeyio.firsttweak_0.0.1-2_iphoneos-arm.deb"[email protected]‘s password:Selecting previously deselected package com.joeyio.firsttweak.(Reading database ... 6250 files and directories currently installed.)Unpacking com.joeyio.firsttweak (from /tmp/_theos_install.deb) ...Setting up com.joeyio.firsttweak (0.0.1-2) ...install.exec "killall -9 SpringBoard"[email protected]‘s password:
安裝過程中需要輸入兩次手機Root密碼,一次是為了把打包後的deb程式檔案傳到手機上,另外一次是kill掉SpringBoard,使SpringBoard重啟。
完成後在Cydia裡的“變更”裡,往下翻一翻,就能看到一個名字為“FirstTweak”的外掛程式了了,想想接下來出任CEO,迎娶白富美,走向人生巔峰,有木有一點小激動?
完成一個小功能
到目前為止,我們還沒寫過一行代碼呢。下面我們要完成一個小功能:在鎖定畫面增加一個UILabel顯示一行文字,可以是你的座右銘或者其他的,這裡我們顯示Hello, MobileSubstate!!
。
開啟我們剛才建立的firsttweak目錄下的Makefile
檔案,在FirstTweak_FILES = Tweak.xm
下面增加一行FirstTweak_FRAMEWORKS = UIKit
並儲存檔案,首碼都是TWEAK_NAME
的值,也就是FirstTweak
,注意根據你自己的情況來修改。增加這行的原因很明顯,增加UILabel需要用到UIKit Framework。整個檔案看起來像這樣:
include theos/makefiles/common.mkTWEAK_NAME = FirstTweakFirstTweak_FILES = Tweak.xmFirstTweak_FRAMEWORKS = UIKitinclude $(THEOS_MAKE_PATH)/tweak.mkafter-install:: install.exec "killall -9 SpringBoard"
這個步驟完成之後,我們就要找到鎖定畫面對應的ViewController,然後替換它的某個方法,把UILabel添加到它的view上。這個ViewController的名字叫SBAwayController
, SB是SpringBoard
的縮寫,不要想偏了 :).我們要替換它的- (void)activate
方法。SBAwayController
類的標頭檔可以在iOS6的私人類的標頭檔中找到。在SBAwayController裡有個叫_awayView
的ivar
,獲得這個ivar需要一個theos中不存在的方法,好吧,它叫MSHookIvar
,這個方法在預設的theos的substrate.h
標頭檔裡沒有,可以在GitHub得到包含這個方法的標頭檔。下載到本地,覆蓋theos/include下的同名檔案(推薦將原有的substrate.h
標頭檔重新命名)。
OK,到這裡萬事具備,只欠Coding了。
開啟firsttweak目錄下的Tweak.xm
檔案並清空,添加下面這段代碼:
%hook SBAwayController - (void)activate { %orig(); //invoke the orignal method to do what should to do. NSLog(@"========================================================="); NSLog(@"Hello MobileSubstrate!!"); NSLog(@"========================================================="); //get _awayView via MSHookIvar method UIView *_awayView = MSHookIvar<*>(self, "_awayView"); //create a lable whose width = 200 and height = 100 and add to _awayView float w = 200; float h = 100; UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake((_awayView.frame.size.width - w)/2,100,w,h)]; label.text = @"Hello, MobileSubstate!!"; label.textAlignment = NSTextAlignmentCenter; label.backgroundColor = [UIColor clearColor]; label.textColor = [UIColor whiteColor]; [_awayView addSubview:label];}%end
大概解釋一下,%hook SBAwayController
以及裡面的- (void)activate
方法,其實就類似swizzling了SBAwayController
的activate
方法。當系統執行SBAwayController
的activate
方法的時候會執行tweak裡的activate
的方法。 在這裡方法裡我們先執行了%orig()
,就是執行原來的activate
方法,保證原有的方法先執行,再執行我們自己的代碼。
這個activate
方法在第一次進入鎖定畫面的時候會執行,在以後每次非鎖屏狀態下,按關機鍵也會執行。
接下來就是通過MSHookIvar
獲得_awayView
。然後就是我們非常熟悉的了,建立一個UILabel,添加到_awayView
裡。到這裡就結束了。make package install
一下(還需要先執行一下export THEOS_DEVICE_IP=手機IP地址
),安裝到手機上,等SpringBoard重啟完,你會看到類似的介面:
把手機串連到電腦上,開啟Xcode,在Organizer裡的Console裡能看到程式中使用NSLog列印的資訊,用來調試很方便呢。
總結
本文主要是講Mobile Substrate的作用以及如何使用Theos開發一個簡單的tweak。有了這些入門的基礎之後,你就可以根據自己的想法來寫自己喜歡的tweak。如果你是在iOS7下越獄的話,可以嘗試一下把控制中心的AirDrop和音樂播放器給隱藏掉,讓控制中心看起來更簡潔。接著可以再進行改進,比如在藍芽關閉的時候不顯示AirDrop,開啟的時候依然顯示,音樂現正播放的時候顯示音樂播放器,否則不顯示。
這個小Demo是前兩周寫的,一直沒有時間整理出來,今天抽時間整理了一下文字發了出來,算是送給自己新年的一件禮物吧!
Thanks,Have Fun!
More About Substrate And Theos
- iphonedevwiki
- Theos/Getting Started
- Cydia Substrate(Mobile Substrate也叫做Cydia Substrate)
使用Theos做一個簡單的Mobile Substrate Tweak