上次介绍了一个如何用 Xcode 来构建 Substrate 插件,但是开发的具体过程还没有涉及,而这往往又正是初学者最难下手的地方,所以有了本文的后续。

不过在开始之前你要先做好思想准备,相比较开发一般的 App,开发插件的过程需要大量的探索、尝试,因为未知但又必须知道的东西很多很多,于是有时候运气甚至比技术更重要。

Hook?Substrate?插件?简明释义!

Hook 就是通过某种手段替换掉某个类或者对象的方法的实现,从而达到运行时注入代码的目的。

MobileSubstrate 则为开发者提供了一个方便快捷安全可靠的代码注入开发框架。

插件(这里当然是说 Substrate 插件了)就是指基于这个平台开发的动态库。

获取头文件

Class Dump 是一个用来研究 Objective-C 程序运行时的工具,它可以提取 Mach-O 文件中的类、类别、协议的声明文件。拿到了这些头文件,我们才能知道代码要注入到哪个类,哪个方法。

Class Dump 可以从 Cydia 中获得。

典型用法举例,将 SpringBoard 的头文件输出到 Headers 文件夹:

class-dump -H -o Headers SpringBoard

无参数运行 class-dump 可以查询可用参数及其说明。

又一个例子:SpringBoard.h

//SpringBoard.h

#import "_ABAddressBookCopyLocalizedLabel.h"
#import "UIApplicationDelegate-Protocol.h" @class NSDate, NSDictionary, NSMutableArray, NSMutableSet, NSNumberFormatter, NSSet, NSString, NSTimer, NSURL, SBAppContextHostManager, SBApplication, SBDimmingWindow, SBUIController, UIWindow; @interface SpringBoard : _ABAddressBookCopyLocalizedLabel
{
SBUIController *_uiController;
NSTimer *_menuButtonTimer;
NSTimer *_lockButtonTimer;
NSTimer *_idleTimer;
NSTimer *_autoLockTimer;
double _lastUndimEventTime;
double _lastTimeIdleCausedDim;
double _headsetButtonDownTime;
struct __GSEvent *_headsetDownEvent;
int _headsetClickCount;
SBDimmingWindow *_simulatedBlankingWindow;
unsigned int _headsetButtonClickCount:8;
unsigned int _menuButtonClickCount:8;
unsigned int _screenWasDimOnMenuDown:1;
unsigned int _waitingForMenuDoubleTapAfterActingOnSingleTap:1;
unsigned int _screenshotWasTaken:1;
unsigned int _disableAutoDimming:1;
unsigned int _dontLockOnNextLockUp:1;
unsigned int _poweringDown:1;
unsigned int _headsetDownDelayedActionPerformed:1;
unsigned int _isSeekingInMedia:1;
unsigned int _forcePortraitStatusBarOrientation:1;
unsigned int _lockScreenCameraWantsIdleTimerDisabled:1;
int _mediaSeekDirection;
float _currentBacklightLevel;
unsigned int _springBoardRequestsAccelerometerEvents;
int _activeInterfaceOrientation;
NSURL *_menuDoubleTapURL;
int _notifyDontAnimateREOToken;
int _notifyDontAllowMediaHUDToken;
BOOL _expectsFaceContact;
BOOL _expectsFaceContactInLandscape;
BOOL _proximityEventsEnabled;
NSSet *_restrictionDisabledApplications;
double _sampleSystemStartTime;
NSDictionary *_startAppsCPUTimes;
struct __CFDictionary *_registeredSimpleRemoteAppToPriority;
SBApplication *_registeredSimpleRemoteApp;
SBApplication *_nowPlayingApp;
SBApplication *_menuButtonInterceptApp;
BOOL _menuButtonInterceptAppEnabledForever;
NSString *_originatingOpenURLDisplayId;
NSMutableArray *_disableNowPlayingHUDAssertionBundleIds;
NSMutableArray *_appsRegisteredForVolumeEvents;
NSNumberFormatter *_decimalFormatter;
NSNumberFormatter *_percentFormatter;
NSTimer *_midnightTimer;
NSDate *_midnightFireDate;
struct _opaque_pthread_t *_backgroundMIGServerThread;
struct _opaque_pthread_t *_iconGenerationMIGServerThread;
SBAppContextHostManager *_springBoardContextHostManager;
UIWindow *_springBoardContextHostWindow;
NSMutableSet *_displaysRequestingAggressiveJetsamMode;
} + (BOOL)registerForSystemEvents;
+ (BOOL)rendersLocally;
- (id)init;
- (void)_createLogFile;
- (void)writeLogFile;
- (void)handleKeyEvent:(struct __GSEvent *)fp8;
- (void)setHardwareKeyboardLayoutName:(id)fp8;
- (void)updateStackshotSettings;
- (void)updatePowerlog;
- (void)_performDeferredLaunchWork;
- (void)applicationDidFinishLaunching:(id)fp8;
- (void)appleIconViewRemoved;
- (BOOL)launchedAfterLanguageRestart;
- (void)clearLaunchedAfterLanguageRestart;
- (id)_settingLanguageStringForNewLanguage;
- (void)languageChanged;
- (void)_rotateView:(id)fp8 toOrientation:(int)fp12;
- (void)wipeDeviceNow;
- (void)checkPasscodeCompliance;
- (void)showEDGEActivationFailureAlert:(id)fp8 reason:(id)fp12 forMMS:(BOOL)fp16;
- (void)_effectiveSettingsDidChange;
- (void)_assistantPreferenceDidChange:(id)fp8;
- (void)_profileListDidChange;
- (void)userDefaultsDidChange:(id)fp8;
- (void)_lockdownActivationChanged:(id)fp8;
- (void)_testPhoneAlerts;
- (void)runFieldTestScript;
- (void)_significantTimeChange;
- (void)significantTimeChange;
- (void)batteryStatusDidChange:(id)fp8;
- (BOOL)shouldRunFieldTestScript;
- (BOOL)iapIsInExtendedMode;
- (BOOL)canShowLockScreenHUDControls;
- (BOOL)lockScreenCameraSupported;
- (BOOL)canShowLockScreenCameraKnob;
- (BOOL)canShowNowPlayingControls;
- (void)setAppDisabledNowPlayingHUD:(BOOL)fp8 bundleIdentifier:(id)fp12;
- (BOOL)respondImmediatelyToMenuSingleTapAllowingDoubleTap:(char *)fp8;
- (void)goToSpotlight:(BOOL)fp8;
- (BOOL)handleDoubleTapAction;
- (void)handleMenuDoubleTap;
- (void)_primeMenuButtonAssistant;
- (void)_setMenuButtonTimer:(id)fp8;
- (void)_setLockButtonTimer:(id)fp8;
- (void)cancelMenuButtonRequests;
- (void)clearMenuButtonTimer;
- (void)_menuButtonWasHeld;
- (double)_menuHoldTime;
- (void)menuButtonDown:(struct __GSEvent *)fp8;
- (void)menuButtonUp:(struct __GSEvent *)fp8;
- (void)_giveUpOnMenuDoubleTap;
- (void)_keyboardAvailabilityChanged;
- (void)_runActivateAssistantTest;
- (void)_activateAssistantWithEvent:(int)fp8 withCompletion:(id)fp(null);
- (void)activateAssistantWithOptions:(id)fp8 withCompletion:(id)fp(null);
- (void)_startSeekWithDirection:(id)fp8;
- (void)mediaKeyDown:(struct __GSEvent *)fp8;
- (void)mediaKeyUp:(struct __GSEvent *)fp8;
- (void)_handleMenuButtonEvent;
- (void)lockButtonDown:(struct __GSEvent *)fp8;
- (void)lockButtonWasHeld;
- (void)extendButtonTimersForWake;
- (void)_powerDownNow;
- (void)_rebootNow;
- (void)reboot;
- (void)powerDown;
- (BOOL)isPoweringDown;
- (void)powerDownRequested:(id)fp8;
- (void)powerDownCanceled:(id)fp8;
- (BOOL)relaunchingForSetupLanguageChange;
- (void)relaunchSpringBoard;
- (void)_relaunchSpringBoardNow;
- (void)lockButtonUp:(struct __GSEvent *)fp8;
- (void)_performDelayedHeadsetActionForAssistant;
- (void)_performDelayedHeadsetActionForVoiceControl;
- (void)_performDelayedHeadsetClickTimeout;
- (id)simpleRemoteDestinationApp;
- (void)sendSimpleRemoteActionToRegisteredApp:(int)fp8;
- (void)_iapServerConnectionDiedNotification:(id)fp8;
- (void)_iapExtendedModeReset;
- (void)_imagesMounted;
- (void)_setDeferredHeadsetButtonDownEvent:(struct __GSEvent *)fp8;
- (void)headsetButtonDown:(struct __GSEvent *)fp8;
- (void)headsetButtonUp:(struct __GSEvent *)fp8;
- (void)headsetAvailabilityChanged:(struct __GSEvent *)fp8;
- (void)smsPrefsChanged;
- (void)ALSPrefsChanged:(id)fp8;
- (void)profileConnectionDidReceiveEffectiveSettingsChangedNotification:(id)fp8 userInfo:(id)fp12;
- (void)updateCapabilitiesAndIconVisibility;
- (BOOL)isDisplayIdentifierRestrictionDisabled:(id)fp8;
- (void)loadDebuggingAndDemoPrefs;
- (void)debuggingAndDemoPrefsWereChanged;
- (void)_localeChanged;
- (void)localeChanged;
- (void)autoLockPrefsChanged;
- (void)pinPolicyChanged;
- (void)profileConnectionDidReceiveRestrictionChangedNotification:(id)fp8 userInfo:(id)fp12;
- (void)profileConnectionDidReceivePasscodePolicyChangedNotification:(id)fp8 userInfo:(id)fp12;
- (void)ringerChanged:(int)fp8;
- (void)_updateRingerStateWithVisuals:(BOOL)fp8 updatePreferenceRegister:(BOOL)fp12;
- (void)accessoryKeyStateChanged:(struct __GSEvent *)fp8;
- (unsigned int)_frontmostApplicationPort;
- (void)quitTopApplication:(struct __GSEvent *)fp8;
- (void)applicationExited:(struct __GSEvent *)fp8;
- (void)anotherApplicationFinishedLaunching:(struct __GSEvent *)fp8;
- (void)applicationSuspend:(struct __GSEvent *)fp8;
- (void)applicationSuspended:(struct __GSEvent *)fp8;
- (void)applicationSuspendedSettingsUpdated:(struct __GSEvent *)fp8;
- (void)statusBarReturnActionTap:(struct __GSEvent *)fp8;
- (int)statusBar:(id)fp8 styleForRequestedStyle:(int)fp12 overrides:(int)fp16;
- (void)hideSpringBoardStatusBar;
- (void)showSpringBoardStatusBar;
- (void)setMetaHostingEnabled:(BOOL)fp8;
- (BOOL)isMetaHostingEnabled;
- (id)metaHostView;
- (id)metaHostWindow;
- (void)showAlertForUnhandledURL:(id)fp8 error:(int)fp12;
- (void)_applicationOpenURL:(id)fp8 event:(struct __GSEvent *)fp12;
- (BOOL)applicationCanOpenURL:(id)fp8 publicURLsOnly:(BOOL)fp12;
- (void)applicationOpenURL:(id)fp8;
- (void)applicationOpenURL:(id)fp8 publicURLsOnly:(BOOL)fp12;
- (void)applicationOpenURL:(id)fp8 publicURLsOnly:(BOOL)fp12 animating:(BOOL)fp16;
- (void)applicationOpenURL:(id)fp8 publicURLsOnly:(BOOL)fp12 animating:(BOOL)fp16 sender:(id)fp20;
- (void)applicationOpenURL:(id)fp8 publicURLsOnly:(BOOL)fp12 animating:(BOOL)fp16 additionalActivationFlag:(unsigned int)fp20;
- (void)applicationOpenURL:(id)fp8 publicURLsOnly:(BOOL)fp12 animating:(BOOL)fp16 sender:(id)fp20 additionalActivationFlag:(unsigned int)fp24;
- (void)_openURLCore:(id)fp8 display:(id)fp12 publicURLsOnly:(BOOL)fp16 animating:(BOOL)fp20 additionalActivationFlag:(unsigned int)fp24;
- (BOOL)canOpenURL:(id)fp8;
- (BOOL)openURL:(id)fp8;
- (void)setMenuButtonInterceptApp:(id)fp8 forever:(BOOL)fp12;
- (id)menuButtonInterceptApp;
- (BOOL)menuButtonInterceptAppEnabledForever;
- (void)setWantsVolumeButtonEvents:(BOOL)fp8;
- (void)setAppRegisteredForVolumeEvents:(id)fp8 isActive:(BOOL)fp12;
- (id)appsRegisteredForVolumeEvents;
- (void)volumeChanged:(struct __GSEvent *)fp8;
- (void)setBacklightFactorPending:(float)fp8;
- (void)setBacklightFactor:(float)fp8 keepTouchOn:(BOOL)fp12;
- (void)setBacklightFactor:(float)fp8;
- (void)animateBacklightToFactor:(float)fp8 duration:(double)fp12 keepTouchOn:(BOOL)fp20 didFinishTarget:(id)fp24 selector:(SEL)fp28;
- (void)animateBacklightToFactor:(float)fp8 duration:(double)fp12 didFinishTarget:(id)fp20 selector:(SEL)fp24;
- (void)setBacklightLevel:(float)fp8;
- (void)setBacklightLevel:(float)fp8 permanently:(BOOL)fp12;
- (float)currentBacklightLevel;
- (float)systemBacklightLevel;
- (void)systemWillSleep;
- (void)setupMidnightTimer;
- (void)_midnightPassed;
- (void)_adjustMidnightTimerAfterSleep;
- (void)setBacklightFactorToZero;
- (void)cancelSetBacklightFactorToZeroAfterDelay;
- (void)setBacklightFactorToZeroAfterDelay;
- (void)showSimulatedScreenBlank;
- (void)hideSimulatedScreenBlank;
- (void)dimToBlackKeepingTouchOn;
- (void)undim;
- (void)lockAfterCall;
- (BOOL)shouldDimToBlackInsteadOfLock;
- (void)autoLock;
- (void)didIdle;
- (double)nextIdleTimeDuration;
- (double)nextLockTimeDuration;
- (void)clearIdleTimer;
- (void)resetIdleTimerAndUndim;
- (void)resetIdleTimerAndUndim:(BOOL)fp8;
- (void)_proximityChanged:(id)fp8;
- (BOOL)caseIsEnabledAndLatched;
- (BOOL)allowCaseLatchLockAndUnlock;
- (void)keyboardOrCaseLatchWantsToAttemptUnlock:(id)fp8;
- (void)noteCaseHardwarePresent;
- (void)caseLatchWantsToAttemptLock;
- (void)userEventOccurred;
- (void)_updateRejectedInputSettingsForInCallState:(BOOL)fp8 isOutgoing:(BOOL)fp12 triggeredbyRouteWillChangeToReceiverNotification:(BOOL)fp16;
- (void)updateRejectedInputSettingsForInCallState:(BOOL)fp8 isOutgoing:(BOOL)fp12;
- (void)updateRejectedInputSettings;
- (void)updateRejectedInputSettingsTriggeredByRouteChangeToReceiverNotification:(BOOL)fp8;
- (void)lockDevice:(struct __GSEvent *)fp8;
- (void)showThermalAlertIfNecessary;
- (void)respondToCurrentThermalCondition;
- (void)_beginThermalJetsamCPUSampling;
- (void)_killThermallyActiveApplication;
- (id)_newAppsCPUTimesDictionary;
- (void)didReceiveMemoryWarning;
- (void)noteSubstantialTransitionOccured;
- (void)updateMirroredDisplayOrientation;
- (void)noteInterfaceOrientationChanged:(int)fp8;
- (void)noteInterfaceOrientationChanged:(int)fp8 updateMirroredDisplays:(BOOL)fp12;
- (int)activeInterfaceOrientation;
- (int)activeInterfaceOrientationWithoutConsideringAlerts;
- (int)_frontMostAppOrientation;
- (int)interfaceOrientationForCurrentDeviceOrientation;
- (void)reportStatusBarOrientationAsPortrait:(BOOL)fp8;
- (int)statusBarOrientation;
- (void)_overrideDefaultInterfaceOrientationWithOrientation:(int)fp8;
- (void)_removeDefaultInterfaceOrientatationOverride;
- (id)displayIDForURLScheme:(id)fp8 isPublic:(BOOL)fp12;
- (BOOL)_alertWindowShouldRotate;
- (double)windowRotationDuration;
- (void)setSystemVolumeHUDEnabled:(BOOL)fp8 forAudioCategory:(id)fp12;
- (void)_migrateMenuDoubleTapSetting;
- (void)updateMenuDoubleTapSettings;
- (void)setZoomTouchEnabled:(BOOL)fp8;
- (BOOL)proximityEventsEnabled;
- (void)setProximityEventsEnabled:(BOOL)fp8;
- (BOOL)expectsFaceContact;
- (BOOL)expectsFaceContactInLandscape;
- (void)setExpectsFaceContact:(BOOL)fp8 inLandscape:(BOOL)fp12;
- (void)setExpectsFaceContact:(BOOL)fp8;
- (void)updateProximitySettings;
- (void)frontDisplayDidChange;
- (void)applicationWillOrderInContext:(id)fp8 windowLevel:(float)fp12 windowOutput:(int)fp16;
- (void)applicationDidOrderOutContext:(id)fp8;
- (void)didDismissMiniAlert;
- (void)willDisplayMiniAlert:(int *)fp8;
- (void)willDismissMiniAlert:(int *)fp8 andShowAnother:(BOOL)fp12;
- (void)setHasMiniAlerts:(BOOL)fp8;
- (BOOL)canShowAlerts;
- (BOOL)isLocked;
- (int)alertInterfaceOrientation;
- (void)launchMusicPlayerSuspended;
- (void)_launchMusicPlayerSuspendedAndStartMusic;
- (void)_tearDownNow;
- (void)tearDown;
- (void)_nowPlayingAppDidChangeNotification:(id)fp8;
- (BOOL)isMusicPlayerInNowPlayingView;
- (id)nowPlayingApp;
- (BOOL)isNowPlayingAppPlaying;
- (BOOL)isMusicPlayerPlaying;
- (void)setNowPlayingInfo:(id)fp8 forApplication:(id)fp12;
- (void)_updateRegisteredSimpleRemoteApp;
- (void)setSimpleRemoteRoutingPriority:(unsigned int)fp8 forApplication:(id)fp12;
- (unsigned int)simpleRemoteRoutingPriorityForApplication:(id)fp8;
- (unsigned int)simpleRemoteRoutingPriority;
- (void)setIdleTimerDisabled:(BOOL)fp8;
- (void)setSuspensionAnimationDelay:(double)fp8;
- (BOOL)isCameraApp;
- (id)formattedDecimalStringForNumber:(id)fp8;
- (id)formattedPercentStringForNumber:(id)fp8;
- (id)_accessibilityFrontMostApplication;
- (id)_accessibilityTopDisplay;
- (id)_accessibilityRunningApplications;
- (BOOL)_accessibilityIsSystemGestureActive;
- (BOOL)_accessibilityObjectWithinProximity;
- (void)_accessibilitySetEventTapCallback:(void *)fp8;
- (void *)_accessibilityEventTapCallback;
- (void)_accessibilityProcessHIDEvent:(struct __IOHIDEvent *)fp8;
- (BOOL)_accessibilityIsSBStealingEvents;
- (double)_accessibilityActivationAnimationStartDelay;
- (void)_accessibilityActivationAnimationWillBegin;
- (double)_accessibilityDeactivationAnimationStartDelay;
- (void)_accessibilityDeactivationAnimationWillBegin;
- (BOOL)_isSwitcherShowing;
- (void)_setStatusBarShowsProgress:(BOOL)fp8;
- (void)_spokenLanguageChanged;
- (void)beginListeningForAssistantActivationGesture;
- (void)stopListeningForAssistantActivationGesture;
- (void)setSystemAggressiveJetsamEnabled:(BOOL)fp8 forDisplay:(id)fp12; @end

这样我们就知道了 SpringBoard 中有一个 SpringBoard 类,以及这个类中声明的所有方法的名称、返回类型、参数类型和数量。然后就可以按照之前介绍的方法修改你想要修改的方法的实现了。

但为了实现既定目标到底该修改哪个方法的实现,又该如何修改,这就是需要不断尝试和探索的地方了。

冒险才刚刚开始

方法名称提供了很多的信息,让我们知道这个方法大概和什么有关,但是参数和返回值的意义就不太清晰了。这里给个小提示,可以通过注入 NSLog 输出参数和返回值来获取更多信息。

总之,想方设法获取需要的信息,而直接按照常理猜测原始实现的各种可能性来试验也不失为一个好方法。

最后的最后,再啰嗦一句,万一有同学不知道的话。编译好的动态库要放到 iOS 设备的这个目录:

/Library/MobileSubstrate/DynamicLibraries

用 Xcode 开发 Cydia Substrate 插件(二)的更多相关文章

  1. 用 Xcode 开发 Cydia Substrate 插件(一)

    关于这方面的中文资料太少了,以至于可能很多对插件开发感兴趣的孩子们都不知从何下手,于是呢我就写了这篇文章,希望对你能有所帮助.如果你觉得文章内容有什么错误呢也请提出来. 准备开发环境 1. 从 App ...

  2. 利用Cydia Substrate进行Android HOOK(二)

    在前面关于Substrate的介绍中我们已经讲了用Substrate hook java代码,现在我们讲下怎么用它hook native代码.hook native代码我们需要编写Substrate ...

  3. 金蝶K3 wise 插件二次开发与配置

    金蝶K3 wise 插件二次开发与配置 开发环境:K/3 Wise 13.0.K/3 Bos开发平台.Visual Basic 6.0 目录 一.二次开发插件编程二.代码演示三.配置插件四.测试插件五 ...

  4. Xcode好用的插件

    注释:每当Xcode升级之后,都会导致原有的Xcode插件不能使用,这是因为每个插件的Info.plist中记录了该插件兼容Xcode版本的DVTPlugInCompatibilityUUID,而每个 ...

  5. Xcode好用的插件(随时更新)

    古人云"工欲善其事必先利其器",打造一个强大的开发环境,是立即提升自身战斗力的绝佳途径!下面简单介绍下插件是什么.如何使用Xcode插件以及一些常用的Xcode插件的推荐. 一.插 ...

  6. 利用Cydia Substrate进行Android HOOK

    Cydia Substrate是一个代码修改平台.它可以修改任何主进程的代码,不管是用Java还是C/C++(native代码)编写的.而Xposed只支持HOOK app_process中的java ...

  7. Android HOOK工具Cydia Substrate使用详解

    目录(?)[+] Substrate几个重要API介绍 MShookClassLoad MShookMethod 使用方法 短信监控实例   Cydia Substrate是一个代码修改平台.它可以修 ...

  8. Android上玩玩Hook:Cydia Substrate实战

    作者简介:周圣韬,百度高级Android开发工程师,博客地址:http://blog.csdn.net/yzzst 了解Hook 还没有接触过Hook技术读者一定会对Hook一词感觉到特别的陌生,Ho ...

  9. 那些Xcode不能错过的插件

    转载来自网络   古人云“工欲善其事必先利其器”,打造一个强大的开发环境,是立即提升自身战斗力的绝佳途径!以下是搜集的一些有力的XCode插件.   1.全能搜索家CodePilot 2.0 你要找的 ...

随机推荐

  1. HDU 1041 Computer Transformation (简单大数)

    Computer Transformation http://acm.hdu.edu.cn/showproblem.php?pid=1041 Problem Description A sequenc ...

  2. hdu5593/ZYB's Tree 树形dp

    ZYB's Tree    Memory Limit: 131072/131072 K (Java/Others) 问题描述 ZYBZYB有一颗NN个节点的树,现在他希望你对于每一个点,求出离每个点距 ...

  3. Tencent 的电话面试

    Tencent的实习生招聘投了简历.然后,万万没想到昨晚腾讯IEG直接给我电话了.当时就惊呆了,我都没有找人内推,就直接电话面试了. 就为昨晚的电话面试写写感想吧!问的挺多的,基本上简历上写了的都问到 ...

  4. JDK安装(windows/linux)

    双击安装...安装之后需要进行一些相关的配置工作...下面是我自己总结的安装和配置步骤: (1)非Win7系统 第一步:安装jdk,下载地址:http://www.oracle.com/technet ...

  5. C# winform post请求数据

    刚到公司混的时候,老板要求实现一个从C#的windows应用程序传参数到一个网页,然后这个网页不显示出来,但能把数据返回给应用程序的功能,问了好多人,找了好多资料,都搞不定,后来还是在老板的帮助下搞定 ...

  6. YII框架的依赖注入容器与服务定位器简述

    依赖注入容器 依赖注入(Dependency Injection,DI)容器就是一个对象use yii\di\Container,它知道怎样初始化并配置对象及其依赖的所有对象. 依赖注入和服务定位器都 ...

  7. php脚本的执行过程(编译与执行相分离)

    php脚本的执行过程(编译与执行相分离) 深入理解PHP代码的执行的过程 PHP程序的执行流程 Apache + PHP 的并发访问

  8. linux下如何查看和修改系统BLOCK的大小

    http://blog.163.com/drachen@126/blog/static/162607494201271435333906/ 查看os系统块的大小 [root]# /sbin/tune2 ...

  9. java--vo

    VO是跟数据库里表的映射,一个表对应一个VO DAO是用VO来访问真实的表,对数据库的操作都在DAO中完成 BO是业务层,做逻辑处理的 VO , PO , BO , QO, DAO ,POJO, O/ ...

  10. WaitForSingleObject与WaitForMultipleObjects用法详解(好用,而且进入一个非常高效沉睡状态,只占用极少的CPU时间片)

    在多线程下面,有时候会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以使用Windows API函数WaitForSingleObject,或者WaitForMultipleObjects ...