zoukankan      html  css  js  c++  java
  • android note【转】

    本文转载自:http://blog.csdn.net/u012719256/article/details/52094982

    1.重要的property属性

     #define ANDROID_RB_PROPERTY "sys.powerctl"  // 控制启动状态
     property_set(ANDROID_RB_PROPERTY, "shutdown,");
     property_set(ANDROID_RB_PROPERTY, "reboot,bootloader");
     property_set(ANDROID_RB_PROPERTY, "reboot,");
     property_set(ANDROID_RB_PROPERTY, "reboot,edl");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.propety属性的管理


    init.c

       if (is_charger)
            {
                    action_for_each_trigger("charger", action_add_queue_tail);
            }
            else
            {
                    if (is_ffbm)
                    {
                             action_for_each_trigger("ffbm", action_add_queue_tail);
                    }
                    else
                    {
                            // 正常开机模式进入最后的 late-init 阶段
                            action_for_each_trigger("late-init", action_add_queue_tail);
                    }
            }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    init.rc

    on late-init
         trigger load_all_props_action  // 在late-init阶段加载所有的属性
    
    ----------
    
    on load_all_props_action
        load_all_props
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    keywords.h property_service.c

        KEYWORD(load_all_props,  COMMAND, 0, do_load_all_props)        //keywords.h
                                                -> do_load_all_props   // builtins.c
                                                    ->load_all_props   // property_service.c
                                                        // 依次从下面几个路径中加载所有的属性
                                                        "system/build.prop"  (常用)
                                                        "system/default.prop"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    build/tools/buildinfo.sh

    ☆ 生成 system/build.prop 文件,需要添加prop只需要在这个编译脚本中添加即可!!!

    in system/build.prop
    
    # begin build properties
      3 # autogenerated by buildinfo.sh
      4 ro.build.id=LMY47V
      5 ro.build.display.id=LMY47V.WW_Phone.12.0.0.020-20160719_userdebug
      6 ro.build.display.wtid=LMY47V.WW_Ph
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.属性值的获取设置

    1. 在system.prop里面添加需要使用的系统属性,添加完后需要编译生成system.img
    
    2. 在native层,使用property_set(...)和property_get(...)来存取系统属性
    
    3. 在Java层, 使用SystemProperties.set(...)和SystemProperties.get(...)来存取系统属性
    
    4. 在adb shell命令行,使用getprop和setprop来存取系统属性
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.charger

    # init.rc
    on charger
        class_start charger
    
    
    ----------
    
    
    # init.qcom.rc
    service charger /charger
        class charger
    
    
    ----------
    
    
    #system/core/healthd/Android.mk 
    
    LOCAL_MODULE := healthd
    ...
    # Symlink /charger to /sbin/healthd
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    4.屏幕截图 & 屏幕录制

    adb shell screencap /sdcard/test.png
    adb shell screenrecord  sdcard/sss.mp4
    • 1
    • 2

    5.关闭selinux

    setenforce 0
    • 1

    6.adb devices 串号

    (1)init.rc

     write /sys/class/android_usb/android0/iSerial ${ro.serialno}
    
    
    • 1
    • 2
    • 3

    (2)cat /pro/cmdline


    adb root;adb shell cat /proc/cmdline

    androidboot.serialno=YOGABOOK12 
    • 1

    (3)init.cpp

    
    process_kernel_cmdline
      ->import_kernel_cmdline(false, import_kernel_nv);
       ->import_kernel_nv
    
    
    
    ----------
    
    
        char *value = strchr(name, '=');
        (!strncmp(name, "androidboot.", 12) && name_len > 12) {
            char *boot_prop_name = name + 12;
            char prop[PROP_NAME_MAX];
            snprintf(prop, sizeof(prop), "ro.boot.%s", boot_prop_name);
               property_set(prop, value);
               } 
    
    
    ----------
    
    
    
    static void export_kernel_boot_props() {
        struct {
            const char *src_prop;
            const char *dst_prop;
            const char *default_value;
        } prop_map[] = {
            ...
            { "ro.boot.serialno",   "ro.serialno",   "", },
            ...
        };
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    7.system/bin/input 命令

    demo

     input keyevent   keycodeNum    //4 表示KEYCODE_BACK
    • 1

    常用的几种事件:

    //键值对应 android/keycodes.h
    26 --> KEYCODE_POWER         // 电源 
    82 -->  "KEYCODE_MENU"     //菜单
    3 -->  "KEYCODE_HOME"       //返回home
    4 -->  "KEYCODE_BACK"       //返回上一级菜单
    19 -->  "KEYCODE_DPAD_UP"           //向上
    20 -->  "KEYCODE_DPAD_DOWN"     //向下
    21 -->  "KEYCODE_DPAD_LEFT"     //向左
    22 -->  "KEYCODE_DPAD_RIGHT"        //向右
    24 -->  "KEYCODE_VOLUME_UP"     //音量加
    25 -->  "KEYCODE_VOLUME_DOWN"   //音量减
    66 -->  "KEYCODE_ENTER"     //确定键
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    8. 重新挂载某个分区

    mount -o remount,rw system system
    • 1

    9.命令行查看分辨率

    frameworks/base/cmds/wm/

    窗口分辨率

    wm size


    10.android init阶段 bootanimation之前的一张启动画面

    // 在init.c中通过 “console_init” 这个action触发
        queue_builtin_action(console_init_action, "console_init");
    
    • 1
    • 2
    • 3

    11.aplog

    1.位置

    /data/logs/aplog.n
    data/local/log/aplog
    • 1
    • 2

    2.crash信息

    //logscrashlog0_72612f74d4e263a53665crashfile 中表明了crash原因
    
    EVENT=CRASH
    ID=61c96fdba2162a052323
    SN=4cca94f595db403f749622792dfe73a6167ded48
    DATE=2016-10-08/08:09:56  
    UPTIME=0000:00:19
    BUILD=YB-Q501L_USR_S000014_1610010228_WW12_ROW,Lenovo/yogi_12_row_lte/YOGABOOK12:6.0.1/MMB29M/1610010228:user/release-keys,3.14.55-x86_64,queen@fyy-SMBIOSfyy,unknown,YOGI.T2000AH.V015,,,,
    BOARD=Lenovo YB-Q501L
    IMEI=
    TYPE=SWWDT_UNHANDLED  // crash 类型 看门狗
    DATA_READY=1
    OPERATOR=UNKNOWN
    DATA0=SWWDT_RESET //
    _END
    
    
    ----------
    EVENT=CRASH
    ID=72612f74d4e263a53665
    SN=7f406c2f2e2675c73a5a85d52a237d80f747c2ea
    DATE=2016-10-07/21:23:08  
    UPTIME=0000:00:22
    BUILD=YB-Q501L_USR_S000014_1610010228_WW12_ROW,Lenovo/yogi_12_row_lte/YOGABOOK12:6.0.1/MMB29M/1610010228:user/release-keys,3.14.55-x86_64,queen@fyy-SMBIOSfyy,unknown,YOGI.T2000AH.V015,,,,
    BOARD=Lenovo YB-Q501L
    IMEI=
    TYPE=IPANIC    // // crash 类型 kernel panic
    DATA_READY=1
    OPERATOR=UNKNOWN
    _END
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    3. ” BUG: “

    搜索“ BUG: ”会有栈回溯或者null point信息
    • 1

    2.kernel启动信息/重启信息

    beginning of kernel 
    10-07 21:22:46.780 0 0 I KERNEL : [ 0.000000] Initializing cgroup subsys cpuset 
    10-07 21:22:46.780 0 0 I KERNEL : [ 0.000000] Initializing cgroup subsys cpu 
    10-07 21:22:46.780 0 0 I KERNEL : [ 0.000000] Initializing cgroup subsys cpuacct 
    10-07 21:22:46.780 0 0 I KERNEL : [ 0.000000] Linux version 3.14.55-x86_64 (queen@fyy-SMBIOSfyy) (gcc version 4.9.2 (GCC) ) #1 SMP PREEMPT Sat Oct 1 03:04:35 CST 2016 
    10-07 21:22:46.780 0 0 I KERNEL : [ 0.000000] Command line: androidboot.bootloader=yogi_t2000ah_v015_kernelflinger-02_1f androidboot.diskbus=10.0 androidboot.verifiedbootstate=green androidboot.bootreason=kernel_panic androidboot.mode=0 :


    12. 指定工程的 .config

    KERNEL_DEFCONFIG

    device/intel/cherrytrail/cht_ffd/AndroidBoard.mk


    13. Android.mk中添加打印

     $(warning "print info")
    • 1

    14.U盘插入拔出打印


    1.mountservice 完整流程

    
    
         MountService: Volume public:8,1 broadcasting checking to UserHandle{0}  // 插入后检测挂载
         MountService: Volume public:8,1 broadcasting mounted to UserHandle{0}
         MountService: Volume public:8,1 broadcasting ejecting to UserHandle{0}  // 点击弹出umount
         MountService: Volume public:8,1 broadcasting unmounted to UserHandle{0}
         MountService: Volume public:8,1 broadcasting removed to UserHandle{0}  // 拔出U盘
    
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12


    2.kernelU盘插入拔出kernel打印

    
     usb 2-1: new SuperSpeed USB device number 2 using xhci_hcd       // 插上
     30375936 512-byte logical blocks: (15.5 GB/14.4 GiB)             // 读取大小
     USB disconnect, device number                                    // 拔出 
    • 1
    • 2
    • 3
    • 4

    15.U盘插入拔出mount/umount代码流程

    1.监听subsystem为block 的uevent事件

    
    
        NetlinkHandler::onEvent
            VolumeManager::handleBlockEvent
                case add:
                    Disk::create   // disk.cpp
                          disk::readMetadata();
                          disk::readPartitions();
                          notifyEvent(ResponseCode::DiskCreated, StringPrintf("%d", mFlags));
                case chager:
                      disk::readMetadata();
                      disk::readPartitions();
    
                case remove:
                    Disk::destroy()
                        destroyAllVolumes();
                        notifyEvent(ResponseCode::DiskDestroyed);
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    2.发送广播

    
    
        Disk::notifyEvent
                 VolumeManager::Instance()->getBroadcaster()->sendBroadcast
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.mountService接收来着vold的广播

    
        MountService.onEvent
            MountService.onEventLocked
                case VoldResponseCode.VOLUME_STATE_CHANGED:  //每一次状态的改变都会调用这个分支
                        onVolumeStateChangedLocked(vol, oldState, newState);  // 状态改变做相应操作
                            mHandler.obtainMessage(H_VOLUME_BROADCAST, userVol).sendToTarget();  // mountService发广播给mountService
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9


    3.mountService接收来着mountService的广播

    
    MountServiceHandler.handleMessage  //接收广播
    
        case H_VOLUME_MOUNT:         // 挂载
            mConnector.execute("volume", "mount", vol.id, vol.mountFlags,vol.mountUserId);
    
        case H_VOLUME_BROADCAST:      // 发送广播给用户告知状态
            Slog.d(TAG, "Volume " + userVol.getId() + " broadcasting " + envState + " to "+ userVol.getOwner());
            mContext.sendBroadcastAsUser(intent, userVol.getOwner());   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    16.查看android分区及dd命令烧写分区

    #ls /dev/block/by-name/
        android_boot
        android_bootloader
        android_bootloader2
        android_cache
        android_config
        android_data
        android_factory
        android_metadata
        android_misc
        android_persistent
        android_recovery
        android_system
    
    
    
    ----------
    
    
    push boot.img到及机子的任意目录,在此目录执行 ,dd if=boot.img of=/dev/block/by-name/android_boot,重启之后,boot.img烧写成功.其他分区也类似.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    17.android 各层次获取时间的方法

    1. 在Java层,long now = SystemClock.uptimeMillis();
    
    2. 在native层,nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
    
    3. 在驱动层,s64 time = ktime_to_us(ktime_get());
    • 1
    • 2
    • 3
    • 4
    • 5

    18.android 分区大小设置

    vendor/qcom/non-hlos/MSM8953.LA.2.0/common/config/partition.xml
    • 1

    19.android framwork打印调用栈

    // c++ 代码
    #include <utils/CallStack.h>  
    ...  
    CallStack stack;  
    stack.update();  
    stack.dump();
    
    
    ----------
    
    
    // java 代码
    Log.d(TAG,Log.getStackTraceString(new Throwable()));  
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    20.快速编译打包bootimage和system

    make kernel:只重新编译kernel部分镜像,但是不会打包更新boot.img 
    make bootimage-nodeps:不会编译kernel以及ramdisk,只会将out目录中现有的kernel和ramdisk.img重新打包一次生成boot.img 
    make ramdisk:只重新编译ramdisk镜像,生成ramdisk.img,但是不会打包更新boot.img 
    make ramdisk-nodeps:不会编译ramdisk,只会将out目录中现有的文件重新打包一次。out/target/product/hq6737t_66_1ha_m0/root,比如更改了init..rc之类的文件,只需要修改out/…/root/中对应的文件,然后重新用此命令打包一次,就会生成一个包含更改过init..rc的ramdisk.img 
    make snod:打包system


    21.modern

    ./mk johnson-eng update-none-hlos.bin
    
    vendor/qcom/non-hlos/MSM8953.LA.2.0/common/build/bin/asic/NON-HLOS.bin
    • 1
    • 2
    • 3

    22.Qcom 开机后继续打印串口log

    主要是修改 persist.console.silent.config 属性,
               persist.console.silent.config = 1是不打印,
               persist.console.silent.config = 0继续打印。
       修改的文件,
     将手机中的build.prop导出, 直接修改,再push进去;
    修改 device/qcom/msmXXX/system.prop,编译systemimage。
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    23.关闭selinux

    
    when build, open the CONFIG_SECURITY_SELINUX_DEVELOP, add then append the " androidboot.selinux=permissive" in commandline.
    
    or in device/qcom/msmxxxx/system.prop, add ro.boot.selinux=disable
    • 1
    • 2
    • 3
    • 4

    24.sbl检测电池是否在位

    Non-HOLS/BOOT.BF.3.3/boot_images/core/systemdrivers/pmic/app/chg/src/pm_app_smbchg.c 里有个检测电池在不在的函数,Check Battery presence
    • 1

    25.charge log mask

    qpnp-smbcharger.c:
    + #define DEBUG
    - static int smbchg_debug_mask;
    + static int smbchg_debug_mask = 0xFF; 
    • 1
    • 2
    • 3
    • 4

    26.各模块JNI层代码


    26.1 surfaceflinger

    android_view_Surface.cpp
    static const JNINativeMethod gSurfaceMethods[] = {
    
    
    demo
    SurfaceTest.cpp
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6


    27.input keyevent 命令

    对应的键值 frameworks/native/include/android/keycodes.h

    $adb shell input keyevent 26            // power
    
    $adb shell input keyevent 4            //模拟返回键(BACK)
    
    $adb shell input keyevent 82          //模拟菜单键(MENU)
    
    $adb shell input keyevent 3            //模拟主页键(HOME)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    28.inpudispatch中添加tp报点

    --- a/frameworks/native/services/inputflinger/InputDispatcher.cpp
    +++ b/frameworks/native/services/inputflinger/InputDispatcher.cpp
    @@ -2483,15 +2483,16 @@ bool InputDispatcher::shouldSendKeyToInputFilterLocked(const NotifyKeyArgs* args
     }
    
     void InputDispatcher::notifyMotion(const NotifyMotionArgs* args) {
    -#if DEBUG_INBOUND_EVENT_DETAILS
    -    ALOGD("notifyMotion - eventTime=%lld, deviceId=%d, source=0x%x, policyFlags=0x%x, "
    +       ALOGE("zch----in notifyMotion");
    +#if 1
    +    ALOGE("notifyMotion - eventTime=%lld, deviceId=%d, source=0x%x, policyFlags=0x%x, "
                 "action=0x%x, actionButton=0x%x, flags=0x%x, metaState=0x%x, buttonState=0x%x,"
                 "edgeFlags=0x%x, xPrecision=%f, yPrecision=%f, downTime=%lld",
                 args->eventTime, args->deviceId, args->source, args->policyFlags,
                 args->action, args->actionButton, args->flags, args->metaState, args->buttonState,
                 args->edgeFlags, args->xPrecision, args->yPrecision, args->downTime);
         for (uint32_t i = 0; i < args->pointerCount; i++) {
    -        ALOGD("  Pointer %d: id=%d, toolType=%d, "
    +        ALOGE("  Pointer %d: id=%d, toolType=%d, "
                     "x=%f, y=%f, pressure=%f, size=%f, "
                     "touchMajor=%f, touchMinor=%f, toolMajor=%f, toolMinor=%f, "
                     "orientation=%f",
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    29.wifi连接adb

    1. 在目标板上通过使用以太网连接来配置adb守护进程,使用setprop来设置守护进程的端口号
         # setprop service.adb.tcp.port 5555
    
    2. 如果以上配置成功,再重启目标板上的adbd服务
         # stop adbd
         # start adbd
    
    3. 在主机端使用如下命令建立adb连接
         export ADBHOST=<target's ip address>
         adb kill-server
         adb start-server
         adb connect <target_ip_address>:5555
    
    4. 使用如下命令确认设备连接成功
         adb devices
        设备连接成功后将出现设备序列号和名称
  • 相关阅读:
    Feign (配合Hystrix) +文件传输
    springCloud Euraka (HA && docker)
    MySQL表结构映射为Python中的对象 python (SQLAlchemy)
    sqoop 脚本
    ubuntu16 ntp时钟同步服务设置
    Bootstrap3基础教程 03 导航栏
    Bootstrap3基础教程 02 网格布局
    Bootstrap3基础教程 01 概述
    C#面向对象21 接口
    C#面向对象20 序列化和反序列化
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7667987.html
Copyright © 2011-2022 走看看