日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 系统自动重启Bug(高通平台)

發(fā)布時(shí)間:2025/4/16 Android 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 系统自动重启Bug(高通平台) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

點(diǎn)擊打開鏈接

最近客戶反饋了一個(gè)Bug,我們的系統(tǒng)用著用著會(huì)自動(dòng)重啟,尤其是在撥號(hào)的時(shí)候極容易死機(jī)或者進(jìn)入下載模式。根據(jù)老大和高通的支持得到了一個(gè)解決方案。

? ?在Android系統(tǒng)中,有這么一個(gè)文件夾:sys/bus/msm_subsys/devices,里面分別有三個(gè)文件夾:subsys0、subsys1、subsys2,這三個(gè)都是android系統(tǒng)中運(yùn)行的子系統(tǒng)。根據(jù)高通的解釋,subsys0主要是負(fù)責(zé)adsp(音視頻媒體的相關(guān)服務(wù))的啟動(dòng)和運(yùn)行,subsys1主要負(fù)責(zé)modem(撥打電話和藍(lán)牙wifi等服務(wù))的業(yè)務(wù)處理,subsys2主要管理wcnss的相關(guān)業(yè)務(wù),當(dāng)然還有很多其它模塊的子系統(tǒng),就不一一舉例了。

??subsys0、subsys1、subsys2都有個(gè)叫restart_level的文件,用cat命令查看發(fā)現(xiàn)這些文件的內(nèi)容都是SYSTEM,就是這個(gè)SYSTEM導(dǎo)致系統(tǒng)在遇到問題的時(shí)候死機(jī)或者下載模式,應(yīng)該要把restart_level的設(shè)置為related,當(dāng)系統(tǒng)遇到難于處理的問題的時(shí)候,比如打電話過程中遇到錯(cuò)誤,那就只重啟subsys1子系統(tǒng)(子系統(tǒng)都是在后臺(tái)運(yùn)行的,重啟過程用戶是看不到的),android系統(tǒng)本身是不重啟或進(jìn)入下載模式的,這樣用戶體驗(yàn)也好些。

? 那有人會(huì)問了,既然這樣那高通為什么不默認(rèn)把這些值設(shè)為related呢?其實(shí)我也有相同的疑問,我老大說如果一遇到問題就讓子系統(tǒng)重啟那很多BUG就測(cè)不出來了,這樣做是讓有些BUG更好的浮出水面。

? 現(xiàn)在我們的機(jī)器經(jīng)常在撥打電話的時(shí)候死掉或者進(jìn)入下載模式(download模式),那應(yīng)該就是subsys1這個(gè)子系統(tǒng)出了問題了。找subsys1的相關(guān)代碼,在init.qcom.ssr.sh中有調(diào)用,源碼位置:device/qcom/common/rootdir/etc/init.qcom.ssr.sh,是個(gè)腳本文件,代碼貼出來:

#!/system/bin/sh
# Copyright (c) 2013, The Linux Foundation. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# ? ? * Redistributions of source code must retain the above copyright
# ? ? ? notice, this list of conditions and the following disclaimer.
# ? ? * Redistributions in binary form must reproduce the above copyright
# ? ? ? notice, this list of conditions and the following disclaimer in the
# ? ? ? documentation and/or other materials provided with the distribution.
# ? ? * Neither the name of The Linux Foundation nor
# ? ? ? the names of its contributors may be used to endorse or promote
# ? ? ? products derived from this software without specific prior written
# ? ? ? permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NON-INFRINGEMENT ARE DISCLAIMED. ?IN NO EVENT SHALL THE COPYRIGHT OWNER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#

ssr_str="$1"
IFS=,
ssr_array=($ssr_str)
declare -i subsys_mask=0

# check user input subsystem with system device
ssr_check_subsystem_name()
{
? ? declare -i i=0
? ? subsys=`cat /sys/bus/msm_subsys/devices/subsys$i/name`
? ? while [ "$subsys" != "" ]
? ? do
? ? ? ? if [ "$subsys" == "$ssr_name" ]; then
? ? ? ? ? ? return 1
? ? ? ? fi
? ? ? ? i=$i+1
? ? ? ? subsys=`cat /sys/bus/msm_subsys/devices/subsys$i/name`
? ? done
? ? return 0
}

# set subsystem mask to indicate which subsystem needs to be enabled
for num in "${!ssr_array[@]}"
do
? ? case "${ssr_array[$num]}" in
? ? ? ? "1")
? ? ? ? ? ? subsys_mask=0
? ? ? ? ;;
? ? ? ? "riva")
? ? ? ? ? ? subsys_mask=$subsys_mask+1
? ? ? ? ;;
? ? ? ? "3")
? ? ? ? ? ? subsys_mask=63
? ? ? ? ;;
? ? ? ? "adsp")
? ? ? ? ? ? ssr_name=adsp
? ? ? ? ? ? if ( ssr_check_subsystem_name ); then
? ? ? ? ? ? ? ? subsys_mask=$subsys_mask+2
? ? ? ? ? ? fi
? ? ? ? ;;
? ? ? ? "modem")
? ? ? ? ? ? ssr_name=modem
? ? ? ? ? ? if ( ssr_check_subsystem_name ); then
? ? ? ? ? ? ? ? subsys_mask=$subsys_mask+4
? ? ? ? ? ? fi
? ? ? ? ;;
? ? ? ? "wcnss")
? ? ? ? ? ? ssr_name=wcnss
? ? ? ? ? ? if ( ssr_check_subsystem_name ); then
? ? ? ? ? ? ? ? subsys_mask=$subsys_mask+8
? ? ? ? ? ? fi
? ? ? ? ;;
? ? ? ? "venus")
? ? ? ? ? ? ssr_name=venus
? ? ? ? ? ? if ( ssr_check_subsystem_name ); then
? ? ? ? ? ? ? ? subsys_mask=$subsys_mask+16
? ? ? ? ? ? fi
? ? ? ? ;;
? ? ? ? "external_modem")
? ? ? ? ? ? ssr_name=external_modem
? ? ? ? ? ? if ( ssr_check_subsystem_name ); then
? ? ? ? ? ? ? ? subsys_mask=$subsys_mask+32
? ? ? ? ? ? fi
? ? ? ? ;;
? ? esac
done

# enable selected subsystem restart
if [ $((subsys_mask & 1)) == 1 ]; then
? ? echo 1 > /sys/module/wcnss_ssr_8960/parameters/enable_riva_ssr
else
? ? echo 0 > /sys/module/wcnss_ssr_8960/parameters/enable_riva_ssr
fi

if [ $((subsys_mask & 2)) == 2 ]; then
? ? echo "related" > /sys/bus/msm_subsys/devices/subsys0/restart_level
else
? ? echo "system" > /sys/bus/msm_subsys/devices/subsys0/restart_level
fi

if [ $((subsys_mask & 4)) == 4 ]; then
? ? echo "related" > /sys/bus/msm_subsys/devices/subsys1/restart_level
else
? ? echo "system" > /sys/bus/msm_subsys/devices/subsys1/restart_level
fi

if [ $((subsys_mask & 8)) == 8 ]; then
? ? echo "related" > /sys/bus/msm_subsys/devices/subsys2/restart_level
else
? ? echo "system" > /sys/bus/msm_subsys/devices/subsys2/restart_level
fi

if [ $((subsys_mask & 16)) == 16 ]; then
? ? echo "related" > /sys/bus/msm_subsys/devices/subsys3/restart_level
else
? ? echo "system" > /sys/bus/msm_subsys/devices/subsys3/restart_level
fi

if [ $((subsys_mask & 32)) == 32 ]; then
? ? echo "related" > /sys/bus/msm_subsys/devices/subsys4/restart_level
else
? ? echo "system" > /sys/bus/msm_subsys/devices/subsys4/restart_level
fi

if [ $((subsys_mask & 63)) == 63 ]; then
? ? echo 3 > /sys/module/subsystem_restart/parameters/restart_level
else
? ? echo 1 > /sys/module/subsystem_restart/parameters/restart_level
fi


代碼中有這么一段:

if [ $((subsys_mask & 4)) == 4 ]; then
? ? echo "related" > /sys/bus/msm_subsys/devices/subsys1/restart_level
else
? ? echo "system" > /sys/bus/msm_subsys/devices/subsys1/restart_level
fi

? 判斷subsys_mask和4的位運(yùn)算來給subsys1賦值, 要么賦值related,要么賦值system。subsys_mask的值是通過調(diào)用這個(gè)腳本時(shí)傳進(jìn)來的參數(shù)獲得的,再就是找到調(diào)用這個(gè)腳本的地方,init.qcom.rc, 源碼位置:device/qcom/common/rootdir/etc/init.qcom.rc,這里要說明一下,*.rc的文件中加載的都是系統(tǒng)的服務(wù),里面的值都是寫在系統(tǒng)文件里的,比如build.prop文件,當(dāng)這些值發(fā)生改變的時(shí)候(比如進(jìn)入shell模式可以setprop xxx yyy來更改系統(tǒng)服務(wù)),這個(gè)服務(wù)就會(huì)重新執(zhí)行一遍,以加載不同的文件屬性。

?里面有這么一段:

# SSR setting
on property:persist.sys.ssr.restart_level=*
? ? exec /system/bin/sh /init.qcom.ssr.sh ${persist.sys.ssr.restart_level}

? 這里就是調(diào)用那個(gè)腳本的地方,也就是說當(dāng)property:persist.sys.ssr.restart_level這個(gè)屬性發(fā)生改變的時(shí)候就執(zhí)行init.qcom.ssr.sh這個(gè)腳本,并且把自己當(dāng)參數(shù)傳給ssr_str。再回到init.qcom.ssr.sh這個(gè)腳本文件,ssr_str是個(gè)數(shù)組,也就是說property:persist.sys.ssr.restart_level這個(gè)屬性可以是有多個(gè)參數(shù)的(參數(shù)之間以逗號(hào)分隔),不同的參數(shù)給subsys_mask賦不同的值,因?yàn)槲覀兊膯栴}是出在subsys1,所以要讓subsys_mask & 4 == 4,就需要將property:persist.sys.ssr.restart_level的參數(shù)設(shè)為modem,就會(huì)將/sys/bus/msm_subsys/devices/subsys1/restart_level的值設(shè)為related,讓subsys1子系統(tǒng)在遇到處理不了的問題的時(shí)候自行后臺(tái)重啟。

? 剩下的問題就簡(jiǎn)單了,在系統(tǒng)中預(yù)先給property:persist.sys.ssr.restart_level賦值一個(gè)modem值,那系統(tǒng)屬性subsys1/restart_level的值就是related了,在buildspec.mk中加上這一句:ADDITIONAL_BUILD_PROPERTIES += persist.sys.ssr.restart_level=$(call add2prop,$(PWV_SSR_RESTART_LEVEL)),PWV_SSR_RESTART_LEVEL是自己定義的宏,其值就是modem,編譯,升級(jí)軟件,驗(yàn)證OK。

? 覺得這些問題還是挺有價(jià)值的,就記錄下來,以便以后回味。


總結(jié)

以上是生活随笔為你收集整理的Android 系统自动重启Bug(高通平台)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。