From e1b1ebe197734816b7d84049cf058dc5375ec310 Mon Sep 17 00:00:00 2001 From: "chunfei.wang" Date: Thu, 25 Jun 2026 11:15:16 +0000 Subject: [PATCH 6/6] logcat: devtool logcat build init [1/1] PD#SWPL-275381 Problem: devtool logcat not build Solution: logcat build init Fixed conflicts: NA Verify: A9 Change-Id: If0acee48f204fb30c9df9c972cfed8287ebe19a5 Signed-off-by: chunfei.wang --- config/boards/include/amlogic_common.inc | 1 + extensions/amlogic-overlay.sh | 3 + lib/function-img.sh | 11 + .../android-tools-logcat/build-logcat.sh | 422 ++++++++++++++++++ .../android-tools-logcat/files/logcat.patch | 43 ++ 5 files changed, 480 insertions(+) create mode 100755 scripts/devtools/android-tools-logcat/build-logcat.sh create mode 100755 scripts/devtools/android-tools-logcat/files/logcat.patch diff --git a/config/boards/include/amlogic_common.inc b/config/boards/include/amlogic_common.inc index fee9e72..b012e32 100644 --- a/config/boards/include/amlogic_common.inc +++ b/config/boards/include/amlogic_common.inc @@ -64,6 +64,7 @@ BUILD_UNITS=( gst-aml-vendor isp tvserver + devtool ) else # Note: BUILD_UNITS is transformed into an array during processing. diff --git a/extensions/amlogic-overlay.sh b/extensions/amlogic-overlay.sh index 4e568f6..cc4b30f 100644 --- a/extensions/amlogic-overlay.sh +++ b/extensions/amlogic-overlay.sh @@ -249,6 +249,9 @@ function load_local_source() { display_alert "AMLOGIC" ">> Start build linux-uapi-headers " "info" source "${EXTENSION_DIR}/../scripts/build-linux-uapi-headers.sh" + display_alert "AMLOGIC" ">> Start build logcat " "info" + source "${EXTENSION_DIR}/../scripts/devtools/android-tools-logcat/build-logcat.sh" + if ! is_unit_enabled "rootfs"; then echo "rootfs NOT in BUILD_UNITS, exit immediately" exit 1 diff --git a/lib/function-img.sh b/lib/function-img.sh index c79cdbd..9afa448 100644 --- a/lib/function-img.sh +++ b/lib/function-img.sh @@ -329,6 +329,16 @@ function install_tvserver_deb { install_aml_deb $ubootenv_file } +function install_logcat_deb { + if ! is_unit_enabled "devtool" || ! is_unit_enabled "liblog"; then + display_alert "[SKIP] >> devtool android tool logcat disabled ( not install)" "" "info" + return + fi + + local logcat_file=$(find "${BUILD_DEBS}" -name "android-tools-logcat*.deb" 2>/dev/null) + install_aml_deb $logcat_file +} + function install_common() { display_alert "install amlogic debs: GPU/NPU/DEC/ENC/... ... " "IMG" "info" @@ -378,6 +388,7 @@ function install_common() { install_media_deb install_tvserver_deb + install_logcat_deb if [[ $(type -t tweaks_platform) == function ]]; then tweaks_platform diff --git a/scripts/devtools/android-tools-logcat/build-logcat.sh b/scripts/devtools/android-tools-logcat/build-logcat.sh new file mode 100755 index 0000000..0f8ef22 --- /dev/null +++ b/scripts/devtools/android-tools-logcat/build-logcat.sh @@ -0,0 +1,422 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: (GPL-2.0-only OR MIT) +# Copyright (C) 2026 Amlogic, Inc. All rights reserved +################################################################################ +# Amlbian Logcat Compilation Module +# +# Purpose: Compile and package logcat tool for Android debugging +# Provides: logcat binary for system logging +################################################################################ + +set -e + +# Get script directory +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +AMLBIAN_DIR="$(dirname "$(dirname "$(dirname "${SCRIPT_DIR}")")")" +BASE_DIR="$(dirname "$(dirname "${AMLBIAN_DIR}")")" + +# Source common functions +if [[ -f "${AMLBIAN_DIR}/lib/function-common.sh" ]]; then + source "${AMLBIAN_DIR}/lib/function-common.sh" +fi + +# ============================================================================== +# Shared Helper Functions +# ============================================================================== + +# ------------------------------------------------------------------------------ +# Step 1: Version and Package Information Definition +# ------------------------------------------------------------------------------ + +# Initialize common package metadata for logcat +function _logcat_init_package_info() { + PKG_MAINTAINER="Armbian Build " + PKG_DESCRIPTION="Android logcat tool for system logging" + PKG_NAME="android-tools-logcat" + PKG_VERSION="1.0" + PKG_ARCH="all" + + # Source directory for logcat + LOGCAT_SRC_DIR="${BASE_DIR}/aml-comp/vendor/amlogic/aml_commonlib/logcat" + FILES_DIR="${SCRIPT_DIR}/files" +} + +# ------------------------------------------------------------------------------ +# Step 2: Build Directory Structure Setup +# ------------------------------------------------------------------------------ + +# Create layered build directory structure +# Parameters: +# $1 - base name (e.g. "${PKG_NAME}_${PKG_VERSION}_${PKG_ARCH}") +# Sets: TMP_DIR, BASE_BUILD_DIR, SOURCE_DIR, BUILD_DIR, INSTALL_DIR, PATCH_DIR, +# DEB_PACKAGE_DIR, DEBIAN_DIR +function _logcat_create_build_dirs() { + local base_name="$1" + + TMP_DIR="${SRC}/.tmp" + mkdir -p "${TMP_DIR}" + + # 基础构建目录 + BASE_BUILD_DIR="${TMP_DIR}/${base_name}" + + rm -rf ${BASE_BUILD_DIR} + # 分层目录 + SOURCE_DIR="${BASE_BUILD_DIR}/source" # 源码目录 + BUILD_DIR="${BASE_BUILD_DIR}/build" # 编译目录 + INSTALL_DIR="${BASE_BUILD_DIR}/install" # 安装目录 + PATCH_DIR="${BASE_BUILD_DIR}/patch" # 补丁目录 + + # 创建所有目录 + mkdir -p "${SOURCE_DIR}" + mkdir -p "${BUILD_DIR}" + mkdir -p "${INSTALL_DIR}" + mkdir -p "${PATCH_DIR}" + + # 在BUILD_DIR下创建deb/包名目录 + DEB_PACKAGE_DIR="${BUILD_DIR}/deb/${base_name}" + mkdir -p "${DEB_PACKAGE_DIR}" + + # 安装目录的子目录 + DEBIAN_DIR="${INSTALL_DIR}/DEBIAN" + mkdir -p "${DEBIAN_DIR}" +} + +# Create standard install subdirectories for logcat +function _logcat_create_install_dirs() { + mkdir -p "${INSTALL_DIR}/usr/bin" +} + +# ------------------------------------------------------------------------------ +# Step 3: Debian Packaging Scripts Creation +# ------------------------------------------------------------------------------ + +# Create Debian control file +# Parameters: +# $1 - package name +# $2 - package version +# $3 - package architecture +# $4 - maintainer +# $5 - description +# $6 - section (optional, default "utils") +function _logcat_create_control_file() { + local pkg_name="$1" + local pkg_version="$2" + local pkg_arch="$3" + local maintainer="$4" + local description="$5" + local section="${6:-utils}" + + display_alert "COMPILE-LOGCAT Creating control file DEBIAN/control" "info" + cat > "${DEBIAN_DIR}/control" < "${DEBIAN_DIR}/postinst" << EOF +#!/bin/sh +set -e + +if [ "\$1" = "configure" ]; then + echo "Logcat tool installed successfully" + echo "Usage: logcat [options]" +fi + +exit 0 +EOF + chmod 755 "${DEBIAN_DIR}/postinst" +} + +# Create prerm script for logcat +function _logcat_create_prerm() { + display_alert "COMPILE-LOGCAT Creating pre-removal script DEBIAN/prerm" "info" + cat > "${DEBIAN_DIR}/prerm" << EOF +#!/bin/sh +set -e + +if [ "\$1" = "remove" ] || [ "\$1" = "deconfigure" ]; then + echo "Logcat tool being removed" +fi + +exit 0 +EOF + chmod 755 "${DEBIAN_DIR}/prerm" +} + +# ------------------------------------------------------------------------------ +# Step 4: Source/Vendor File Copying and Patching +# ------------------------------------------------------------------------------ + +# Copy logcat source files and apply patches +function _logcat_copy_and_patch_files() { + display_alert "COMPILE-LOGCAT Copying source files from ${LOGCAT_SRC_DIR}" "info" + + # Check if source directory exists + if [[ ! -d "${LOGCAT_SRC_DIR}" ]]; then + display_alert "COMPILE-LOGCAT Source directory not found: ${LOGCAT_SRC_DIR}" "err" + display_alert "COMPILE-LOGCAT Trying to clone or find alternative source" "info" + # Try to find source in other locations + LOGCAT_SRC_DIR="${BASE_DIR}/aml-comp/vendor/amlogic/aml_commonlib/logcat" + if [[ ! -d "${LOGCAT_SRC_DIR}" ]]; then + display_alert "COMPILE-LOGCAT Source not found. Please ensure aml_commonlib is available" "err" + exit 1 + fi + fi + + # Copy source files + cp -r "${LOGCAT_SRC_DIR}" "${SOURCE_DIR}/logcat" + display_alert "COMPILE-LOGCAT Copied logcat source files" "info" + + # Apply patches if available + if [[ -f "${FILES_DIR}/logcat.patch" ]]; then + display_alert "COMPILE-LOGCAT Applying logcat.patch" "info" + cd "${SOURCE_DIR}" + patch -p1 < "${FILES_DIR}/logcat.patch" || true + cd - > /dev/null + fi +} + +# ------------------------------------------------------------------------------ +# Step 5: Liblog Dependency Handling +# ------------------------------------------------------------------------------ + +# Check and build liblog dependency if needed +function _logcat_check_liblog_dependency() { + display_alert "COMPILE-LOGCAT Checking liblog dependency" "info" + + # Check if liblog is already built + local liblog_dir="${SRC}/.tmp/liblog-build-${ARCH:-arm64}" + local liblog_install_dir="${liblog_dir}/install" + + if [[ ! -d "${liblog_install_dir}" ]] || [[ ! -f "${liblog_install_dir}/usr/lib/liblog.so" ]]; then + display_alert "COMPILE-LOGCAT liblog not found, building liblog..." "info" + + # Build liblog + if ! ( + cd "${AMLBIAN_DIR}" + source "${AMLBIAN_DIR}/scripts/build-liblog.sh" + ); then + display_alert "COMPILE-LOGCAT Failed to build liblog" "err" + return 1 + fi + + # Verify liblog was built + if [[ ! -d "${liblog_install_dir}" ]] || [[ ! -f "${liblog_install_dir}/usr/lib/liblog.so" ]]; then + display_alert "COMPILE-LOGCAT liblog still not found after build" "err" + return 1 + fi + fi + + display_alert "COMPILE-LOGCAT liblog dependency satisfied" "info" + return 0 +} + +# ------------------------------------------------------------------------------ +# Step 6: Compilation +# ------------------------------------------------------------------------------ + +# Compile logcat tool +function _logcat_compile() { + display_alert "COMPILE-LOGCAT Compiling logcat tool" "info" + + # First check and build liblog dependency + if ! _logcat_check_liblog_dependency; then + display_alert "COMPILE-LOGCAT Cannot compile without liblog" "err" + exit 1 + fi + + # Get liblog paths + local liblog_dir="${SRC}/.tmp/liblog-build-${ARCH:-arm64}" + local liblog_install_dir="${liblog_dir}/install" + + cd "${SOURCE_DIR}/logcat" + + # Set up build environment with liblog paths + export OUT_DIR="${BUILD_DIR}" + export TARGET_DIR="${INSTALL_DIR}" + export STAGING_DIR="${STAGING_DIR_TARGET:-${BASE_DIR}/staging}" + export DESTDIR="${INSTALL_DIR}" + + # Add liblog include and library paths + export CFLAGS="-I${SOURCE_DIR}/logcat/include" + export LDFLAGS="-L${liblog_install_dir}/usr/lib -llog" + + # Create necessary directories + mkdir -p "${BUILD_DIR}" + mkdir -p "${STAGING_DIR}" + + # Create a temporary Makefile override to fix logcat_test compilation + # The original Makefile doesn't include $(CFLAGS) in the logcat_test rule + local makefile_override="${TMP_DIR}/logcat-override.mk" + cat > "${makefile_override}" << 'EOF' +# Makefile override for logcat_test compilation +# Fixes the missing $(CFLAGS) in the original rule + +# Override the logcat_test rule to include $(CFLAGS) +logcat_test: logcat_test.c + $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $(OUT_DIR)/$@ +EOF + + # Compile with liblog support, using both the original Makefile and the override + # Use -f to specify multiple makefiles: original Makefile first, then override + make -C "${SOURCE_DIR}/logcat" \ + OUT_DIR="${BUILD_DIR}" \ + TARGET_DIR="${INSTALL_DIR}" \ + STAGING_DIR="${STAGING_DIR}" \ + DESTDIR="${INSTALL_DIR}" \ + CFLAGS="${CFLAGS} -DHAVE_IOCTL" \ + LDFLAGS="${LDFLAGS}" \ + -f Makefile -f "${makefile_override}" + + cd - > /dev/null + + # Check if compilation succeeded + if [[ ! -f "${BUILD_DIR}/logcat" ]]; then + display_alert "COMPILE-LOGCAT Compilation failed: logcat binary not found" "err" + exit 1 + fi + + display_alert "COMPILE-LOGCAT Compilation successful" "info" +} + +# ------------------------------------------------------------------------------ +# Step 7: Installation +# ------------------------------------------------------------------------------ + +# Install logcat binaries +function _logcat_install() { + display_alert "COMPILE-LOGCAT Installing binaries" "info" + + # Create bin directory + mkdir -p "${INSTALL_DIR}/usr/bin" + + # Install logcat binary + if [[ -f "${BUILD_DIR}/logcat" ]]; then + install -m 0755 "${BUILD_DIR}/logcat" "${INSTALL_DIR}/usr/bin/" + display_alert "COMPILE-LOGCAT Installed logcat binary" "info" + else + display_alert "COMPILE-LOGCAT logcat binary not found in ${BUILD_DIR}" "err" + exit 1 + fi + + # Install logcat_test if available + if [[ -f "${BUILD_DIR}/logcat_test" ]]; then + install -m 0755 "${BUILD_DIR}/logcat_test" "${INSTALL_DIR}/usr/bin/" + display_alert "COMPILE-LOGCAT Installed logcat_test binary" "info" + fi +} + +# ------------------------------------------------------------------------------ +# Step 8: Debian Package Building +# ------------------------------------------------------------------------------ + +# Build Debian package from install directory +# Parameters: +# $1 - log prefix (e.g. "COMPILE-LOGCAT") +# $2 - output deb filename (without path) +# Sets: OUTPUT_DEB +function _logcat_build_deb_package() { + local log_prefix="$1" + local output_deb_name="$2" + + # 将install目录内容拷贝到deb目录 + display_alert "Copying install directory to deb package directory ${log_prefix}" "info" + cp -r "${INSTALL_DIR}/"* "${DEB_PACKAGE_DIR}/" 2>&1 + + # 基于deb目录打包 + display_alert "Building Debian package from deb directory ${log_prefix}" "info" + dpkg-deb --build "${DEB_PACKAGE_DIR}" 2>&1 + + # Move to output directory + OUTPUT_DEB="${SRC}/output/${output_deb_name}" + mkdir -p "$(dirname "${OUTPUT_DEB}")" + mv "${DEB_PACKAGE_DIR}.deb" "${OUTPUT_DEB}" + + display_alert "${log_prefix} Package built successfully ${output_deb_name}" "info" + display_alert "${log_prefix} Build directory preserved ${BASE_BUILD_DIR}" "info" +} + +# Display build directory info +# Parameters: +# $1 - log prefix +function _logcat_display_build_info() { + local log_prefix="$1" + display_alert "${log_prefix} Source dir: ${SOURCE_DIR}" "info" + display_alert "${log_prefix} Build dir: ${BUILD_DIR}" "info" + display_alert "${log_prefix} Install dir: ${INSTALL_DIR}" "info" + display_alert "${log_prefix} Patch dir: ${PATCH_DIR}" "info" + display_alert "${log_prefix} Deb package dir: ${DEB_PACKAGE_DIR}" "info" + display_alert "${log_prefix} Logcat source dir: ${LOGCAT_SRC_DIR}" "info" +} + +# ============================================================================== +# Main Build Functions (Entry Points - DO NOT RENAME) +# ============================================================================== + +# ------------------------------------------------------------------------------ +# Logcat Tool Build +# Entry point: amlbian_build_logcat +# ------------------------------------------------------------------------------ + +function amlbian_build_logcat() { + + if ! is_unit_enabled "devtool" || ! is_unit_enabled "liblog"; then + echo "[SKIP] >> Logcat disable in BUILD_UNITS" + return + fi + + # ---- Step 1: Version and Package Information ---- + _logcat_init_package_info + + # ---- Step 2: Build Directory Setup ---- + _logcat_create_build_dirs "${PKG_NAME}_${PKG_VERSION}_${PKG_ARCH}" + _logcat_create_install_dirs + + # Display info + display_alert "COMPILE-LOGCAT Building logcat tool package version ${PKG_VERSION}" "info" + _logcat_display_build_info "COMPILE-LOGCAT" + + # ---- Step 3: Debian Packaging Scripts ---- + _logcat_create_control_file \ + "${PKG_NAME}" "${PKG_VERSION}" "${PKG_ARCH}" "${PKG_MAINTAINER}" \ + "${PKG_DESCRIPTION}" "utils" + + _logcat_create_postinst + _logcat_create_prerm + + # ---- Step 4: Copy Source/Vendor Files and Apply Patches ---- + _logcat_copy_and_patch_files + + # ---- Step 5: Check and Build Liblog Dependency ---- + if ! _logcat_check_liblog_dependency; then + display_alert "COMPILE-LOGCAT Cannot proceed without liblog" "err" + return 1 + fi + + # ---- Step 6: Compilation ---- + _logcat_compile + + # ---- Step 7: Installation ---- + _logcat_install + + # ---- Step 8: Build Debian Package ---- + _logcat_build_deb_package "COMPILE-LOGCAT" "${PKG_NAME}_${PKG_VERSION}_${PKG_ARCH}.deb" + + display_alert "COMPILE-LOGCAT Logcat tool build completed successfully" "info" + return 0 +} + +display_alert "AMLbian Logcat Build Script" "Scriptdir: ${SCRIPT_DIR} AmlbianDir: ${AMLBIAN_DIR}" "info" +amlbian_build_logcat +display_alert "AMLOGIC: logcat build completed" "${OUTPUT_DIR}" "info" \ No newline at end of file diff --git a/scripts/devtools/android-tools-logcat/files/logcat.patch b/scripts/devtools/android-tools-logcat/files/logcat.patch new file mode 100755 index 0000000..68633fa --- /dev/null +++ b/scripts/devtools/android-tools-logcat/files/logcat.patch @@ -0,0 +1,43 @@ +diff --git a/logcat/Makefile b/logcat/Makefile +index 19a47c5..ccdfd7e 100644 +--- a/logcat/Makefile ++++ b/logcat/Makefile +@@ -7,15 +7,19 @@ OBJ = logcat.o + CFLAGS = -Wall -Wextra -I $(LOGCAT_DIR)/include -DHAVE_IOCTL + LDFLAGS = -L$(STAGING_DIR)/usr/lib -llog + TARGET=logcat ++TEST := logcat_test + + # rules +-all: $(TARGET) ++all: $(TARGET) $(TEST) + + $(TARGET): $(OBJ) ++ $(CXX) $(LDFLAGS) $^ -o $@ ++ ++$(TEST): logcat_test.c + $(CC) $(LDFLAGS) $^ -o $@ + + %.o: %.cpp +- $(CC) -c $(CFLAGS) $^ -o $@ ++ $(CXX) -c $(CFLAGS) $^ -o $@ + + .PHONY: clean + +diff --git a/logcat/logcat_test.c b/logcat/logcat_test.c +new file mode 100644 +index 0000000..b48bcdb +--- /dev/null ++++ b/logcat/logcat_test.c +@@ -0,0 +1,11 @@ ++#include ++#include ++#include ++ ++int main(int argc, char ** argv){ ++ while (1){ ++ sleep(1); ++ ALOGE("abert %s: test======>%d \n", __FUNCTION__, __LINE__); ++ } ++ return 0; ++} -- 2.25.1