本文转载自:http://blog.csdn.net/yangwen123/article/details/8177702

Android系统服务线程都驻留在SystemServer进程中,由SystemServer启动,在SystemServer.init2函数中,通过启动一个线程来启动各种系统服务线程。

  1. public static final void init2() {
  2. Slog.i(TAG, "Entered the Android system server!");
  3. Thread thr = new ServerThread();// 创建一个线程
  4. thr.setName("android.server.ServerThread");//设置线程名称
  5. thr.start();/启动该线程
  6. }

android系统服务都是在thr线程的run函数中启动:

  1. public void run() {
  2. EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN,SystemClock.uptimeMillis());
  3. Looper.prepare();//创建一个消息循环对象
  4. android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);
  5. BinderInternal.disableBackgroundScheduling(true);
  6. android.os.Process.setCanSelfBackground(false);
  7. // Critical services...
  8. try {
  9. Slog.i(TAG, "Activity Manager");
  10. //①启动ActivityManagerService服务线程
  11. context = ActivityManagerService.main(factoryTest);
  12. ................................................
  13. //②向ServiceManager注册自己
  14. ActivityManagerService.setSystemProcess();
  15. ................................................
  16. Slog.i(TAG, "System Content Providers");
  17. //③安装系统Providers
  18. ActivityManagerService.installSystemProviders();
  19. ................................................
  20. //④设置ActivityManagerService的成员变量mWindowManager
  21. ActivityManagerService.self().setWindowManager(wm);
  22. ................................................
  23. } catch (RuntimeException e) {
  24. Slog.e("System", "******************************************");
  25. Slog.e("System", "************ Failure starting core service", e);
  26. }
  27. //⑤调用systemReady函数为系统准备各种服务
  28. ActivityManagerService.self().systemReady(new Runnable() {
  29. public void run() {
  30. Slog.i(TAG, "Making services ready");
  31. startSystemUi(contextF);
  32. try {
  33. if (batteryF != null) batteryF.systemReady();
  34. } catch (Throwable e) {
  35. reportWtf("making Battery Service ready", e);
  36. }
  37. try {
  38. if (networkManagementF != null) networkManagementF.systemReady();
  39. } catch (Throwable e) {
  40. reportWtf("making Network Managment Service ready", e);
  41. }
  42. try {
  43. if (networkStatsF != null) networkStatsF.systemReady();
  44. } catch (Throwable e) {
  45. reportWtf("making Network Stats Service ready", e);
  46. }
  47. try {
  48. if (networkPolicyF != null) networkPolicyF.systemReady();
  49. } catch (Throwable e) {
  50. reportWtf("making Network Policy Service ready", e);
  51. }
  52. try {
  53. if (connectivityF != null) connectivityF.systemReady();
  54. } catch (Throwable e) {
  55. reportWtf("making Connectivity Service ready", e);
  56. }
  57. try {
  58. if (dockF != null) dockF.systemReady();
  59. } catch (Throwable e) {
  60. reportWtf("making Dock Service ready", e);
  61. }
  62. try {
  63. if (usbF != null) usbF.systemReady();
  64. } catch (Throwable e) {
  65. reportWtf("making USB Service ready", e);
  66. }
  67. try {
  68. if (uiModeF != null) uiModeF.systemReady();
  69. } catch (Throwable e) {
  70. reportWtf("making UI Mode Service ready", e);
  71. }
  72. try {
  73. if (recognitionF != null) recognitionF.systemReady();
  74. } catch (Throwable e) {
  75. reportWtf("making Recognition Service ready", e);
  76. }
  77. Watchdog.getInstance().start();
  78. // It is now okay to let the various system services start their
  79. // third party code...
  80. try {
  81. if (appWidgetF != null) appWidgetF.systemReady(safeMode);
  82. } catch (Throwable e) {
  83. reportWtf("making App Widget Service ready", e);
  84. }
  85. try {
  86. if (wallpaperF != null) wallpaperF.systemReady();
  87. } catch (Throwable e) {
  88. reportWtf("making Wallpaper Service ready", e);
  89. }
  90. try {
  91. if (immF != null) immF.systemReady(statusBarF);
  92. } catch (Throwable e) {
  93. reportWtf("making Input Method Service ready", e);
  94. }
  95. try {
  96. if (locationF != null) locationF.systemReady();
  97. } catch (Throwable e) {
  98. reportWtf("making Location Service ready", e);
  99. }
  100. try {
  101. if (countryDetectorF != null) countryDetectorF.systemReady();
  102. } catch (Throwable e) {
  103. reportWtf("making Country Detector Service ready", e);
  104. }
  105. try {
  106. if (throttleF != null) throttleF.systemReady();
  107. } catch (Throwable e) {
  108. reportWtf("making Throttle Service ready", e);
  109. }
  110. try {
  111. if (networkTimeUpdaterF != null) networkTimeUpdaterF.systemReady();
  112. } catch (Throwable e) {
  113. reportWtf("making Network Time Service ready", e);
  114. }
  115. try {
  116. if (textServiceManagerServiceF != null) textServiceManagerServiceF.systemReady();
  117. } catch (Throwable e) {
  118. reportWtf("making Text Services Manager Service ready", e);
  119. }
  120. }
  121. });
  122. Looper.loop();
  123. Slog.d(TAG, "System ServerThread is exiting!");
  124. }

第一:ActivityManagerService.main(factoryTest)

  1. public static final Context main(int factoryTest) {
  2. //①启动AThread线程来创建ActivityManagerService实例
  3. AThread thr = new AThread();
  4. thr.start();
  5. synchronized (thr) {
  6. while (thr.mService == null) {
  7. try {
  8. thr.wait();
  9. } catch (InterruptedException e) {
  10. }
  11. }
  12. }
  13. //将创建的ActivityManagerService实例保存到ActivityManagerService的静态变量mSelf
  14. ActivityManagerService m = thr.mService;
  15. mSelf = m;
  16. //②创建ActivityThread实例并保存到ActivityManagerService的静态变量mSystemThread
  17. ActivityThread at = ActivityThread.systemMain();
  18. mSystemThread = at;
  19. Context context = at.getSystemContext();
  20. context.setTheme(android.R.style.Theme_Holo);
  21. m.mContext = context;
  22. m.mFactoryTest = factoryTest;
  23. //③创建一个ActivityStack实例,并保存到ActivityManagerService的成员变量mMainStack中
  24. m.mMainStack = new ActivityStack(m, context, true);
  25. //④向ServiceManager注册BatteryStatsService服务
  26. m.mBatteryStatsService.publish(context);
  27. //⑤向ServiceManager注册UsageStatsService服务
  28. m.mUsageStatsService.publish(context);
  29. synchronized (thr) {
  30. //取消AThread线程等待,进入消息循环状态
  31. thr.mReady = true;
  32. thr.notifyAll();
  33. }
  34. //⑥调用startRunning函数
  35. m.startRunning(null, null, null, null);
  36. return context;
  37. }

①启动AThread线程

  1. static class AThread extends Thread {
  2. ActivityManagerService mService;
  3. boolean mReady = false;
  4. public AThread() {
  5. super("ActivityManager");
  6. }
  7. public void run() {
  8. //创建消息循环对象
  9. Looper.prepare();
  10. android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);
  11. android.os.Process.setCanSelfBackground(false);
  12. ActivityManagerService m = new ActivityManagerService();
  13. synchronized (this) {
  14. //创建ActivityManagerService实例
  15. mService = m;
  16. notifyAll();
  17. }
  18. //mReady = false,所以该线程处于等待
  19. synchronized (this) {
  20. while (!mReady) {
  21. try {
  22. wait();
  23. } catch (InterruptedException e) {
  24. }
  25. }
  26. }
  27. // For debug builds, log event loop stalls to dropbox for analysis.
  28. if (StrictMode.conditionallyEnableDebugLogging()) {
  29. Slog.i(TAG, "Enabled StrictMode logging for AThread's Looper");
  30. }
  31. //开启该线程的消息循环
  32. Looper.loop();
  33. }
  34. }

②创建ActivityThread实例

  1. public static final ActivityThread systemMain() {
  2. HardwareRenderer.disable(true);
  3. ActivityThread thread = new ActivityThread();
  4. thread.attach(true);
  5. return thread;
  6. }
  1. private void attach(boolean system) {
  2. //本地线程存储
  3. sThreadLocal.set(this);
  4. mSystemThread = system;//mSystemThread=true
  5. if (!system) {
  6. ViewRootImpl.addFirstDrawHandler(new Runnable() {
  7. public void run() {
  8. ensureJitEnabled();
  9. }
  10. });
  11. android.ddm.DdmHandleAppName.setAppName("<pre-initialized>");
  12. RuntimeInit.setApplicationObject(mAppThread.asBinder());
  13. IActivityManager mgr = ActivityManagerNative.getDefault();
  14. try {
  15. mgr.attachApplication(mAppThread);
  16. } catch (RemoteException ex) {
  17. // Ignore
  18. }
  19. } else {
  20. // Don't set application object here -- if the system crashes,
  21. // we can't display an alert, we just want to die die die.
  22. android.ddm.DdmHandleAppName.setAppName("system_process");
  23. try {
  24. mInstrumentation = new Instrumentation();
  25. ContextImpl context = new ContextImpl();
  26. context.init(getSystemContext().mPackageInfo, null, this);
  27. //创建Application实例,并保存在成员变量mAllApplications中
  28. Application app = Instrumentation.newApplication(Application.class, context);
  29. mAllApplications.add(app);
  30. mInitialApplication = app;
  31. //调用应用程序的onCreate函数
  32. app.onCreate();
  33. } catch (Exception e) {
  34. throw new RuntimeException(
  35. "Unable to instantiate Application():" + e.toString(), e);
  36. }
  37. }
  38. ViewRootImpl.addConfigCallback(new ComponentCallbacks2() {
  39. public void onConfigurationChanged(Configuration newConfig) {
  40. synchronized (mPackages) {
  41. // We need to apply this change to the resources
  42. // immediately, because upon returning the view
  43. // hierarchy will be informed about it.
  44. if (applyConfigurationToResourcesLocked(newConfig, null)) {
  45. // This actually changed the resources!  Tell
  46. // everyone about it.
  47. if (mPendingConfiguration == null ||
  48. mPendingConfiguration.isOtherSeqNewer(newConfig)) {
  49. mPendingConfiguration = newConfig;
  50. queueOrSendMessage(H.CONFIGURATION_CHANGED, newConfig);
  51. }
  52. }
  53. }
  54. }
  55. public void onLowMemory() {
  56. }
  57. public void onTrimMemory(int level) {
  58. }
  59. });
  60. }

③创建一个ActivityStack实例

  1. ActivityStack(ActivityManagerService service, Context context, boolean mainStack) {
  2. mService = service;
  3. mContext = context;
  4. mMainStack = mainStack;
  5. PowerManager pm =(PowerManager)context.getSystemService(Context.POWER_SERVICE);
  6. mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep");
  7. mLaunchingActivity = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch");
  8. mLaunchingActivity.setReferenceCounted(false);
  9. }

④注册BatteryStatsService服务

  1. public void publish(Context context) {
  2. mContext = context;
  3. ServiceManager.addService("batteryinfo", asBinder());
  4. mStats.setNumSpeedSteps(new PowerProfile(mContext).getNumSpeedSteps());
  5. mStats.setRadioScanningTimeout(mContext.getResources().getInteger(
  6. com.android.internal.R.integer.config_radioScanningTimeout)* 1000L);
  7. }

⑤注册UsageStatsService服务

  1. public void publish(Context context) {
  2. mContext = context;
  3. ServiceManager.addService(SERVICE_NAME, asBinder());
  4. }

⑥调用startRunning函数startRunning(null, null, null, null)

  1. public final void startRunning(String pkg, String cls, String action,String data) {
  2. synchronized(this) {
  3. //mStartRunning = false
  4. if (mStartRunning) {
  5. return;
  6. }
  7. mStartRunning = true;
  8. //mTopComponent=null
  9. mTopComponent = pkg != null && cls != null? new ComponentName(pkg, cls) : null;
  10. //mTopAction=Intent.ACTION_MAIN
  11. mTopAction = action != null ? action : Intent.ACTION_MAIN;
  12. //mTopData=null
  13. mTopData = data;
  14. if (!mSystemReady) {
  15. return;
  16. }
  17. }
  18. systemReady(null);
  19. }
  1. public void systemReady(final Runnable goingCallback) {
  2. //goingCallback = null
  3. synchronized(this) {
  4. //mSystemReady = false
  5. if (mSystemReady) {
  6. if (goingCallback != null) goingCallback.run();
  7. return;
  8. }
  9. // mDidUpdate = false
  10. if (!mDidUpdate) {
  11. if (mWaitingUpdate) {
  12. return;
  13. }
  14. Intent intent = new Intent(Intent.ACTION_PRE_BOOT_COMPLETED);
  15. List<ResolveInfo> ris = null;
  16. try {
  17. ris = AppGlobals.getPackageManager().queryIntentReceivers(intent, null, 0);
  18. } catch (RemoteException e) {
  19. }
  20. if (ris != null) {
  21. for (int i=ris.size()-1; i>=0; i--) {
  22. if ((ris.get(i).activityInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
  23. ris.remove(i);
  24. }
  25. }
  26. intent.addFlags(Intent.FLAG_RECEIVER_BOOT_UPGRADE);
  27. ArrayList<ComponentName> lastDoneReceivers = readLastDonePreBootReceivers();
  28. final ArrayList<ComponentName> doneReceivers = new ArrayList<ComponentName>();
  29. for (int i=0; i<ris.size(); i++) {
  30. ActivityInfo ai = ris.get(i).activityInfo;
  31. ComponentName comp = new ComponentName(ai.packageName, ai.name);
  32. if (lastDoneReceivers.contains(comp)) {
  33. ris.remove(i);
  34. i--;
  35. }
  36. }
  37. for (int i=0; i<ris.size(); i++) {
  38. ActivityInfo ai = ris.get(i).activityInfo;
  39. ComponentName comp = new ComponentName(ai.packageName, ai.name);
  40. doneReceivers.add(comp);
  41. intent.setComponent(comp);
  42. IIntentReceiver finisher = null;
  43. if (i == ris.size()-1) {
  44. finisher = new IIntentReceiver.Stub() {
  45. public void performReceive(Intent intent, int resultCode,
  46. String data, Bundle extras, boolean ordered,
  47. boolean sticky) {
  48. // The raw IIntentReceiver interface is called
  49. // with the AM lock held, so redispatch to
  50. // execute our code without the lock.
  51. mHandler.post(new Runnable() {
  52. public void run() {
  53. synchronized (ActivityManagerService.this) {
  54. mDidUpdate = true;
  55. }
  56. writeLastDonePreBootReceivers(doneReceivers);
  57. showBootMessage(mContext.getText(
  58. R.string.android_upgrading_complete),false);
  59. systemReady(goingCallback);
  60. }
  61. });
  62. }
  63. };
  64. }
  65. Slog.i(TAG, "Sending system update to: " + intent.getComponent());
  66. broadcastIntentLocked(null, null, intent, null, finisher,
  67. 0, null, null, null, true, false, MY_PID, Process.SYSTEM_UID);
  68. if (finisher != null) {
  69. mWaitingUpdate = true;
  70. }
  71. }
  72. }
  73. if (mWaitingUpdate) {
  74. return;
  75. }
  76. mDidUpdate = true;
  77. }
  78. mSystemReady = true;
  79. if (!mStartRunning) {
  80. return;
  81. }
  82. }
  83. ArrayList<ProcessRecord> procsToKill = null;
  84. synchronized(mPidsSelfLocked) {
  85. for (int i=mPidsSelfLocked.size()-1; i>=0; i--) {
  86. ProcessRecord proc = mPidsSelfLocked.valueAt(i);
  87. if (!isAllowedWhileBooting(proc.info)){
  88. if (procsToKill == null) {
  89. procsToKill = new ArrayList<ProcessRecord>();
  90. }
  91. procsToKill.add(proc);
  92. }
  93. }
  94. }
  95. synchronized(this) {
  96. if (procsToKill != null) {
  97. for (int i=procsToKill.size()-1; i>=0; i--) {
  98. ProcessRecord proc = procsToKill.get(i);
  99. Slog.i(TAG, "Removing system update proc: " + proc);
  100. removeProcessLocked(proc, true, false, "system update done");
  101. }
  102. }
  103. // Now that we have cleaned up any update processes, we
  104. // are ready to start launching real processes and know that
  105. // we won't trample on them any more.
  106. mProcessesReady = true;
  107. }
  108. Slog.i(TAG, "System now ready");
  109. EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_AMS_READY,SystemClock.uptimeMillis());
  110. synchronized(this) {
  111. // Make sure we have no pre-ready processes sitting around.
  112. if (mFactoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL) {
  113. ResolveInfo ri = mContext.getPackageManager().resolveActivity(new Intent(Intent.ACTION_FACTORY_TEST),STOCK_PM_FLAGS);
  114. CharSequence errorMsg = null;
  115. if (ri != null) {
  116. ActivityInfo ai = ri.activityInfo;
  117. ApplicationInfo app = ai.applicationInfo;
  118. if ((app.flags&ApplicationInfo.FLAG_SYSTEM) != 0) {
  119. mTopAction = Intent.ACTION_FACTORY_TEST;
  120. mTopData = null;
  121. mTopComponent = new ComponentName(app.packageName,
  122. ai.name);
  123. } else {
  124. errorMsg = mContext.getResources().getText(com.android.internal.R.string.factorytest_not_system);
  125. }
  126. } else {
  127. errorMsg = mContext.getResources().getText(com.android.internal.R.string.factorytest_no_action);
  128. }
  129. if (errorMsg != null) {
  130. mTopAction = null;
  131. mTopData = null;
  132. mTopComponent = null;
  133. Message msg = Message.obtain();
  134. msg.what = SHOW_FACTORY_ERROR_MSG;
  135. msg.getData().putCharSequence("msg", errorMsg);
  136. mHandler.sendMessage(msg);
  137. }
  138. }
  139. }
  140. retrieveSettings();
  141. if (goingCallback != null) goingCallback.run();
  142. synchronized (this) {
  143. if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {
  144. try {
  145. List apps = AppGlobals.getPackageManager().getPersistentApplications(STOCK_PM_FLAGS);
  146. if (apps != null) {
  147. int N = apps.size();
  148. int i;
  149. for (i=0; i<N; i++) {
  150. ApplicationInfo info= (ApplicationInfo)apps.get(i);
  151. if (info != null &&!info.packageName.equals("android")) {
  152. addAppLocked(info);
  153. }
  154. }
  155. }
  156. } catch (RemoteException ex) {
  157. // pm is in same process, this will never happen.
  158. }
  159. }
  160. // Start up initial activity.
  161. mBooting = true;
  162. try {
  163. if (AppGlobals.getPackageManager().hasSystemUidErrors()) {
  164. Message msg = Message.obtain();
  165. msg.what = SHOW_UID_ERROR_MSG;
  166. mHandler.sendMessage(msg);
  167. }
  168. } catch (RemoteException e) {
  169. }
  170. mMainStack.resumeTopActivityLocked(null);
  171. }
  172. }

第二:ActivityManagerService.setSystemProcess()

  1. public static void setSystemProcess() {
  2. try {
  3. ActivityManagerService m = mSelf;
  4. ServiceManager.addService("activity", m);
  5. ServiceManager.addService("meminfo", new MemBinder(m));
  6. ServiceManager.addService("gfxinfo", new GraphicsBinder(m));
  7. if (MONITOR_CPU_USAGE) {
  8. ServiceManager.addService("cpuinfo", new CpuBinder(m));
  9. }
  10. ServiceManager.addService("permission", new PermissionController(m));
  11. //把应用程序框架层下面的android包加载进来
  12. ApplicationInfo info =mSelf.mContext.getPackageManager().getApplicationInfo("android", STOCK_PM_FLAGS);
  13. mSystemThread.installSystemApplicationInfo(info);
  14. synchronized (mSelf) {
  15. ProcessRecord app = mSelf.newProcessRecordLocked(
  16. mSystemThread.getApplicationThread(), info,info.processName);
  17. app.persistent = true;
  18. app.pid = MY_PID;
  19. app.maxAdj = ProcessList.SYSTEM_ADJ;
  20. mSelf.mProcessNames.put(app.processName, app.info.uid, app);
  21. synchronized (mSelf.mPidsSelfLocked) {
  22. mSelf.mPidsSelfLocked.put(app.pid, app);
  23. }
  24. mSelf.updateLruProcessLocked(app, true, true);
  25. }
  26. } catch (PackageManager.NameNotFoundException e) {
  27. throw new RuntimeException(
  28. "Unable to find android system package", e);
  29. }
  30. }

第三:ActivityManagerService.installSystemProviders()

  1. public static final void installSystemProviders() {
  2. List<ProviderInfo> providers;
  3. synchronized (mSelf) {
  4. ProcessRecord app = mSelf.mProcessNames.get("system", Process.SYSTEM_UID);
  5. providers = mSelf.generateApplicationProvidersLocked(app);
  6. if (providers != null) {
  7. for (int i=providers.size()-1; i>=0; i--) {
  8. ProviderInfo pi = (ProviderInfo)providers.get(i);
  9. if ((pi.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
  10. Slog.w(TAG, "Not installing system proc provider " + pi.name
  11. + ": not system .apk");
  12. providers.remove(i);
  13. }
  14. }
  15. }
  16. }
  17. if (providers != null) {
  18. mSystemThread.installSystemProviders(providers);
  19. }
  20. mSelf.mCoreSettingsObserver = new CoreSettingsObserver(mSelf);
  21. mSelf.mUsageStatsService.monitorPackages();
  22. }

第三:ActivityManagerService.systemReady()

ActivityManagerService服务线程启动源码分析【转】的更多相关文章

  1. Netty源码分析 (三)----- 服务端启动源码分析

    本文接着前两篇文章来讲,主要讲服务端类剩下的部分,我们还是来先看看服务端的代码 /** * Created by chenhao on 2019/9/4. */ public final class ...

  2. Netty之旅三:Netty服务端启动源码分析,一梭子带走!

    Netty服务端启动流程源码分析 前记 哈喽,自从上篇<Netty之旅二:口口相传的高性能Netty到底是什么?>后,迟迟两周才开启今天的Netty源码系列.源码分析的第一篇文章,下一篇我 ...

  3. RocketMQ中Broker的启动源码分析(一)

    在RocketMQ中,使用BrokerStartup作为启动类,相较于NameServer的启动,Broker作为RocketMQ的核心可复杂得多 [RocketMQ中NameServer的启动源码分 ...

  4. RocketMQ中Broker的启动源码分析(二)

    接着上一篇博客  [RocketMQ中Broker的启动源码分析(一)] 在完成准备工作后,调用start方法: public static BrokerController start(Broker ...

  5. RocketMQ中PullConsumer的启动源码分析

    通过DefaultMQPullConsumer作为默认实现,这里的启动过程和Producer很相似,但相比复杂一些 [RocketMQ中Producer的启动源码分析] DefaultMQPullCo ...

  6. java多线程----线程池源码分析

    http://www.cnblogs.com/skywang12345/p/3509954.html 线程池示例 在分析线程池之前,先看一个简单的线程池示例. 1 import java.util.c ...

  7. Netty 心跳服务之 IdleStateHandler 源码分析

    前言:Netty 提供的心跳介绍 Netty 作为一个网络框架,提供了诸多功能,比如我们之前说的编解码,Netty 准备很多现成的编解码器,同时,Netty 还为我们准备了网络中,非常重要的一个服务- ...

  8. Django如何启动源码分析

    Django如何启动源码分析 启动 我们启动Django是通过python manage.py runsever的命令 解决 这句话就是执行manage.py文件,并在命令行发送一个runsever字 ...

  9. Netty服务端的启动源码分析

    ServerBootstrap的构造: public class ServerBootstrap extends AbstractBootstrap<ServerBootstrap, Serve ...

随机推荐

  1. Codeforces Gym101502 F.Building Numbers-前缀和

    F. Building Numbers   time limit per test 3.0 s memory limit per test 256 MB input standard input ou ...

  2. 洛谷——P2706 巧克力

    P2706 巧克力 题目背景 王7的生日到了,他的弟弟准备送他巧克力. 题目描述 有一个被分成n*m格的巧克力盒,在(i,j)的位置上有a[i,j]块巧克力.就在送出它的前一天晚上,有老鼠夜袭巧克力盒 ...

  3. 小W计树

    排列组合思想. 先跑一遍最短路, 再从1节点开始搜索, 假如搜到一个点的路径长度等于最短路, 则记录到达该点的路径数 + 1. 最后遍历一遍, ans *= rec[i] 输出答案即可. 关键在于想到 ...

  4. 【spring cloud】spring cloud子module的pom文件添加依赖,出现unknown问题【maven】

    spring cloud项目,一般都是父项目中有多个子服务,也就是子module模块. 如下图: 问题描述:在父项目中引用了常用的jar包,例如,引入了spring boot的依赖,那么在子项目中引入 ...

  5. 【报错】spring整合activeMQ,pom.xml文件缺架包,启动报错:Caused by: java.lang.ClassNotFoundException: org.apache.xbean.spring.context.v2.XBeanNamespaceHandler

    spring版本:4.3.13 ActiveMq版本:5.15 ======================================================== spring整合act ...

  6. iOS -- SKPhysicsJointSpring类

    SKPhysicsJointSpring类 继承自 NSObject 符合 NSCoding(SKPhysicsJoint)NSObject(NSObject) 框架  /System/Library ...

  7. FreeBSD 8

    FreeBSD 8.0的安装过程和7.2区别不大.先在FreeBSD官方网站上下载安装镜像,我一般都下载DVD的ISO,也有人爱好下最小的安装包,然后通过FTP或HTTP方式从网上下载各个程序包. 这 ...

  8. vdWebControl.js去水印

    vdWebControl.js可以在浏览器中展示cad图形(须要使用其自家的转换工具把cad转换为vds格式.工具免费,但转换完成后的文件带水印信息),支持编辑图形. vdWebControl.js试 ...

  9. 微信小程序日期定位弹出框遮挡问题

    只需要用bindtap绑定一个点击后的操作(隐藏键盘): wx.hideKeyboard()

  10. Solaris网络基础

      划分子网: 把大网缩小为若干个小网.修改子网掩码,划分多个网络. 那么如何确定子网的子网掩码和IP地址? 以上你会发现少了6个IP.   Ifconfig e1000g0 down down掉网卡 ...