安卓系统应用调试脚本

这是一个对之前写的脚本的记录档案,自己也看不太懂当时的写法了,羞愧。用一个 repo 放这些脚本代码感觉有些浪费,干脆整个文章记录曾经的那段历史吧!

这代码的主要目的就是想少敲点命令,一步到位,做一个快男!

说明 - AndroidROMTools

Android run script tools for debugging system apps or frameworks. This was used by myself when debugging system apps or frameworks. In this project, module names was not given to avoid the project name, but the main structure was reminded.

此脚本主要分成一个入口与两个模块,详细的树状图如下:

.
├── README.md
├── btool
├── modules
│   ├── handleFramework.sh
│   ├── handleXxxx.sh
│   └── handleXxxxxx.sh
└── utils
    ├── handleSpecificTask.sh
    ├── init.sh
    ├── printOperationTip.sh
    ├── tipWhenNotImplement.sh
    └── tipWhenParametersError.sh

2 directories, 10 files

入口

名字叫 btool,为啥起这个怪名字,我也不知道。

#!/bin/bash
# initialize variables
var1=$1
var2=$2
var3=$3
UTILS_DIR=~/.PersonalTools/utils
MODULES_DIR=~/.PersonalTools/modules

case $var1 in
    "init" )
        ${UTILS_DIR}/init.sh
        ;;
    "log" )
        adb logcat -b main \*:E | grep "TAG"
        ;;
    "wxxxx" )
        ${MODULES_DIR}/handleXXXX.sh $var2 $var3
        ;;
    "txxxx" )
        ${MODULES_DIR}/handlexxxxxx.sh $var2 $var3
        #${UTILS_DIR}/tipWhenNotImplement.sh $var1
        ;;
    "txxxx" )
        ${UTILS_DIR}/tipWhenNotImplement.sh $var1
        ;;
    "mxxxx"  )
        ${UTILS_DIR}/tipWhenNotImplement.sh $var1
        ;;    
	*	) 
		#${UTILS_DIR}/tipWhenParametersError.sh init xxxxxx *xxxxxx* *xxxxxx* *xxxxxx*
        if [ "${var1}" == "" ]; then
            ${UTILS_DIR}/tipWhenParametersError.sh init xxxx *xxxx* *xxxxxx* *xxxxxx*
        elif [ -f ${MODULES_DIR}/$var1.sh ]; then
            #${UTILS_DIR}/tipWhenParametersError.sh init xxxxxx *xxxxxx* *xxxxxx* *xxxxxx*
            ${MODULES_DIR}/$var1.sh
        else
            ${UTILS_DIR}/tipWhenParametersError.sh init xxxxxx *txxxxxx* *txxxxxx* *mxxxxxx*
            ${UTILS_DIR}/tipWhenNotImplement.sh "${var1}"
        fi
		;;
esac
exit

Utils

  • 初始化:init.sh
#!/bin/bash
adb root
adb wait-for-device remount
  • 打印带颜色的字符:printOperationTip.sh
#!/bin/bash
#echo -e "\e[31;43m-----------------------------------------------------------\e[0m"
echo ""
echo -e "\e[31;47m\t"$1"\t\e[0m"
echo ""
#echo -e "\e[31;43m-----------------------------------------------------------\e[0m"
  • 模块未完成的告警提示:tipWhenNotImplement.sh
#/bin/bash
echo -e "\nModule < \e[41m$1\e[0m \e[31m>NOT IMPELEMNT!\e[0m\n"
  • 参数错误提示:tipWhenParametersError.sh
#/bin/bash
#clear
echo ""
echo -e "\e[31;42mOops! Please give me the \e[0m\e[1;5;40;31mcorrect\e[0m\e[31;42m parameters!!!\e[0m"
echo ""

params=""
cnt=1;
for i in $@;
do
	if [ $cnt != 1 ]; then
		params=$params",\e[1;5;31;40m "$i" \e[0m"
	else
		params="\e[1;5;31;40m "$i" \e[0m"
	fi
	cnt=$(($cnt+1))
done
if [  $cnt == 1 ]; then
	params="\e[4;31mNONE\e[0m"
fi
echo -e "\e[33mavaliable parameters are :\e[0m" $params"\n"
  • 处理特定任务:handleSpecificTask.sh
#!/bin/bash

UTILS_DIR=~/.PersonalTools/utils

OP_INDEX=$1
PROJECT_SRC_DIR=$2
APP_SRC_DIR=$3
APP_OUT_DIR=$4
APP_REMOTE_DIR=$5
APP_PKG_NAME=$6
PROJECT_LUNCH_IDX=$7

#for i in $@; do
	#statements
#	echo $i
#done

# for compile SnapCamera APK in 


#if [ -f /tmp/btoollog ]; then
	#echo "exist"
#else
	#echo "/tmp/btoollog not exists"
	#mkdir /tmp/btoollog
#fi

function compileModifiedSourceCode(){
	${UTILS_DIR}/printOperationTip.sh "<Prepare to Compile>"
	cd ${PROJECT_SRC_DIR}
	pwd
	source build/envsetup.sh
	lunch ${PROJECT_LUNCH_IDX}
	cd ${APP_SRC_DIR}
	pwd
	mm
}

function makeSureCloseCompletelyAndReopen(){
	${UTILS_DIR}/printOperationTip.sh "<Prepare to force-stop APK>"

	echo -e "\n\e[32m\ttry to stop app\e[0m"
	adb shell am force-stop ${APP_PKG_NAME}
	echo -e ""

	echo -e "\n\e[32m\ttry to start app\e[0m"
	adb shell am start -n ${APP_PKG_NAME}
	echo -e ""
}

function pushCompiledAPK2Phone(){
	${UTILS_DIR}/printOperationTip.sh "<Prepare to Push APK>"
	cd ${APP_OUT_DIR}
	#pwd
	#echo "${APP_OUT_DIR}"
	adb push . ${APP_REMOTE_DIR}
	#adb push oat/arm64/$appname.odex /system/priv-app/$appname/oat/arm64/$appname.odex
	if [ $? -eq 0 ]; then
		echo -e "\n\e[32m\tpush app to phone successfully\e[0m"
	fi
	echo -e ""
}

function checkPushedFilesStatus(){
	${UTILS_DIR}/printOperationTip.sh "<Prepare to Check Push Result>"
	adb shell ls -l ${APP_REMOTE_DIR} ${APP_REMOTE_DIR}/oat/arm64/
	if [ $? -eq 0 ]; then
		echo -e "\n\e[32m\tconnect to phone successfully\e[0m"
	fi
	echo -e ""
}

case $1 in
"0"  )
	compileModifiedSourceCode
	pushCompiledAPK2Phone
	makeSureCloseCompletelyAndReopen
	checkPushedFilesStatus
	;;
"1" )
	compileModifiedSourceCode
	;;
"2" )
	pushCompiledAPK2Phone
	;;
"3" )
	makeSureCloseCompletelyAndReopen
	;;
"4"	)
	checkPushedFilesStatus
	;;
"subl" )
	subl ${APP_SRC_DIR}
	;;
"src" )
	echo ${APP_SRC_DIR}
	;;
* )
	${UTILS_DIR}/tipWhenParametersError.sh 0 1 2 3 4 subl src
	echo -e "\t\e[1;4;5;31;40m 0 \e[0m\t : \e[33m1 -> 2 -> 3 -> 4\e[0m"
	echo -e "\t\e[1;4;5;31;40m 1 \e[0m\t : \e[33mCompile Modified Source Code\e[0m"
	echo -e "\t\e[1;4;5;31;40m 2 \e[0m\t : \e[33mPush Compiled APK 2 Phone\e[0m"
	echo -e "\t\e[1;4;5;31;40m 3 \e[0m\t : \e[33mClose App\e[0m"
	echo -e "\t\e[1;4;5;31;40m 4 \e[0m\t : \e[33mShow App Info\e[0m"
	echo -e "\t\e[1;4;5;31;40m subl \e[0m\t : \e[33mOpen App Src With Sublime Text\e[0m\n"
	echo -e "\t\e[1;4;5;31;40m src \e[0m\t : \e[33mPrint SRC path\e[0m\n"
	;;
esac

模块

  • Android Framework 处理:handleFramework.sh
#!/bin/bash
SRC_HOME=/home/ckt/work/xxxxxx/msm8909_go/LINUX/android/frameworks/base
OUT_HOME=/home/ckt/work/xxxxxx/msm8909_go/LINUX/android/out/target/product/msm8909go/system/framework

cd /home/ckt/work/xxxxxx/msm8909_go/LINUX/android/

source build/envsetup.sh
lunch 29
make framework
make snod

adb push ${OUT_HOME}/arm/boot.oat /system/framework/arm/
adb push ${OUT_HOME}/arm/boot.art /system/framework/arm/

adb push ${OUT_HOME}/framework.jar /system/framework/
adb push ${OUT_HOME}/framework-res.apk /system/framework/

adb reboot bootloader
  • 桌面时钟:handleXxxx.sh
#/bin/bash

UTILS_DIR=~/.PersonalTools/utils

PROJECT_DIR="/home/ckt/work/android8"
PROJECT_SRC_DIR=${PROJECT_DIR}
PROJECT_OUT_DIR=${PROJECT_DIR}/out/target/product/msm8953_64
PROJECT_LUNCH_IDX=39

DESKCLOCK_SRC_DIR=${PROJECT_SRC_DIR}/packages/apps/DeskClock/
DESKCLOCK_OUT_DIR=${PROJECT_OUT_DIR}/system/app/DeskClock/
DESKCLOCK_PKG_NAME=com.android.deskclock
DESKCLOCK_REMOTE_DIR=/system/app/DeskClock


case $1 in
	"deskclock"	)
		${UTILS_DIR}/handleSpecificTask.sh $2 ${PROJECT_SRC_DIR} ${DESKCLOCK_SRC_DIR} ${DESKCLOCK_OUT_DIR} ${DESKCLOCK_REMOTE_DIR} ${DESKCLOCK_PKG_NAME} ${PROJECT_LUNCH_IDX}
		;;
	* )
		${UTILS_DIR}/tipWhenParametersError.sh deskclock
		;;
esac
  • 多媒体应用:handleXxxxxx.sh
#!/bin/bash

UTILS_DIR=~/.PersonalTools/utils

PROJECT_DIR="/home/ckt/work/xxxxxxx/LINUX/android"
PROJECT_SRC_DIR="${PROJECT_DIR}"
PROJECT_OUT_DIR="${PROJECT_DIR}/out/target/product/msm8909go"
PROJECT_LUNCH_IDX=29

SOUNDRECORDER_SRC_DIR="${PROJECT_SRC_DIR}/packages/apps/SoundRecorder/"
SOUNDRECORDER_OUT_DIR="${PROJECT_OUT_DIR}/system/priv-app/SoundRecorder/"
SOUNDRECORDER_PKG_NAME=com.android.soundrecorder
SOUNDRECORDER_REMOTE_DIR=/system/priv-app/SoundRecorder

GALLERY_SRC_DIR="${PROJECT_SRC_DIR}/packages/apps/Gallery2/"
GALLERY_OUT_DIR="${PROJECT_OUT_DIR}/system/app/Gallery2/"
GALLERY_PKG_NAME=com.android.gallery3d
GALLERY_REMOTE_DIR=/system/app/Gallery2

SNAPDRAGONMUSIC_SRC_DIR="${PROJECT_SRC_DIR}/packages/apps/Music/"
SNAPDRAGONMUSIC_OUT_DIR="${PROJECT_OUT_DIR}/system/app/Music/"
SNAPDRAGONMUSIC_PKG_NAME=com.android.music
SNAPDRAGONMUSIC_REMOTE_DIR=/system/app/Music

CLOCK_SRC_DIR="${PROJECT_SRC_DIR}/packages/apps/DeskClock"
CLOCK_OUT_DIR="${PROJECT_OUT_DIR}/system/app/DeskClock"
CLOCK_PKG_NAME=com.android.deskclock
CLOCK_REMOTE_DIR=/system/app/DeskClock

case $1 in
	"soundrecorder"	)
		${UTILS_DIR}/handleSpecificTask.sh $2 ${PROJECT_SRC_DIR} ${SOUNDRECORDER_SRC_DIR} ${SOUNDRECORDER_OUT_DIR} ${SOUNDRECORDER_REMOTE_DIR} ${SOUNDRECORDER_PKG_NAME} ${PROJECT_LUNCH_IDX}
		;;
	"gallery"	)
		${UTILS_DIR}/handleSpecificTask.sh $2 ${PROJECT_SRC_DIR} ${GALLERY_SRC_DIR} ${GALLERY_OUT_DIR} ${GALLERY_REMOTE_DIR} ${GALLERY_PKG_NAME} ${PROJECT_LUNCH_IDX}
		;;
	"music"	)
		${UTILS_DIR}/handleSpecificTask.sh $2 ${PROJECT_SRC_DIR} ${SNAPDRAGONMUSIC_SRC_DIR} ${SNAPDRAGONMUSIC_OUT_DIR} ${SNAPDRAGONMUSIC_REMOTE_DIR} ${SNAPDRAGONMUSIC_PKG_NAME} ${PROJECT_LUNCH_IDX}
		;;
	"clock" ) 
		${UTILS_DIR}/handleSpecificTask.sh $2 ${PROJECT_SRC_DIR} ${CLOCK_SRC_DIR} ${CLOCK_OUT_DIR} ${CLOCK_REMOTE_DIR} ${CLOCK_PKG_NAME} ${PROJECT_LUNCH_IDX}
		;;
	* )
		${UTILS_DIR}/tipWhenParametersError.sh soundrecorder gallery music clock
		;;
esac

目前这些脚本对我来说,已无实际用途,不能保证准确性,只是做一个纪念,纪念那段无知却在挣扎的时光。

Read more

Volcano 与 Kubernetes GPU 调度学习笔记

本笔记系统整理 Volcano 调度器、Kubernetes 调度框架、GPU Device Plugin、HAMi 等云原生 AI 调度领域的核心知识,适合用于学习、复习和工程实践参考。 目录 * 第一部分:Volcano 入门 * 1. Volcano 是什么 * 2. 安装与快速使用 * 3. 核心特性一览 * 第二部分:Volcano 整体架构 * 4. Volcano 解决的核心问题 * 5. 整体架构与数据流 * 6. 三层抽象模型 * 第三部分:Volcano 核心实现原理 * 7. Session 机制 * 8. Gang Scheduling 实现 * 9. Queue 与 DRF 公平调度

容器镜像(4):镜像的常用工具箱

容器镜像(4):镜像的常用工具箱

前几篇在讲多架构镜像时已经用过 skopeo 和 crane 做镜像复制,这篇系统整理这两个工具的完整能力,同时介绍几个日常操作镜像时同样好用的工具。 一、skopeo:不依赖 Daemon 的镜像瑞士军刀 skopeo 的核心价值是绕过 Docker daemon,直接与 Registry API 交互。上一篇用它做镜像复制和离线传输,但它的能力远不止于此。 1.1 安装 # Ubuntu / Debian sudo apt install -y skopeo skopeo --version # skopeo version 1.15.1 1.2 inspect:免拉取检查镜像元数据 docker inspect 需要先把镜像拉到本地,skopeo inspect 直接向 Registry

容器镜像(3):多架构镜像构建

容器镜像(3):多架构镜像构建

一、什么是多架构镜像 1.1 OCI Image Index 上一篇介绍了单平台镜像的结构:一个 Manifest 指向 Config 和若干 Layer blob。多架构镜像在此之上多了一层——OCI Image Index(也叫 Manifest List),是一个轻量的索引文件,把多个单平台 Manifest 组织在一起: $ docker manifest inspect golang:1.22-alpine { "schemaVersion": 2, "mediaType": "application/vnd.oci.image.index.v1+json", "manifests&

容器镜像(2):containerd 视角下的镜像

容器镜像(2):containerd 视角下的镜像

一、为什么需要了解 containerd 如果你只用 docker run 跑容器,从来不关心底层,那可以不了解 containerd。但如果你在用 Kubernetes,或者想真正理解"容器运行时"是什么,containerd 是绕不开的。 事实上,当你执行 docker run 的时候,containerd 早就在后台悄悄工作了——Docker 从 1.11 版本开始,就把核心运行时剥离出来交给 containerd 负责。 1.1 Docker 的架构演变 早期的 Docker(1.10 及之前)是一个"大一统"的单体程序:一个 dockerd