├── .gitattributes ├── .gitignore ├── META-INF └── com │ └── google │ └── android │ ├── update-binary │ └── updater-script ├── README.md ├── customize.sh ├── module.prop ├── post-fs-data.sh ├── service.sh └── util.sh /.gitattributes: -------------------------------------------------------------------------------- 1 | # Declare files that will always have LF line endings on checkout. 2 | META-INF/** text eol=lf 3 | *.prop text eol=lf 4 | *.sh text eol=lf 5 | *.md text eol=lf 6 | 7 | # Denote all files that are truly binary and should not be modified. 8 | system/** binary 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | __MACOSX 2 | .DS_Store 3 | *.zip 4 | *.bat 5 | -------------------------------------------------------------------------------- /META-INF/com/google/android/update-binary: -------------------------------------------------------------------------------- 1 | #!/sbin/sh 2 | 3 | ################# 4 | # Initialization 5 | ################# 6 | 7 | umask 022 8 | 9 | # echo before loading util_functions 10 | ui_print() { echo "$1"; } 11 | 12 | require_new_magisk() { 13 | ui_print "*******************************" 14 | ui_print " Please install Magisk v20.4+! " 15 | ui_print "*******************************" 16 | exit 1 17 | } 18 | 19 | ######################### 20 | # Load util_functions.sh 21 | ######################### 22 | 23 | OUTFD=$2 24 | ZIPFILE=$3 25 | 26 | mount /data 2>/dev/null 27 | 28 | [ -f /data/adb/magisk/util_functions.sh ] || require_new_magisk 29 | . /data/adb/magisk/util_functions.sh 30 | [ $MAGISK_VER_CODE -lt 20400 ] && require_new_magisk 31 | 32 | install_module 33 | exit 0 -------------------------------------------------------------------------------- /META-INF/com/google/android/updater-script: -------------------------------------------------------------------------------- 1 | #MAGISK -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Log-Catcher 2 | 3 | Catch boot log and save to /cache/bootlog/boot.log. 4 | 5 | When /cache is not exist fallback to /data/local/bootlog/boot.log. 6 | 7 | This module can help you to save boot log. 8 | 9 | If you don't want to kill the logcat process after boot completed, you can create /data/local/logcatcher/boot.lcs file. 10 | -------------------------------------------------------------------------------- /customize.sh: -------------------------------------------------------------------------------- 1 | if [ -d "/data/adb/modules/logcat" ]; then 2 | touch /data/adb/modules/logcat/remove 3 | fi 4 | -------------------------------------------------------------------------------- /module.prop: -------------------------------------------------------------------------------- 1 | id=hwr_logcat 2 | name=Log Catcher 3 | version=v22.5 4 | versionCode=27 5 | author=Howard 6 | description=Catch boot log to /cache/boot.log. 7 | support=https://t.me/hzrtools 8 | -------------------------------------------------------------------------------- /post-fs-data.sh: -------------------------------------------------------------------------------- 1 | #!/system/bin/sh 2 | MODDIR=${0%/*} 3 | 4 | grep_prop() { 5 | local REGEX="s/^$1=//p" 6 | shift 7 | local FILES="$@" 8 | [ -z "$FILES" ] && FILES='/system/build.prop' 9 | sed -n "$REGEX" ${FILES} 2>/dev/null | head -n 1 10 | } 11 | MAGISK_VERSION=$(magisk -v) 12 | MAGISK_VER_CODE=$(magisk -V) 13 | android_sdk=$(getprop ro.build.version.sdk) 14 | build_desc=$(getprop ro.build.description) 15 | product=$(getprop ro.build.product) 16 | manufacturer=$(getprop ro.product.manufacturer) 17 | brand=$(getprop ro.product.brand) 18 | MODEL=$(getprop ro.product.model) 19 | fingerprint=$(getprop ro.build.fingerprint) 20 | arch=$(getprop ro.product.cpu.abi) 21 | device=$(getprop ro.product.device) 22 | android=$(getprop ro.build.version.release) 23 | build=$(getprop ro.build.id) 24 | LOGC_VERSION=$(grep_prop version "${MODDIR}/module.prop") 25 | LOGC_VERSIONCODE=$(grep_prop versionCode "${MODDIR}/module.prop") 26 | . $MODDIR/util.sh 27 | check_logpath 28 | 29 | if [ -d "$LOG_PATH" ]; then 30 | if [ ! -d ${LOG_PATH}/old ]; then 31 | mkdir -p ${LOG_PATH}/old 32 | fi 33 | if [ -f ${LOG_PATH}/*.log ]; then 34 | mv ${LOG_PATH}/*.log "${LOG_PATH}/old" 35 | fi 36 | else 37 | mkdir -p $LOG_PATH 38 | fi 39 | 40 | LOG_FILE=$LOG_PATH/boot.log 41 | rm -f "${LOG_FILE}" 42 | touch "${LOG_FILE}" 43 | { 44 | echo "Log Catcher version: ${LOGC_VERSION} (${LOGC_VERSIONCODE})" 45 | echo "--------- beginning of information" 46 | echo "Manufacturer: ${manufacturer}" 47 | echo "Brand: ${brand}" 48 | echo "Device: ${device}" 49 | echo "Product: ${product}" 50 | echo "Model: ${MODEL}" 51 | echo "Fingerprint: ${fingerprint}" 52 | echo "ROM build description: ${build_desc}" 53 | echo "Architecture: ${arch}" 54 | echo "Android build: ${build}" 55 | echo "Android version: ${android}" 56 | echo "Android sdk: ${android_sdk}" 57 | echo "Magisk: ${MAGISK_VERSION%:*} (${MAGISK_VER_CODE})" 58 | echo "--------- beginning of dmesg" 59 | dmesg 60 | echo "--------- beginning of SELinux" 61 | getenforce 62 | } >>"${LOG_FILE}" 63 | logcat -b main,system,crash -f "${LOG_FILE}" logcatcher-bootlog:S & 64 | if [ -d "/data/adb/modules/logcat" ]; then 65 | [ -f /data/adb/modules/logcat/remove ] || touch /data/adb/modules/logcat/remove 66 | fi 67 | -------------------------------------------------------------------------------- /service.sh: -------------------------------------------------------------------------------- 1 | #!/system/bin/sh 2 | MODDIR=${0%/*} 3 | . $MODDIR/util.sh 4 | check_logpath 5 | 6 | while [ "$(getprop sys.boot_completed)" != "1" ]; do 7 | sleep 3 8 | done 9 | check_unlock 10 | FILE=/data/local/logcatcher/boot.lcs 11 | if [ ! -f "$FILE" ]; then 12 | pkill -f logcatcher-bootlog:S 13 | if [ -d ${LOG_PATH}/old ]; then 14 | tar -czf ${LOG_PATH}/oldlogbak.tar.gz ${LOG_PATH}/old 15 | rm -rf ${LOG_PATH}/old 16 | fi 17 | TIME=$(date +%Y-%m-%d-%H-%M-%S) 18 | if [ -f ${LOG_PATH}/boot.log ]; then 19 | mv ${LOG_PATH}/boot.log ${LOG_PATH}/boot-$TIME.log 20 | tar -czf ${LOG_PATH}/bootlog.tar.gz ${LOG_PATH}/*.log 21 | fi 22 | if [ -f ${LOG_PATH}/bootlog.tar.gz ]; then 23 | check_write 24 | su -c cp ${LOG_PATH}/bootlog.tar.gz /storage/emulated/0/Download/bootlog-$TIME.tar.gz 25 | if [ -f "/storage/emulated/0/Download/bootlog-$TIME.tar.gz" ]; then 26 | rm -f ${LOG_PATH}/bootlog.tar.gz 27 | echo cp success >/data/local/tmpcache.txt 28 | else 29 | cp ${LOG_PATH}/bootlog.tar.gz /sdcard/Android/bootlog-$TIME.tar.gz 30 | fi 31 | fi 32 | fi 33 | -------------------------------------------------------------------------------- /util.sh: -------------------------------------------------------------------------------- 1 | #!/system/bin/sh 2 | check_logpath() { 3 | if [ -d /cache ]; then 4 | LOG_PATH=/cache/bootlog 5 | else 6 | LOG_PATH=/data/local/bootlog 7 | fi 8 | } 9 | check_unlock() { 10 | local TEST_DIR=/sdcard/Android 11 | while [ ! -d "$TEST_DIR" ]; do 12 | sleep 3 13 | done 14 | local TEST_FILE="$TEST_DIR/.PERMISSION_TEST" 15 | true >"$TEST_FILE" 16 | while [ ! -f "$TEST_FILE" ]; do 17 | true >"$TEST_FILE" 18 | sleep 3 19 | done 20 | rm "$TEST_FILE" 21 | } 22 | check_write() { 23 | local TEST_DIR=/sdcard/Download 24 | [ -d $TEST_DIR ] || mkdir -p $TEST_DIR 25 | local TEST_FILE="$TEST_DIR/.PERMISSION_TEST" 26 | true >"$TEST_FILE" 27 | while [ ! -f "$TEST_FILE" ]; do 28 | true >"$TEST_FILE" 29 | sleep 3 30 | done 31 | rm "$TEST_FILE" 32 | } 33 | --------------------------------------------------------------------------------