上次介绍了一个如何用 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. github and SourceTree初步使用

    1.建立连接(一次就行了) 输入你的github名字 2.创建仓库 3.下载仓库 这个时候打开SouceTree就可以看到之前创的仓库了 点击克隆,创建一个文件夹,讲路径设置好 这时候查看本地列表就会 ...

  2. POJ 2181

    #include <iostream> #include <cstdio> #include <cmath> #define MAXN 150005 #includ ...

  3. App接口设计

    关于APP接口设计 http://blog.csdn.net/gebitan505/article/details/37924711/

  4. 关于javascript获取页面高度宽度

    在市容市政项目中,计算jqgrid的自适应高度时,发现jQuery(window).height()和jQuery(document).height()的数值有差异. 最初使用的是jQuery(doc ...

  5. Good Bye 2015 A. New Year and Days 签到

    A. New Year and Days   Today is Wednesday, the third day of the week. What's more interesting is tha ...

  6. HDU5596/BestCoder Round #66 (div.2) 二分BIT/贪心

    GTW likes gt    Memory Limit: 131072/131072 K (Java/Others) 问题描述 从前,有nn只萌萌的GT,他们分成了两组在一起玩游戏.他们会排列成一排 ...

  7. Hadoop InputFormat OutputFormat

    InputFormat有两个抽象方法: getSplits     createRecordReader   InputSplits 将数据按照Split进行切分,一个Split分给一个task执行. ...

  8. weka平台

    weka平台界面简介 纵向排列的四个主要功能 1.探索(写自己的代码) 2.实验(比较算法) 3.可视化 4.命令行 1.探索 先将weka-src.jar文件解压到一个文件夹 将文件夹导入到Elip ...

  9. 【PSR规范专题(3)】PSR-2 代码风格规范

    [PSR规范专题(3)]PSR-2 代码风格规范 标签(空格分隔): PHP 转载自:https://github.com/PizzaLiu/PHP-FIG/blob/master/PSR-2-cod ...

  10. 快速构建自己的CentOS发行版

    一.制作LTOS具体过程 光盘结构介绍 * isolinux 目录存放光盘启动时的安装界面信息 * images 目录包括了必要的启动映像文件 * CentOS 目录存放安装软件包及信息 * .dis ...