Android 台灣中文網
標題:
適用不同 CPU 架構的卡刷包
[打印本頁]
作者:
monitorstudio
時間:
2015-6-9 19:56
標題:
適用不同 CPU 架構的卡刷包
本帖最後由 monitorstudio 於 2015-6-10 19:40 編輯
隨著 Android 系統越來越受市場歡迎,各種不同架構的機器相繼出現,32 位元 ARM 不再獨大,不只 x86,使用 x64、64 位元 ARM CPU 的機器也越來越多,而這對製作卡刷包的開發者而言當然是個困擾。
難道我們真的要如此命苦的把所有架構的 update-binary compile 一次嗎?
事實擺在眼前 (啊不是
Google 又沒規定 update-binary 一定要是個 ELF-format binary
shell script 也是可以的啦!
這樣子就不會有架構不同的問題啦~ (而且個人認為 shell script 功能比 updater-script 強大,熟悉 Linux 的也可以無痛製作 update.zip
要把 shell script 當作 update-binary 用,還是有一些需要注意的問題的:
1. stdout 應該要 redirect 到 /proc/self/fd/$2
2. 輸出到 stdout 前,每行行首要加上 "ui_print ",假裝這是 ui_print() 輸出的字串
例:
echo "ui_print My dxxk is larger than yours" > "/proc/self/fd/$2"
複製代碼
3. update.zip 的路徑是 $3
4. shell 路徑是 /sbin/sh (不是 /bin/sh)
範例:
#!/sbin/sh
##
## 環境設定
##
PROG_NAME="$0"
STDOUT_FD="/proc/self/fd/$2"
PACKAGE_PATH="$3"
##
## 實做 update-binary 提供的內建函數
##
# ui_print <OUTPUT_STRING>
# $1
ui_print()
{
OLD_IFS="$IFS"
IFS="
"
for LINE in $1
do
echo -ne "ui_print $LINE\n\n" > $STDOUT_FD
done
IFS="$OLD_IFS"
}
# set_perm <GRP> <USR> <MOD> <FILE_PATH>
# $1 $2 $3 $4
set_perm()
{
chown $1.$2 "$4"
chown $1:$2 "$4"
chmod $3 "$4"
}
# set_perm_recursive <GRP> <USR> <DIR_MOD> <FILE_MOD> <DIR_PATH>
# $1 $2 $3 $4 $5
set_perm_recursive()
{
chown -R $1.$2 "$5"
chown -R $1:$2 "$5"
chmod -R $4 "$5"
chmod $3 "$5"
}
# symlink <TARGET> <LINK>
# $1 $2
symlink()
{
ln -s "$1" "$2"
}
# format <FS_TYPE> EMMC <DEV_PATH> <MNT_POINT>
# $1 $2 $3 $4
format()
{
umount "$4"
if [ `which mkfs.$1` = "" ]; then
abort "$PROG_NAME: mkfs.$1: command not found"
else
mkfs.$1 "$3"
fi
}
# mount <FS_TYPE> <DEV_PATH> <MNT_POINT>
# $1 $2 $3
mount()
{
umount "$3"
mount -t "$1" "$2" "$3"
}
# unmount <MNT_POINT>
# $1
unmount()
{
umount "$1"
}
# package_extract_file <FILE_PATH> <OUTPUT_PATH>
# $1 $2
package_extract_file()
{
unzip -o "$PACKAGE_PATH" "$1" -p > "$2"
}
# package_extract_dir <DIR_PATH> <OUTPUT_PATH>
# $1 $2
package_extract_dir()
{
DIR_NAME=$(echo "$1" | sed "s/^(.*/)*(.*)/2/g")
mkdir -p "$2"
unzip -ou "$PACKAGE_PATH" "$1/*" -d "$2/TMP_DIR"
OLD_IFS="$IFS"
IFS="
"
for FILE in $(ls "$2/TMP_DIR/$DIR_NAME")
do
mv "$2/TMP_DIR/$DIR_NAME/$FILE" "$2/$FILE"
done
IFS="$OLD_IFS"
rm -rf "$2/TMP_DIR"
}
# getprop <PROP_NAME>
# $1
getprop()
{
for file in /system/build*.prop
do
grep "$1" "$file" | sed "s/^.*=(.*)/1/g"
done
}
# abort <OUTPUT_STRING>
# $1
abort()
{
echo -ne "$1
" > $STDOUT_FD
exit 0
}
##
## Main program
##
ui_print "Hello World!"
ui_print "Here Is A Beautiful Wrold Of Programming"
ui_print "Mounting /system..."
mount ext4 /dev/block/mmcblk0p9 /system
ui_print "Extracting files..."
package_extract_dir "system" "/system"
ui_print "Setting up permissions..."
set_perm_recursive 0 0 0755 0755 /system/xbin
set_perm 0 0 06755 /system/xbin/su
ui_print "Unmounting /system..."
unmount /system
ui_print "All done"
ui_print "reboot system now!"
複製代碼
作者:
police4
時間:
2016-4-19 20:33
受益良多,繼續加油!!
作者:
proshenn
時間:
2016-5-19 13:27
感謝細心教學 ㄧ直都以為刷包都ㄧ樣
歡迎光臨 Android 台灣中文網 (https://apk.tw/)
Powered by Discuz! X3.1