[MTK] User版本开机异常/无法开机,如何抓取log

文摘 MediaTek 2020-03-6 阅读:6359

[Description]
User版本出现开机异常, 无法开机,如何抓取log 资讯

[Keyword]
User版本 开机 log logcat uart main

[Solution]
首先需要确认开机异常发生在哪个阶段。
1. 没有任何LOGO 显示;       在 LK 或者以前就出现异常,此时直接拉出uart 抓取uart log 即可。
   因默认uart log, 到进入kernel 后才关闭,所以case 1, 只需要直接拉出uart, 接入即可抓到LOG。
2. 只显示第一个LOGO:        可能卡在LK 或者kenrel 启动过程中,此时需要拉出uart ,并且打开kernel 的uart log.
   参考[FAQ: 如何在User版本开启串口(Uart),开启输入控制台,抓取上层Log].

3. 显示第二个Loading LOGO:  卡在init 进程以后,到开机动画之前,此时需要拉出uart, 并且抓取android 上层main log.
4. 进入开机动画及以后:       卡在android 上层启动过程中,此时需要抓取android 上层main log(必要),以及uart log(不是必须).

针对Case 3, 4, 可以按照下面的流程执行:
(1). 
  (1.1).如果是JB 4.1 以及以后版本,直接修改函数should_drop_privileges() 函数, 清空这个函数,直接返回 0 即可。返回0 即开启root 权限。
        static init should_drop_privileges(){
            #ifndef ALLOW_ADBD_ROOT
                return 0; //MTK71029 Update for release root role.
            #else
                ..........
        }

         M版:alps/system/core/adb/adb_main.cpp

         N/O版:alps/system/core/adb/daemon/main.cpp

    static bool should_drop_privileges() {

   return 0; //MTK Update for release root role.

   ......

}

  (1.2).如果是JB 4.1 以前版本,直接修改函数adb_main 函数,在
     / don't listen on a port (default 5037) if running in secure mode /
     / don't run as root if we are running in secure mode /
    if (secure) {
        struct __user_cap_header_struct header;
        struct __user_cap_data_struct cap;

        if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0) != 0) {
            exit(1);
        }

  在这段代码前加一行:

      secure = 0;  //mtk71029 add for root forever.

      / don't listen on a port (default 5037) if running in secure mode /
      / don't run as root if we are running in secure mode /
     if (secure) {
          struct __user_cap_header_struct header;
          struct __user_cap_data_struct cap;

          if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0) != 0) {
              exit(1);
          }

  (1.3) Uart 控制台的开启以及adb debug 默认启动,决定于System property ro.debuggable,默认如果ro.debuggable=1 则开启(Eng 版本),User 版本ro.debuggable=0 则关闭。
      想在User 版本中打开,需要更新alps/mediatek/config/mt6xxx/init.rc (M版以后在alps/system/core/rootdir/init.rc), 在init.rc 的触发器代码:
        on property:ro.debuggable=1
            start console
        后面增加:
        假如是android 4.0 以及以后的版本:
        on property:ro.debuggable=0
            start console
            setprop persist.sys.usb.config mass_storage,adb
        假如是android 4.0 以前的版本:
        on property:ro.debuggable=0
            start console
            setprop persist.service.adb.enable 1

(1.4) 如果是KK 4.4 版本以后, User 版本默认开启了adb 的RSA 指纹验证, 可以参考FAQ:  ID: FAQ10781 如何开启与关闭adb 的认证机制(google adb secure) (adb RSA 指纹认证)
修改alps/build/core/main.mk
  ifeq (true,$(strip $(enable_target_debugging)))
    # Target is more debuggable and adbd is on by default
    ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=1
    ADDITIONAL_DEFAULT_PROPERTIES += ro.adb.secure=0 ==> 如果想在ENG Load关闭认证功能,ro.adb.secure=0
    # Include the debugging/testing OTA keys in this build.
    INCLUDE_TEST_OTA_KEYS := true
  else # !enable_target_debugging
    # Target is less debuggable and adbd is off by default
    ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=0
    ADDITIONAL_DEFAULT_PROPERTIES += ro.adb.secure=0 ==> 如果想在USER Load关闭认证功能,ro.adb.secure=0
  endif # !enable_target_debugging

对于M/N版本:

alps/device/mediatek/mt6xxx/device.mk#
ifneq ($(TARGET_BUILD_VARIANT),user)
ADDITIONAL_DEFAULT_PROPERTIES += ro.adb.secure=0
else
ADDITIONAL_DEFAULT_PROPERTIES += ro.adb.secure=0 ==> 如果想在USER Load关闭认证功能,ro.adb.secure=0

endif

对于O版本:

alps/build/core/main.mk  和  alps/build/make/core/main.mk
ifeq ($(user_variant),user)
ADDITIONAL_DEFAULT_PROPERTIES += ro.adb.secure=0 ==> 如果想在USER Load关闭认证功能,ro.adb.secure=0
endif

(1.5) 如果是L 版本, 需要手动关闭SELinux, 请参考FAQ: [SELinux] FAQ11484 如何设置确认selinux 模式 http://online.mediatek.inc/Pages/FAQ.aspx?List=SW&FAQID=FAQ11484
      更新bootable/bootloader/lk/platform/mt6xxx/rules.mk
            # choose one of following value -> 1: disabled/ 2: permissive /3: enforcing
            SELINUX_STATUS := 3
            调整这个SELINUX_STATUS这个的值为 2

       修改system/core/init/Android.mk 新增
           ifeq ($(strip $(TARGET_BUILD_VARIANT)),user)
                LOCAL_CFLAGS += -DALLOW_DISABLE_SELINUX=1
            endif

(2).  编译对应手机user 版本的bootimage, 如 mt6577v2_phone 即为你的project name 时:
        ./mk -o=TARGET_BUILD_VARIANT=user  mt6577v2_phone bootimage new

(3).  通过flashtool 只刷这个新编译的bootimage

(4).  插入USB adb 就默认以root 权限连接上,插入UART(UART 已经拉出), 输入aee -k 6 即可看到kernel log, 以及输入. adb 也默认已经开启。

0条评论

© 2024 芯缘异码. Powered by Typecho