Android工程师之ARTS挑战第六期第5周

目标:

  1. 每周至少做一个 leetcode 的算法题

  2. 阅读并点评至少一篇英文技术文章

  3. 学习至少一个技术技巧

  4. 分享一篇有观点和思考的技术文章

第5周:

  • Leetcode 142 题

    /**
     * Definition for singly-linked list.
     * class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) {
     *         val = x;
     *         next = null;
     *     }
     * }
     */
    public class Solution {
    public ListNode detectCycle(ListNode head) {
         if (head == null || head.next == null || head.next.next == null) {
                return null;
            }
            
            ListNode fast = head.next.next;
            ListNode slow = head.next;
    
    //        while (true) {
    //            if (fast == null || fast.next == null)
    //                return null; // 说明没有环
    //            else if (fast == slow || fast.next == slow) {
    //                // 说明有环
    //                return slow;
    //            } else {
    //                fast = fast.next.next;
    //                slow = slow.next;
    //            }
    //        }
    
            while (fast != slow) {
                if (fast.next == null || fast.next.next == null) {
                    return null;
                } else {
                    fast = fast.next.next;
                    slow = slow.next;
                }
            }
            //说明有环
            fast = head;
            while (fast != slow) {
                fast = fast.next;
                slow = slow.next;
            }
    
            return slow;
        }
    }
    
  • 学习至少一个技术技巧

    Android体系结构

    [外链图片转存失败(img-hjBN4Fkx-1566615246130)(images/android-boot-6363546.jpg)]

    图解: Android系统启动过程由上图从下往上的一个过程:Loader -> Kernel -> Native -> Framework -> App

    Android系统启动过程

    [外链图片转存失败(img-WT0mMknZ-1566615246131)(images/android-booting.jpg)]

    序号 进程启动 概述
    1 init进程 Linux系统中用户空间的第一个进程, Init.main
    2 zygote进程 所有App进程的父进程, ZygoteInit.main
    3 system_server进程 系统各大服务的载体
    4 servicemanager进程 binder服务的大管家, 守护进程循环运行在binder_loop
    5 app进程 通过Process.start启动App进程, ActivityThread.main

    AMS

    AMS启动

    • 在system_server进程中启动
    • SystemServer.java #startBootstrapServices()
    • 创建AMS实例对象,创建Andoid Runtime,ActivityThread和Context对象;
    • setSystemProcess:注册AMS、meminfo、cpuinfo等服务到ServiceManager;
    • installSystemProviderss,加载SettingsProvider;
    • 启动SystemUIService,再调用一系列服务的systemReady()方法;
    • 发布Binder服务
    服务名 类名 功能
    activity ActivityManagerService AMS
    procstats ProcessStatsService 进程统计
    meminfo MemBinder 内存
    gfxinfo GraphicsBinder 图像信息
    dbinfo DbBinder 数据库
    cpuinfo CpuBinder CPU
    permission PermissionController 权限
    processinfo ProcessInfoService 进程服务
    usagestats UsageStatsService 应用的使用情况

    想要查看这些服务的信息,可通过dumpsys <服务名>命令。比如查看CPU信息命令dumpsys cpuinfo

    从设计模式的角度:动态代理模式

    API 23源码为例:

    [外链图片转存失败(img-bahaQ45b-1566615246131)(images/ams_uml-6435169.png)]

  • 分享一篇有观点和思考的技术文章

    • https://www.jianshu.com/p/3988699ad131
  • 阅读并点评至少一篇英文技术文章

    • https://medium.com/@mjpeyman.arab/android-modularization-hexagonal-architecture-with-kotlin-and-mvvm-part-1-db338833d6c2 一遍介绍Android新的架构的博文 六芒星架构

你可能感兴趣的:(Android进阶,Android,ARTS)