開發(fā)Android OS的時候喇完,常常需要修改framework.jar,services.jar等/system/framework/下的程序文件,在編譯與刷機方面驰怎,aosp項目已經(jīng)幫我們準備了m,mm,mmm刃泡,make systemimage,make bootimage等一系列工具潦俺,按aosp的方式,一般是將某一個模塊編譯完成狼牺,生成system.img,boot.img,重啟手機進行刷機操作羡儿。這一操作本沒有什么不對,但如果我們只是需要更新一個小模塊時是钥,比如framework.jar掠归,則沒有必要刷機。
將一個小模塊(后續(xù)都以framework.jar為例)部署到手機上悄泥,其實只需要進行以下步驟:
- 將產(chǎn)物framework.jar上傳到手機上:
adb push framework.jar /data/local/tmp
- 以adb的方式進入手機控制臺虏冻,并切換到su狀態(tài)
adb shell
su
- 重新加載/system分區(qū),以可讀寫的方式
mount -o rw,remount /system
- 復制framework.jar到指定的目:/system/framework/framework.jar
cp /data/local/tmp/framework.jar /system/framework/
整個過程過于復雜码泞,需要輸入太多的命令兄旬,但可以考慮將其自動化:
#!bin/bash
#ROOT_PATH為系統(tǒng)編譯的根目錄,如果和m,mm等命令集成在一塊,可以不用這一變量领铐,直接從編譯的環(huán)境變量中讀取
ROOT_PATH="/home/programer/android/nexus"
#當前調(diào)試的Android OS的代號,與ROOT_PATH一樣悯森,最后是為了拼一條完整的文件路徑
PRODUCT_NAME="shamu"
function Help
{
echo "Help:"
echo "debugandroid framework : copy the $ROOT_PATH/framework.jar to mobile and restart the mobile"
}
function Framework
{
FILENAME="framework.jar"
copyFrameJarAndRestart $FILENAME
}
function copyFrameJarAndRestart
{
echo "copy the $ROOT_PATH/out/target/product/$PRODUCT_NAME/system/framework/$1 to /system/framework/$1"
LOCAL_FILE="$ROOT_PATH/out/target/product/$PRODUCT_NAME/system/framework/$1"
PUSHCMD="adb push $LOCAL_FILE /data/local/tmp"
$PUSHCMD
adb root
#adb root涉及到磁盤重新掛載,如果太快執(zhí)行下一條指令可能會的問題绪撵,所以這里sleep一下
sleep 2s
adb shell mount -o rw,remount /system
adb shell cp /data/local/tmp/$1 /system/framework/$1
echo "Reboot the device"
adb shell reboot
}
case $1 in
framework)
Framework
;;
*)
Help;;
esac