本文转载自: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. Linux终端颜色设置

    http://blog.sina.com.cn/s/blog_65a8ab5d0101g6cf.html http://www.tuicool.com/articles/NRZfIj #PS1='${ ...

  2. CodeForces - 393E Yet Another Number Sequence

    Discription Everyone knows what the Fibonacci sequence is. This sequence can be defined by the recur ...

  3. DNA的复制

    半保留复制 DNA分子复制时, DNA分子的双螺旋将解开, 互补的碱基之间的氢键断裂, 解开的两条单链作为复制的模板, 游离的脱氧核苷酸依据碱基互补配对的原则, 通过形成氢键结合到作为模板的单链上. ...

  4. Codeforces Round #295 (Div. 1) C. Pluses everywhere

    昨天ZZD大神邀请我做一道题,说这题很有趣啊. 哇,然后我被虐了. Orz ZZD 题目大意: 你有一个长度为n的'0-9'串,你要在其中加入k个'+'号,每种方案就会形成一个算式,算式算出来的值记做 ...

  5. hadoop之hdfs------------------FileSystem及其源码分析

    FileSystem及其源码分析 FileSystem这个抽象类提供了丰富的方法用于对文件系统的操作,包括上传.下载.删除.创建等.这里多说的文件系统通常指的是HDFS(DistributedFile ...

  6. java后4位打成*显示

    /** * [固定电话] 后四位,其他隐藏<例子:****1234> * * @param num * @return */ public static String fixedPhone ...

  7. httplib 和 httplib2区别之 gzip解压

    HTTP请求头Accept-encoding: gzip信息告诉服务器,如果它有任何新数据要发送给时,请以压缩的格式发送.如果服务器支持压缩,它将返回由 gzip 压缩的数据并且使用Content-e ...

  8. vue生命周期的栗子

    vue生命周期的栗子注意触发vue的created事件以后,this便指向vue实例,这点很重要 <!DOCTYPE html><html><head><me ...

  9. 三维场景如何嵌入到PPT中展示?

    今天要跟大家一起交流的大体内容如标题所示,日常生活中,ppt已经成为人们工作学习生活中不可或缺的工具之一,那么三维场景是如何在ppt中加载展示的呢?请大家慢慢往下看. 1.创建命令按钮和web bro ...

  10. Android HandlerThread 消息循环机制之源代码解析

    关于 HandlerThread 这个类.可能有些人眼睛一瞟,手指放在键盘上,然后就是一阵狂敲.立即就能敲出一段段华丽的代码: HandlerThread handlerThread = new Ha ...