From 1a12ec34bedad9290d786aea6f2bdd9792e54dcf Mon Sep 17 00:00:00 2001 From: zhuanghb3 Date: Sat, 11 Oct 2025 07:54:30 +0000 Subject: [PATCH] =?UTF-8?q?=E4=B8=BA=E4=BD=BF=E8=83=BDshadercache=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E7=9A=84=E5=BA=94=E7=94=A8=E5=88=9B=E5=BB=BAext4?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy_scripts/android_kbox_aosp15.sh | 27 +--- deploy_scripts/base_box_aosp15.sh | 144 +++++++++++++++++- ...kbox_render_accelerating_configuration.xml | 75 +++++++++ deploy_scripts/make_image_aosp15.sh | 7 +- 4 files changed, 220 insertions(+), 33 deletions(-) create mode 100644 deploy_scripts/kbox_render_accelerating_configuration.xml diff --git a/deploy_scripts/android_kbox_aosp15.sh b/deploy_scripts/android_kbox_aosp15.sh index 6d2f290..c871fd2 100644 --- a/deploy_scripts/android_kbox_aosp15.sh +++ b/deploy_scripts/android_kbox_aosp15.sh @@ -428,21 +428,8 @@ function start_box_by_id() { echo -e "---------------------- done ----------------------\n" fi if [[ $ENABLE_RENDER_LAYER == "1" ]]; then - # 渲染中间层 - local isEnabled=0; - docker exec -it ${CONTAINER_NAME} sh -c "chmod 777 -R /vendor/shader_cache/" - docker exec -it ${CONTAINER_NAME} sh -c "mkdir -p /data/local/debug/gles" - docker exec -it ${CONTAINER_NAME} sh -c "chmod 755 -R /data/local/debug/" - docker exec -it ${CONTAINER_NAME} sh -c "cp /system/vendor/etc/kbox_render_accelerating_configuration.xml /data/local/tmp" > /dev/null 2>&1 || isEnabled=1 - docker exec -it ${CONTAINER_NAME} sh -c "cp /system/vendor/lib64/hw/RenderAccLayer.kbox.so /data/local/debug/gles" > /dev/null 2>&1 - if [ $? -eq 0 ]; then - docker exec -it ${CONTAINER_NAME} sh -c "setprop debug.gles.layers RenderAccLayer.kbox.so" - else - isEnabled=1 - fi - if [ $isEnabled -eq 1 ]; then - echo -e "\033[31mFailed to enabled render layer! kbox_render_accelerating_configuration.xml or RenderAccLayer.kbox.so may not exist\033[0m" - fi + # 渲染中间层,放在base_box.sh会set property失败 + docker exec -it ${CONTAINER_NAME} sh -c "setprop debug.gles.layers RenderAccLayer.kbox.so" fi } @@ -493,21 +480,13 @@ function main() { else set +e local MOUNT_DIR=${KBOX_MOUNT_MAP[TAG_NUMBER - 1]} - bash $CURRENT_DIR/base_box_aosp15.sh restart "kbox_$TAG_NUMBER" "$MOUNT_DIR" 3 ${ENABLE_HARD_DECODE} + bash $CURRENT_DIR/base_box_aosp15.sh restart "kbox_$TAG_NUMBER" "$MOUNT_DIR" 3 ${ENABLE_HARD_DECODE} $ENABLE_RENDER_LAYER [ ${?} -eq 1 ] && continue enable_netint "kbox_$TAG_NUMBER" # 调整vinput设备权限 cid=$(docker ps | grep -w "kbox_$TAG_NUMBER" | awk '{print $1}') echo "c 13:* rwm" >$(ls -d /sys/fs/cgroup/devices/docker/$cid*/devices.allow) - if [[ $ENABLE_RENDER_LAYER == "1" ]]; then - docker exec -it "kbox_$TAG_NUMBER" sh -c "cp /system/vendor/lib64/hw/RenderAccLayer.kbox.so /data/local/debug/gles" > /dev/null 2>&1 - if [ $? -eq 0 ]; then - docker exec -it "kbox_$TAG_NUMBER" sh -c "setprop debug.gles.layers RenderAccLayer.kbox.so" - else - echo -e "\033[31mFailed to enabled render layer! RenderAccLayer.kbox.so may not exist\033[0m" - fi - fi set -e fi done diff --git a/deploy_scripts/base_box_aosp15.sh b/deploy_scripts/base_box_aosp15.sh index 3fcc984..869c85f 100644 --- a/deploy_scripts/base_box_aosp15.sh +++ b/deploy_scripts/base_box_aosp15.sh @@ -436,6 +436,118 @@ function chose_loop_device() { done } +function create_app_shader_filesystem() +{ + local box_name=$1 + local -n RUN_OPTION_REF=$2 + if [ ! -e "kbox_render_accelerating_configuration.xml" ]; then + echo -e "\033[31mThe RenderAccLayer cannot be enabled. kbox_render_accelerating_configuration.xml not exist.\033[0m" + return + fi + result=$(python3 << EOF +# -*- coding: utf-8 -*- +import xml.etree.ElementTree as ET + +app_config = {} + +def read_xml(xml_file): + try: + tree = ET.parse(xml_file) + root = tree.getroot() + dir_size_list = [-1, 64, 128, 256, 512, 1024] # 单位 MB + + for app in root.findall("Application"): + if app.get('isEnable') != 'true' and app.get('isEnable') != '1': + continue + app_name = app.get('name') + if app_name == "system": + continue + shader_cache_config = {} + # 提取shadercache配置 + for feature in app.findall('feature'): + if feature.get('name') != 'kbox.render.accelerating.shaderCache': + continue + if feature.get('isEnable') != 'true' and feature.get('isEnable') != '1': + continue + cache_mode = feature.find('.//param[@name="SHADER_CACHE_MODE"]') + cache_size = feature.find('.//param[@name="SHADER_CACHE_DIR_SIZE"]') + if cache_mode is not None: + mode = int(cache_mode.get('value')) + if mode < 0 or mode >= 3: + mode = 0 + shader_cache_config["mode"] = mode + else: + shader_cache_config["mode"] = 0 # 默认关闭 + + if cache_size is not None: + size = int(cache_size.get('value')) + for item in dir_size_list[::-1]: + if size >= item: + size = item + break + if size <= 0: + size = 256 + shader_cache_config["size"] = size + else: + shader_cache_config["size"] = 256 # 默认256 MB + + app_config[app_name] = shader_cache_config + return 0 + + except ET.ParseError as e: + raise ValueError("XML解析失败") + except FileNotFoundError as e: + raise FileNotFoundError("XML文件不存在") + except Exception as e: + raise Exception("未知错误") + + +if __name__ == "__main__": + input_file = "kbox_render_accelerating_configuration.xml" + result = read_xml(input_file) + + for item in app_config: + print("%s"%item, "%d"%app_config[item]["mode"], "%d"%app_config[item]["size"]) +EOF +) + if [ $? -ne 0 ]; then + echo -e "\033[31mFailed to enabled render layer! Failed to read kbox_render_accelerating_configuration.xml \033[0m" + return -1 + fi + + apps=($(printf "%s" "$result" | awk '{print $1}')) + modes=($(printf "%s" "$result" | awk '{print $2}')) + sizes=($(printf "%s" "$result" | awk '{print $3}')) + app_num=${#apps[@]} + mode_config=("CLOSED", "READONLY", "READWRITE", "DEFAULT") + mkdir -p $USER_DATA_PATH/shader_cache + cd $USER_DATA_PATH/shader_cache + echo "------------------ SHADERCACHE CONFIG ------------------" + for i in $(seq 0 $(($app_num - 1))); do + app=${apps[i]} + mode=${modes[i]} + size=${sizes[i]} + printf "App: %-40s Mode: %s Size: %1d MB\n " "${app}" "${mode_config[mode]}" "${size}" + if [ ${mode} -ne 2 ] && [ ${mode} -ne 1 ]; then + # 不是读写或者只读模式 + continue + fi + if [ ${mode} -eq 1 ] && [ ! -e ${app}.img ]; then + echo -e "\033[33m WARN:Failed to bind shader cache path! mode is READONLY but ${app}.img not exist. \033[0m" + continue + fi + if [ ${mode} -eq 2 ] && [ ! -e ${app}.img ]; then + fallocate -l ${size}M ${app}.img + yes | mkfs -t ext4 ${app}.img + fi + mkdir -p $app + mount ${app}.img $app + RUN_OPTION_REF+=" --volume=${USER_DATA_PATH}/shader_cache/$app/:/vendor/shader_cache/$app:rw " + done + echo "---------------------------------------------------" + cd - >/dev/null 2>&1 + return 0 +} function start_box() { ########################## 1. 参数检查 ########################## @@ -455,7 +567,7 @@ function start_box() { --image) local IMAGE_NAME=$2; shift;; --user_data_path) local USER_DATA_PATH=$2; shift;; --container_data_path) local CONTAINER_DATA_PATH=$2; shift;; - --enable_render_layer) local ENABLE_RENDER_LAYER=$2; shift;; + --enable_render_layer) local ENABLE_RENDER_LAYER=$2; shift;; --) shift; break;; -?*) printf 'WARN: Unknown option: %s\n' "$1" >&2;; *) break @@ -612,7 +724,7 @@ function start_box() { RUN_OPTION+=" --volume=$THISDIR/build.prop:/kbox_prop/build.prop:rw " fi if [[ $ENABLE_RENDER_LAYER == "1" ]]; then - RUN_OPTION+=" --volume=${USER_DATA_PATH}/shader_cache/:/vendor/shader_cache/:rw " + create_app_shader_filesystem ${BOX_NAME} RUN_OPTION fi mock_cpu mock_power_supply @@ -652,6 +764,22 @@ function start_box() { $RUNTIME_CMD cp build.prop_${BOX_NAME} ${BOX_NAME}:/system/vendor/build.prop rm -rf ./build.prop_${BOX_NAME} fi + + # 部署渲染中间层 + if [[ $ENABLE_RENDER_LAYER == "1" ]]; then + # 渲染中间层 + $RUNTIME_CMD exec -it ${BOX_NAME} sh -c "if [ -d /vendor/shader_cache/ ]; then chmod 777 -R /vendor/shader_cache/; fi" + $RUNTIME_CMD exec -it ${BOX_NAME} sh -c "mkdir -p /data/local/debug/gles" + $RUNTIME_CMD exec -it ${BOX_NAME} sh -c "chmod 755 -R /data/local/debug/" + $RUNTIME_CMD exec -it ${BOX_NAME} sh -c "mkdir -p /data/local/tmp" + if [ -e "kbox_render_accelerating_configuration.xml" ]; then + $RUNTIME_CMD cp kbox_render_accelerating_configuration.xml ${BOX_NAME}:/data/local/tmp + fi + $RUNTIME_CMD exec -it ${BOX_NAME} sh -c "cp /system/vendor/lib64/hw/RenderAccLayer.kbox.so /data/local/debug/gles" + if [ $? -ne 0 ]; then + echo -e "\033[31mFailed to enabled render layer! RenderAccLayer.kbox.so may not exist\033[0m" + fi + fi } function delete_box() { @@ -787,13 +915,17 @@ function restart_box() { local USER_DATA_PATH=$2 local restart_times=3 # 默认最大重启次数为三次 - if [ $# -eq 3 ]; then + if [ $# -ge 3 ]; then restart_times=$3 fi local ENABLE_HARD_DECODE=0 - if [ $# -eq 4 ]; then + if [ $# -ge 4 ]; then ENABLE_HARD_DECODE=$4 fi + local ENABLE_RENDER_LAYER=0 + if [ $# -ge 5 ]; then + ENABLE_RENDER_LAYER=$5 + fi set +e if [ -z ${USER_DATA_PATH} ]; then @@ -903,6 +1035,10 @@ function restart_box() { fi fi done + + if [[ $ENABLE_RENDER_LAYER == "1" ]]; then + docker exec -it "${BOX_NAME}" sh -c "setprop debug.gles.layers RenderAccLayer.kbox.so" + fi } check_environment diff --git a/deploy_scripts/kbox_render_accelerating_configuration.xml b/deploy_scripts/kbox_render_accelerating_configuration.xml new file mode 100644 index 0000000..139c1db --- /dev/null +++ b/deploy_scripts/kbox_render_accelerating_configuration.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/deploy_scripts/make_image_aosp15.sh b/deploy_scripts/make_image_aosp15.sh index 598b24a..140f007 100644 --- a/deploy_scripts/make_image_aosp15.sh +++ b/deploy_scripts/make_image_aosp15.sh @@ -159,11 +159,8 @@ function prepare_kbox_binary() cp ${BinaryPath}/vinput/bin/vinput ${TMP_PACKAGE_DIR}/system/vendor/bin/ cp ${BinaryPath}/vinput/vinput.rc ${TMP_PACKAGE_DIR}/system/vendor/etc/init/vinput.rc - if [ -d ${BinaryPath}/RenderAccLayer ]; then - cp ${BinaryPath}/RenderAccLayer/lib/hw/RenderAccLayer.kbox.so ${TMP_PACKAGE_DIR}/system/vendor/lib/hw/ - cp ${BinaryPath}/RenderAccLayer/lib64/hw/RenderAccLayer.kbox.so ${TMP_PACKAGE_DIR}/system/vendor/lib64/hw/ - cp ${BinaryPath}/RenderAccLayer/kbox_render_accelerating_configuration.xml ${TMP_PACKAGE_DIR}/system/vendor/etc/ - fi + cp ${BinaryPath}/RenderAccLayer/lib/hw/RenderAccLayer.kbox.so ${TMP_PACKAGE_DIR}/system/vendor/lib/hw/ + cp ${BinaryPath}/RenderAccLayer/lib64/hw/RenderAccLayer.kbox.so ${TMP_PACKAGE_DIR}/system/vendor/lib64/hw/ } function prepare_file_system() -- Gitee