Android的启动过程

Android Launcher启动过程 开机启动概述: step 1: 上电开机 长按power键后引导芯片开始从固化在ROM的预设代码处执行,加载引导程序(BootLoader)到RAM. step 2: BootLoader启动 跳转到BootLoader的入口函数,开始执行BootLoader的代码. 硬件初始化工作(硬件时钟、手机的主板等) 完成初始化uart端口的操作 arch_init target_init apps_init aboot_init 跳转到内核入口函数start_kernel,启动内核. step 3: kerne 阅读详情
       Android从Kernel启动有4个步骤(以android4.2为例)


(1) init进程启动

(2) Native服务启动

(3) System Server,Android服务启动

(4) Home启动

总体启动框架图如:

image

 

第一步:initial进程(system/core/init)

    init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。init始终是第一个进程.

Init进程一起来就根据init.rc脚本文件建立了几个基本的服务:

  •  servicemanamger
  •  zygote

最后Init并不退出,而是担当起property service的功能。

1.1进程启动

/system/core/Init中的init.c入口:

  1. int main(int argc, char **argv)  
  2. {  
  3.     ...  
  4.     ...  
  5.     /* clear the umask */  
  6.     umask(0);  
  7.   
  8.     /* Get the basic filesystem setup we need put 
  9.      * together in the initramdisk on / and then we'll 
  10.      * let the rc file figure out the rest. 
  11.      */  
  12.         /*创建基本的文件系统*/  
  13.     mkdir("/dev", 0755);  
  14.     mkdir("/proc", 0755);  
  15.     mkdir("/sys", 0755);  
  16.     ...  
  17.     INFO("reading config file\n");  
  18.     /*解析init.rc文件*/  
  19.     init_parse_config_file("/init.rc");  
  20.     ...  
  21.     /* execute all the boot actions to get us started */  
  22.     /*触发需要执行的action*/  
  23.     action_for_each_trigger("init", action_add_queue_tail);  
  24.     ...  
  25.   
  26.     for(;;)  
  27.         {  
  28.             int nr, i, timeout = -1;  
  29.                         /*执行当前action的一个command*/  
  30.             execute_one_command();  
  31.             ...  
  32.             /*loop 处理来自property, signal的event*/  
  33.             for (i = 0; i < fd_count; i++)  
  34.             {  
  35.                 if (ufds[i].revents == POLLIN)  
  36.                 {  
  37.                     if (ufds[i].fd == get_property_set_fd())  
  38.                     handle_property_set_fd();  
  39.                     else if (ufds[i].fd == get_keychord_fd())  
  40.                     handle_keychord();  
  41.                     else if (ufds[i].fd == get_signal_fd())  
  42.                     handle_signal();  
  43.                 }  
  44.             }  
  45.         }  
  46.   
  47.     }  



Init.rc是Android自己规定的初始化脚本(Android Init Language, system/core/init/readme.txt)

该脚本包含四个类型的声明:

  • Actions
  • Commands
  • Services
  • Options.
1.2 解析init.rc中的service

system/core/init/下的init_parser.c中的 init_parse_config_file("/init.rc")——> parse_config(fn, data)——>parse_new_section(&state, kw, nargs, args)——>parse_service(state, nargs, args)——>  list_add_tail(&service_list, &svc->slist);

添加service到service_list

init_parser.c解析:

  1. static list_declare(service_list);  
  2. static list_declare(action_list);  
  3. static list_declare(action_queue);  


1.3 启动native service

execute_one_command():从action_queue链表上移除头结点(action)

class_start default对应的入口函数,主要用于启动native service

system/core/init/ builtins.c中的:

  1. int do_class_start(int nargs, char **args)  
  2. {  
  3.         /* Starting a class does not start services 
  4.          * which are explicitly disabled.  They must 
  5.          * be started individually. 
  6.          */  
  7.     service_for_each_class(args[1], service_start_if_not_disabled);  
  8.     return 0;  
  9. }  

init_parser.c中的service_for_each_class(...):遍历service_list链表上的所有结点

  1. static void service_start_if_not_disabled(struct service *svc)  
  2. {  
  3.     if (!(svc->flags & SVC_DISABLED)) {  
  4.         service_start(svc, NULL);  
  5.     }  
  6. }  

如果不是disabled就启动service。

init.c中的service_start(...)调用fork()创建进程,调用execve(...)调用执行新的service。


system/core/init/property_service.c中的handle_property_set_fd处理系统属性服务请求,如:service, wlan和dhcp.

property_service服务可以参考Android——SystemProperties的应用

system/core/init/keycords.c中的handle_keychord处理注册在service structure上的keychord,通常是启动service.

system/core/init/signal_handler.c中的handle_signal处理SIGCHLD signal(僵尸进程).

servicemanager是init的子进程

mediaserver是init的子进程

zygote是init的子进程,管理所有虚拟机实例

system_server和所有的java应用程序是zygote的子进程。system_server负责管理系统服务。




第二步 Zygote

Servicemanager 是init通过init.rc加载的第一个进程,接下来启动了zygote

Servicemanager和zygote进程就奠定了Android的基础。Zygote这个进程起来才会建立起真正的Android运行空间,初始化建立的Service都是Navtive service.在.rc脚本文件中zygote的描述:

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

所以Zygote从frameworks/base/cmds/app_main.cpp的main(…)开始。

其中:

  1. AppRuntime runtime;  

初始化运行时间.

  1. if (zygote) {  
  2.      runtime.start("com.android.internal.os.ZygoteInit",  
  3.              startSystemServer ? "start-system-server" : "");  
  4.  }  

runtime调用start方法,但是AppRuntime没有此方法,而在其父类AndroidRuntime

  1. class AppRuntime : public AndroidRuntime  

所以调用AndroidRuntime的start方法:

  1. void AndroidRuntime::start(const char* className, const char* options)  
  2. {  
  3.     ALOGD("\n>>>>>> AndroidRuntime START %s <<<<<<\n",  
  4.             className != NULL ? className : "(unknown)");  
  5.   
  6.   
  7.     blockSigpipe();  
  8. ...  
  9.   /* start the virtual machine */  
  10.     JNIEnv* env;  
  11.     if (startVm(&mJavaVM, &env) != 0) {  
  12.         return;  
  13.     }  
  14.     onVmCreated(env);  
  15.   
  16.   
  17.     /* 
  18.      * Register android functions. 
  19.      */  
  20.     if (startReg(env) < 0) {  
  21.         ALOGE("Unable to register all android natives\n");  
  22.         return;  
  23.     }  
  24. ...  
  25.      env->CallStaticVoidMethod(startClass, startMeth, strArray);  
  26. ...  
  27. }  

调用startVM(...)新建VM:

  1. int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)  
  2. {  
  3.     int result = -1;  
  4.     JavaVMInitArgs initArgs;  
  5. ...  
  6.  /* 
  7.      * Initialize the VM. 
  8.      * 
  9.      * The JavaVM* is essentially per-process, and the JNIEnv* is per-thread. 
  10.      * If this call succeeds, the VM is ready, and we can start issuing 
  11.      * JNI calls. 
  12.      */  
  13.     if (JNI_CreateJavaVM(pJavaVM, pEnv, &initArgs) < 0) {  
  14.         ALOGE("JNI_CreateJavaVM failed\n");  
  15.         goto bail;  
  16.     }  
  17. ...  
  18. }  

其中调用到的是JNI_CreateJavaVM(...)创建VM.

onVmCreated(env)为空函数,没用!


startReg()函数用于注册JNI接口:

  1. /* 
  2.  * Register android native functions with the VM. 
  3.  */  
  4. /*static*/ int AndroidRuntime::startReg(JNIEnv* env)  
  5. {  
  6.     /* 
  7.      * This hook causes all future threads created in this process to be 
  8.      * attached to the JavaVM.  (This needs to go away in favor of JNI 
  9.      * Attach calls.) 
  10.      */  
  11.     androidSetCreateThreadFunc((android_create_thread_fn) javaCreateThreadEtc);  
  12.   
  13.     ALOGV("--- registering native functions ---\n");  
  14.   
  15.     /* 
  16.      * Every "register" function calls one or more things that return 
  17.      * a local reference (e.g. FindClass).  Because we haven't really 
  18.      * started the VM yet, they're all getting stored in the base frame 
  19.      * and never released.  Use Push/Pop to manage the storage. 
  20.      */  
  21.     env->PushLocalFrame(200);  
  22.   
  23.     if (register_jni_procs(gRegJNI, NELEM(gRegJNI), env) < 0) {  
  24.         env->PopLocalFrame(NULL);  
  25.         return -1;  
  26.     }  
  27.     env->PopLocalFrame(NULL);  
  28.   
  29.     //createJavaThread("fubar", quickTest, (void*) "hello");  
  30.   
  31.     return 0;/fameworks/base/core/java/com/android/internal/os/ZygoteInit.java  
  32. }  


AndroidRuntime的start()方法最后调用
  1. env->CallStaticVoidMethod(startClass, startMeth, strArray)  

调用/fameworks/base/core/java/com/android/internal/os/ZygoteInit.java中的main(...)函数.

  1.     public static void main(String argv[]) {  
  2.         try {  
  3.             // Start profiling the zygote initialization.  
  4.             SamplingProfilerIntegration.start();  
  5.   
  6.   
  7.             registerZygoteSocket();  
  8. ...  
  9.           preload();  
  10. ...  
  11.           if (argv[1].equals("start-system-server")) {  
  12.                 startSystemServer();  
  13.             } else if (!argv[1].equals("")) {  
  14.                 throw new RuntimeException(argv[0] + USAGE_STRING);  
  15.             }  
  16. ...  
  17. }  

  • registerZygoteSocket();//来注册Socket的Listen端口,用来接受请求
    1. /** 
    2.    * Registers a server socket for zygote command connections 
    3.    * 
    4.    * @throws RuntimeException when open fails 
    5.    */  
    6.   private static void registerZygoteSocket() {  
    7.       if (sServerSocket == null) {  
    8.           int fileDesc;  
    9.           try {  
    10.               String env = System.getenv(ANDROID_SOCKET_ENV);  
    11.               fileDesc = Integer.parseInt(env);  
    12.           } catch (RuntimeException ex) {  
    13.               throw new RuntimeException(  
    14.                       ANDROID_SOCKET_ENV + " unset or invalid", ex);  
    15.           }  
    16.   
    17.           try {  
    18.               sServerSocket = new LocalServerSocket(  
    19.                       createFileDescriptor(fileDesc));  
    20.           } catch (IOException ex) {  
    21.               throw new RuntimeException(  
    22.                       "Error binding to local socket '" + fileDesc + "'", ex);  
    23.           }  
    24.       }  
    25.   }  

       preload()主要进行预加载类和资源,以加快启动速度。preload的class列表保存在/frameworks/base/preloaded-classes文件中。
    1. static void preload() {  
    2.         preloadClasses();  
    3.         preloadResources();  
    4.     }  

    startSystemServer(),fork进程:

  1. int pid;  
  2.   
  3.      try {  
  4.          parsedArgs = new ZygoteConnection.Arguments(args);  
  5.          ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);  
  6.          ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);  
  7.   
  8.          /* Request to fork the system server process */  
  9.          pid = Zygote.forkSystemServer(  
  10.                  parsedArgs.uid, parsedArgs.gid,  
  11.                  parsedArgs.gids,  
  12.                  parsedArgs.debugFlags,  
  13.                  null,  
  14.                  parsedArgs.permittedCapabilities,  
  15.                  parsedArgs.effectiveCapabilities);  
  16.      } catch (IllegalArgumentException ex) {  
  17.          throw new RuntimeException(ex);  
  18.      }  


经过这几个步骤,Zygote就建立好了,利用Socket通讯,接收ActivityManangerService的请求



第三步 System Server

Zygote上fork的systemserver进程入口在/frameworks/base/services/java/com/android/server/SystemServer.java的main(...)。Android的所有服务循环框架都是建立SystemServer上。在SystemServer.java中看不到循环结构。

  1. public static void main(String[] args) {  
  2.    ...  
  3.     ...  
  4.   
  5.        System.loadLibrary("android_servers");  
  6.        init1(args);  
  7.    }  

加载一个叫android_servers的本地库,他提供本 地方法的接口(源程序在framework/base/services/jni/目录中)。然后调用本地方法设置服务。具体执行设置的代码在 frameworks/base/cmds/system_server/library/system_init.cpp中。

Init1()是在Native空间实现的(com_andoird_server_SystemServer.cpp)

JNI如下:

  1. static JNINativeMethod gMethods[] = {  
  2.     /* name, signature, funcPtr */  
  3.     { "init1", "([Ljava/lang/String;)V", (void*) android_server_SystemServer_init1 },  
  4. };  

  1. static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz)  
  2. {  
  3.     system_init();  
  4. }  

system_init.cpp中的system_init()实现如下:

  1. extern "C" status_t system_init()  
  2. {  
  3. ...  
  4. property_get("system_init.startsurfaceflinger", propBuf, "1");  
  5. if (strcmp(propBuf, "1") == 0) {  
  6. // Start the SurfaceFlinger  
  7. SurfaceFlinger::instantiate();  
  8. }  
  9.   
  10. property_get("system_init.startsensorservice", propBuf, "1");  
  11. if (strcmp(propBuf, "1") == 0) {  
  12. // Start the sensor service  
  13. SensorService::instantiate();  
  14. }  
  15. ...  
  16. ALOGI("System server: starting Android services.\n");  
  17. JNIEnv* env = runtime->getJNIEnv();  
  18. if (env == NULL) {  
  19. return UNKNOWN_ERROR;  
  20. }  
  21. jclass clazz = env->FindClass("com/android/server/SystemServer");  
  22. if (clazz == NULL) {  
  23. return UNKNOWN_ERROR;  
  24. }  
  25. jmethodID methodId = env->GetStaticMethodID(clazz, "init2", "()V");  
  26. if (methodId == NULL) {  
  27. return UNKNOWN_ERROR;  
  28. }  
  29. env->CallStaticVoidMethod(clazz, methodId);  
  30.   
  31.   
  32. ALOGI("System server: entering thread pool.\n");  
  33. ProcessState::self()->startThreadPool();  
  34. IPCThreadState::self()->joinThreadPool();  
  35. ALOGI("System server: exiting thread pool.\n");  
  36.   
  37.   
  38. return NO_ERROR;  
  39. }  

可以看到等初始化传感器,视频,音频等服务后通过env->CallStaticVoidMethod(clazz, methodId)回调到了SystemServer的init2().

SystemServer.java有这么一段话:

  1. /** 
  2.     * This method is called from Zygote to initialize the system. This will cause the native 
  3.     * services (SurfaceFlinger, AudioFlinger, etc..) to be started. After that it will call back 
  4.     * up into init2() to start the Android services. 
  5.     */  
  6.    native public static void init1(String[] args);  
init2会在init1的实现中回调到!

system_init()开启了线程池,join_threadpool() 将当前线程挂起,等待binder的请求,启动了循环状态。


SystemServer.java中init2()建立了Android中主要的系统服务(WindowManagerServer(Wms)、ActivityManagerSystemService(AmS)、PackageManagerServer(PmS)......).

  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.     }  
这个init2()建立了一个线程 thr,ServerThread线程 中New Service和AddService来建立服务:

  1. class ServerThread extends Thread {  
  2.     private static final String TAG = "SystemServer";  
  3.     private static final String ENCRYPTING_STATE = "trigger_restart_min_framework";  
  4.     private static final String ENCRYPTED_STATE = "1";  
  5.   
  6.   
  7.     ContentResolver mContentResolver;  
  8. ...  
  9.             Slog.i(TAG, "Entropy Mixer");  
  10.             ServiceManager.addService("entropy", new EntropyMixer());  
  11.   
  12.   
  13.             Slog.i(TAG, "Power Manager");  
  14.             power = new PowerManagerService();  
  15.             ServiceManager.addService(Context.POWER_SERVICE, power);  
  16.   
  17.   
  18.             Slog.i(TAG, "Activity Manager");  
  19.             context = ActivityManagerService.main(factoryTest);  
  20. ...  
  21.         // We now tell the activity manager it is okay to run third party  
  22.         // code.  It will call back into us once it has gotten to the state  
  23.         // where third party code can really run (but before it has actually  
  24.         // started launching the initial applications), for us to complete our  
  25.         // initialization.  
  26.         ActivityManagerService.self().systemReady(new Runnable() {  
  27.             public void run() {  
  28.                 Slog.i(TAG, "Making services ready");  
  29.   
  30.   
  31.                 if (!headless) startSystemUi(contextF);  
  32.                 try {  
  33.                     if (mountServiceF != null) mountServiceF.systemReady();  
  34.                 } catch (Throwable e) {  
  35.                     reportWtf("making Mount Service ready", e);  
  36.                 }  
  37. ...  
  38. }  


执行完systemReady()后,会相继启动相关联服务的systemReady()函数,完成整体初始化。

SystemServer是Android系统的一个核心进程,它是由zygote进程创建的,因此在android的启动过程中位于zygote之后。android的所有服务循环都是建立在 SystemServer之上的。在SystemServer中,将可以看到它建立了android中的大部分服务,并通过ServerManager的add_service方法把这些服务加入到了ServiceManager的svclist中。从而完成ServcieManager对服务的管理。

APK应用中能够直接交互的大部分系统服务都在该进程中运 行,常见的比如WindowManagerServer(Wms)、ActivityManagerSystemService(AmS)、 PackageManagerServer(PmS)等,这些系统服务都是以一个线程的方式存在于SystemServer进程中。



第三步 Home启动


上面的ServerThread调用到ActivityManagerService的systemReady()然后回调到/frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java的systemReady(...).

  1. public final class ActivityManagerService extends ActivityManagerNative  
  2.         implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {  
  3.     ......  
  4.   
  5.     public void systemReady(final Runnable goingCallback) {  
  6.         ......  
  7.   
  8.         synchronized (this) {  
  9.             ......  
  10.   
  11.             mMainStack.resumeTopActivityLocked(null);  
  12.         }  
  13.     }  
  14.   
  15.     ......  
  16. }  

调用/frameworks/base/services/java/com/android/server/am/ActivityStack.java中:

  1.  final boolean resumeTopActivityLocked(ActivityRecord prev, Bundle options) {  
  2.  // Find the first activity that is not finishing.  
  3.         ActivityRecord next = topRunningActivityLocked(null);  
  4. ...  
  5.   
  6.         if (next == null) {  
  7.               
  8.              Log.d(TAG,"jscese start Launcher");  
  9.             // There are no more activities!  Let's just start up the  
  10.             // Launcher...  
  11.             if (mMainStack) {  
  12.                 ActivityOptions.abort(options);  
  13.                 return mService.startHomeActivityLocked(mCurrentUser);  
  14.             }  
  15.         }  
  16. ...  
  17. }  

next为当前系统Activity堆栈最顶端的Activity,如果没有,next == null那么就启动home!

回调到ActivityManagerServcie.java的:

  1. boolean startHomeActivityLocked(int userId) {  
  2. ...  
  3.         Intent intent = new Intent(  
  4.             mTopAction,  
  5.             mTopData != null ? Uri.parse(mTopData) : null);  
  6.         intent.setComponent(mTopComponent);  
  7.         if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {  
  8.             intent.addCategory(Intent.CATEGORY_HOME);  
  9.         }  
  10.         ActivityInfo aInfo =  
  11.             resolveActivityInfo(intent, STOCK_PM_FLAGS, userId);  
  12.         if (aInfo != null) {  
  13.             intent.setComponent(new ComponentName(  
  14.                     aInfo.applicationInfo.packageName, aInfo.name));  
  15.               
  16.             Log.d(TAG,"jscese first packageName==   "+aInfo.applicationInfo.packageName);  
  17.               
  18.             // Don't do this if the home app is currently being  
  19.             // instrumented.  
  20.             aInfo = new ActivityInfo(aInfo);  
  21.             aInfo.applicationInfo = getAppInfoForUser(aInfo.applicationInfo, userId);  
  22.             ProcessRecord app = getProcessRecordLocked(aInfo.processName,  
  23.                     aInfo.applicationInfo.uid);  
  24.             if (app == null || app.instrumentationClass == null) {  
  25.                 intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK);  
  26.                 mMainStack.startActivityLocked(null, intent, null, aInfo,  
  27.                         null, null, 0, 0, 0, 0, null, false, null);  
  28.             }  
  29.         }  
  30.   
  31.   
  32.         return true;  
  33.     }  

首先创建一个CATEGORY_HOME类型的Intent,然后通过Intent.resolveActivityInfo函数向PackageManagerService查询Category类型为HOME的Activity!

launcher的AndroidManifest.xml文件中可见:

  1.   <activity  
  2.             android:name="com.android.mslauncher.LauncherActivity"  
  3.  ...  
  4.   
  5.             <intent-filter>  
  6.                 <action android:name="android.intent.action.MAIN" />  
  7.                 <category android:name="android.intent.category.HOME" />  
  8.                 <category android:name="android.intent.category.DEFAULT" />  
  9.                 <category android:name="android.intent.category.MONKEY"/>  
  10.             </intent-filter>  
  11.         </activity>  
  12. ...  

跑到ActivityStack.java的:

  1.     final int startActivityLocked(IApplicationThread caller,  
  2.             Intent intent, String resolvedType,  
  3.             Uri[] grantedUriPermissions,  
  4.             int grantedMode, ActivityInfo aInfo, IBinder resultTo,  
  5.   
  6.         ......  
  7.   
  8.   
  9.         ActivityRecord r = new ActivityRecord(mService, this, callerApp, callingUid,  
  10.             intent, resolvedType, aInfo, mService.mConfiguration,  
  11.             resultRecord, resultWho, requestCode, componentSpecified);  
  12.   
  13.   
  14.         ......  
  15.   
  16.   
  17.           err = startActivityUncheckedLocked(r, sourceRecord, startFlags, true, options);  
  18. ...  
  19.     }  

往后走就是启动一个activity的流程了,最终启动的是launcher的onCreate方法!

至此启动完成!

此博文图片模型来自http://blog.youkuaiyun.com/maxleng/article/details/5508372

撰写不易,转载请注明出处http://blog.youkuaiyun.com/jscese/article/details/17115395

相关链接https://guolei1130.github.io/2017/01/02/android%E5%BA%94%E7%94%A8%E8%BF%9B%E7%A8%8B%E6%98%AF%E5%A6%82%E4%BD%95%E5%90%AF%E5%8A%A8%E7%9A%84/
安卓APP(2)——安卓的工程目录文件夹介绍和安卓APP启动过程 阅读详情

相关推荐

学习笔记9--智能驾驶的功能安全设计之功能安全设计

本系列博客包括6个专栏,分别为:《自动驾驶技术概览》、《自动驾驶汽车平台技术基础》、《自动驾驶汽车定位技术》、《自动驾驶汽车环境感知》、《自动驾驶汽车决策与控制》、《自动驾驶系统设计及应用》。此专栏是关于《自动驾驶系统设计及应用》书籍的笔记.

FUXI_Willard 1794

Android系统启动流程

android启动流程

wangadping的博客 5402

pcb印刷电路缺陷检测----数据集准备

PKU-Market-PCB 印刷电路板 (PCB) 瑕疵数据集是一个公共合成 PCB 数据集,包含 1,386 张图像,具有 6 种缺陷(漏孔、鼠咬、开路、短路、杂散、杂铜),可用于图像检测、分类和配准任务。

qq_30190551的博客 4425

Android---系统启动流程

1. init 根据 init.rc 运行 app_process,并携带“-zygote" 和"-startSystemServer"参数。2. AndroidRuntime.cpp::start() 里将启动 JavaVM,并且注册所有 framework 相关的系统 JNI 接口3. 第一次进入 Java 世界,运行 ZygoteInit.java::main() 函数初始化 Zygote,并创建 Socket 的 Server 端。

qq_44950283的博客 3293

告别手动输入!用Burp插件+ddddocr,5分钟搞定图片验证码自动识别

本文详细介绍了如何利用Burp插件和ddddocr开源库快速构建图片验证码自动识别系统,实现高效、零成本的验证码自动化解决方案。通过环境搭建、性能调优和Burp Suite深度集成,显著提升安全测试效率,特别适用于金融和电商系统的批量测试场景。

weixin_29099217的博客 200

Apifox接口测试+自动化测试

Apifox 接口测试+自动化测试快速入门!

程序员小杨哥的博客 1万+

安卓开机启动流程

安卓开机启动流程

似霰的博客 4880

6D位姿估计系列(一)

本研究提出FoundationPose,一个统一的基础模型框架,支持基于CAD模型和无模型的6D物体姿态估计与跟踪。通过神经隐式表示实现高效新视图合成,结合大规模合成数据训练和对比学习策略,模型展现出强大的泛化能力。实验表明,该方法在LINEMOD、YCB-Video等多个基准数据集上显著优于现有专门化方法,处理速度达32Hz,且无需目标域微调。该工作为多场景物体姿态估计提供了通用解决方案。

qq625924821的博客 559

【安卓开发】安卓工程介绍及启动过程

文件作用存放java代码的,有包,有文件。

qq_62361050的博客 964

R数据分析:潜在转化分析LTA的做法和解释(一)

之前给大家写了很多潜在类别分析的教程Mplus教程:如何做潜在类别分析LCAR数据分析:用R语言做潜类别分析LCAMplus数据分析:潜在类别分析(LCA)流程(详细版)R数据分析:再写潜在类别分析LCA的做法与解释,今天继续给大家拓展一步。 今天要介绍的就是潜在转换分析,这个东西就是LCA的纵向版本。是一个专门用来研究质变的统计技巧。有一句话叫做量变起质变,你怎么知道质变到底发生没有?就用潜在转换分析。 Latent transition analysis is an extension of...

Codewar的博客 7702

纯C语言实现的Luhn算法(信用卡校验位):详解与示例

在本文中,我们详细介绍了如何使用纯C语言实现Luhn算法,并提供了一些示例代码。用于检查任意长度的数字字符串的有效性,用于计算给定数字字符串的校验位字符。我们还提供了一个简单的“main”C程序,用于在命令行上接受一个或多个数字字符串,并计算它们的校验位字符。通过阅读本文和理解示例代码,我们希望读者能够更好地理解Luhn算法的工作原理,并能够在自己的项目中应用这种算法。

qq_38334677的博客 1220

Android:安卓APP启动过程简介

你打开一个安卓系统 它的界面是Launcher 进程,它不断的检测用户的触摸落在哪个APP上面,如果你的触摸落在空白它不做处理,你要滑动他就给你滑动 当用户触摸这个app的时候, 他会进行下面的流程 Laucher 检测用户触摸到APP以后,整个软件,整个工程最应该被加载的文件是 AndroidManifest.xml 首先他会判断你的SDK版本,你的目标机器是否能承载的了安卓APP,有的时候承载不了,安装都安装不上,有的时候能装上不能运行 再来就是获取你要的...

m0_57089315的博客 1366

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android Framework的启动过程

我们平常如果只是简单的编写安卓App,特别是很多人只是更加单纯的关注View层面的代码编写,那么或许很难去思考或者注意整个安卓系统从最初启动到第一个Activity打开的这么一个过程,但是如果需要对安卓开发有更深入的了解的话,这方面的知识还是必不可少的,知其然且知其所以然,才能更好的控制它,驾驭它,这段时间学习了,一方面想记录下来,另一方面也是分享给有需要的人,废话不多说了。

南朝烟雨的博客 1750

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【安卓系统笔记】基于android7.1分析android启动过程

开机按Power,正常启动系统,加载boot.img,boot.img包含内核,基本文件系统,用于正常启动手机。 1.引导启动bootloader 开机按组合键可进入相应的模式,fastboot/recovery模式 按开机则正常启动流程。 Bootloader做的事情主要有:初始化CPU时钟,内存,串口等;设置linux启动参数;加载Linux各种各样的内核镜像到SDRAM中。 2.linux内...

Paul的博客 817

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Android系统的启动过程以及APP的启动过程分析

当我们们按下手机的开机按钮,眼睛看到的是绚丽的启动画面,然后是等待着一个我们可以点击的桌面出现。外行看热闹,内行看门道,我们是内行,从开机到显示桌面发生了什么?当点击桌面上的一个图标启动某个app,这里又发生了什么?本文将会按照如下安排来分析Android系统的启动过程以及APP的启动过程。同样,本文并不打算通过分析浩如烟海的源码,那样只会徒增篇幅,而对于Android应用开发工程师而言理解了本文...

藏六七 716

安卓启动过程

安卓启动过程引言1 用户态init阶段 引言 安卓系统的启动过程如下: 整个流程分为四个阶段,即引导阶段、内核启动阶段、用户态init阶段、Zygote启动阶段。由于安卓系统内核基于linux修剪而成,其引导和内核启动与linux基本相同,差异性的是用户态init阶段和Zygote启动阶段,特别是Zygote阶段是安卓特有的。 注 1 :本文中断解析用户态init阶段和Zygote启动阶段,引导...

fs3296的博客 431

安卓开发-安卓启动过程

安卓底层是linux系统。所以启动过程必然与linux有一些相似之处。

imzoer的专栏 791

]Android 启动过程分

首先看看整体开机流程。这个对于软件开发测试工作非常有用,特别是在项目初期的时候,通常出在驱动或者启动参数上面的问题比较多,比如关机充电,连接charger关机等问题。一般开机过程大致可以分为三个大阶段:1. OS级别,由bootloader载入linux kernel后(注:bo

tang_12的专栏 743

Android启动过程深入解析

Android是一个基于Linux的开源操作系统。x86(x86是一系列的基于intel 8086 CPU的计算机微处理器指令集架构)是linux内核部署最常见的系统。然而,所有的Android设备都是运行在ARM处理器(ARM 源自进阶精简指令集机器,源自ARM架构)上,除了英特尔的Xolo设备(http://xolo.in/xolo-x900-features)。Xolo来源自凌动1.6GHz x86处理器。

轻口味的专栏 1791

Android Framework 之了解 Launcher 启动过程

SystemServer 完成启动 LauncherActivity 的调用;Zygote 进行 Launcher 进程的 fork 操作;进入 ActivityThread 的 main(),完成最终 Launcher 的 onCreate() 操作;

Bonnie_cat的博客 1184

3 Android启动过程

1 Android启动过程 (1)上电 (2)bootloader 在cpu内部,根据GPIO设置判断系统是从U盘还是flash启动,引导uboot启动。 (3)uboot 初始化外设,设置启动参数,根据参数引导linux kernel启动。 (4)kernel 初始化硬件,加载驱动,根据uboot参数启动系统。 (5)Android 挂载分区,创建目录,加载驱动,init守护进程,启动系统服务(ServiceManager,adbd等)。 2 Android启动模式 通过uboot来区分通过哪个

u012906122的专栏 1278

android 启动过程及init.rc

目录android 启动过程1.init 进程1.1 action1.2 service1.2.1 service的class2添加启动脚本总结 关于安卓启动过程,参考链接如下: Android启动过程深入分析 android 启动过程 以下内容属于转载,侵删! 第一步:启动电源以及系统启动 当电源按下,引导芯片代码开始从预定义的地方(固化在ROM)开始执行。加载引导程序到RAM,然后执行。 第...

u012944254的博客 2730

描述Android系统的启动过程,Android系统启动过程

Android启动linux内核过程:init 进程启动 -> Native服务启动 -> System Server/Android 服务启动 -> Home 启动init进程启动:源文件目录:system/core/init/init.cint main(int argc, char **argv){int fd_count = 0;struct pollfd ufds[4...

weixin_39742065的博客 94
上一篇: Android的序列化
下一篇: Android的Launcher程序(HOME)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值