本文介紹了最佳實(shí)踐與兼容性建議以及應(yīng)用開發(fā)常見問題,您可通過了解本內(nèi)容后,自行解決問題。
一、最佳實(shí)踐與兼容性建議
MIUI是基于Android深度定制的操作系統(tǒng),和Android保持100%兼容,我們準(zhǔn)備了一些在Android開發(fā)過程中你可能遇到的問題,也許對(duì)您有所幫助。
如果在基于MIUI進(jìn)行開發(fā)、測(cè)試的過程中遇到問題,我們會(huì)竭盡所能協(xié)助開發(fā)者解決。在和開發(fā)者溝通的過程中,我們發(fā)現(xiàn),很多應(yīng)用遇到的問題,并非因MIUI導(dǎo)致,而是對(duì)Android本身。
1、盡量用Android標(biāo)準(zhǔn)的接口,最好不要很“聰明”的讀取較為底層的數(shù)據(jù)
每個(gè)手機(jī)的底層都有可能有自己獨(dú)特的實(shí)現(xiàn),這種特殊性,其實(shí)是對(duì)開發(fā)者屏蔽的,開發(fā)者直接利用,有時(shí)會(huì)得不到期望的效果。
比如之前我們發(fā)現(xiàn)一款app,會(huì)直接讀取底層frame buffer,然后以錄像的方式顯示當(dāng)前屏幕,但是由于我們frame buffer的特殊性,結(jié)果它讀出來的就是兩三段斷開的屏幕。
再比如,有些游戲會(huì)直接從底層的讀取motion event,然后自己再根據(jù)這些事件做些相應(yīng)操作,但這些事件未經(jīng)過android處理,結(jié)果就有可能有問題。
2、要和Android版本保持一致
Android隨著版本的升級(jí),會(huì)有些向后兼容性不好。常見現(xiàn)象是,本來在較低版本上正常運(yùn)行的app,在較高版本上運(yùn)行失敗。
一個(gè)常見的問題是權(quán)限相關(guān),比如WRITE_APN_SETTINGS這個(gè)權(quán)限是在某個(gè)版本上加進(jìn)去的,若app不申請(qǐng)此權(quán)限,在之前Android版本可正常運(yùn)行,但是一旦Android升級(jí),app就會(huì)因?yàn)槿狈?quán)限而FC。
3、NDK版本
有些app可能是用NDK開發(fā)的,對(duì)于這樣的app,一定要在對(duì)應(yīng)的NDK版本下編譯測(cè)試,否則極有可能出現(xiàn)莫名其妙的問題。
比如,我們之前和某播放器應(yīng)用聯(lián)調(diào)過一個(gè)問題:該播放器在MIUI上播放一段時(shí)間后,立即卡死,當(dāng)時(shí)我們調(diào)試了好久,懷疑SurfaceFlinger,懷疑播放器本身,等等,各種調(diào)試,無果。
最終,還是發(fā)現(xiàn)是由于該播放器編譯時(shí),NDK版本不對(duì)。
4、一定要釋放資源
一些資源,比如WakeLock,WifiLock,F(xiàn)ile descriptor,Cursor等一定要釋放,這些資源甚至?xí)绊懙饺?。比如WakeLock和WifiLock會(huì)影響屏幕和Wifi的休眠,從而導(dǎo)致耗電。
而Cursor,尤其是一些較為常用的Provider獲得的Cursor,長(zhǎng)期不關(guān)閉,有可能會(huì)導(dǎo)致該P(yáng)rovider無法工作。
5、耗電操作
1)、慎用某些對(duì)耗電敏感的操作,比如Alarm,比如頻繁掃描Wifi,一定要考慮這些操作的極端最壞情況。比如,之前我們手機(jī)上某NetworkProvider導(dǎo)致手機(jī)空置狀態(tài)下,比以前成倍的耗電。原因就是,Alarm不斷喚醒手機(jī),每次喚醒又不斷的掃描Wifi。
2)、對(duì)于有后臺(tái)Service的,確保該service只在必要情況下運(yùn)行,而不會(huì)一直運(yùn)行,可以用strace查看下app的活動(dòng)狀態(tài)
6、在MIUI上出現(xiàn)問題后,排查的手段
首先看原生系統(tǒng)上有無問題找對(duì)應(yīng)的Nexus 4或者Galaxy Nexus等,看看是否有相同問題,若有,基本確定是app自身問題,否則有可能和MIUI有關(guān)。
MIUI對(duì)權(quán)限控制較為嚴(yán)格:若出現(xiàn)問題,可先看看授權(quán)管理,打開相應(yīng)權(quán)限。
若確定為MIUI問題,可以和我們聯(lián)系,我們會(huì)竭盡全力幫助您解決問題之前我們?cè)鴧f(xié)助啪啪、暴風(fēng)影音、唱吧以及其它個(gè)人開發(fā)者或者終端用戶調(diào)研過遇到的問題,均得到較好的解決方法。
二、常用問題
1、為什么在Manifest聲明了android.permission.INTERNET還是無法訪問網(wǎng)絡(luò)?
A:安全中心-網(wǎng)絡(luò)助手里為用戶提供了網(wǎng)絡(luò)控制功能,如果把A應(yīng)用的移動(dòng)網(wǎng)絡(luò)權(quán)限或者WIFI網(wǎng)絡(luò)權(quán)限禁用了,那么在調(diào)用網(wǎng)絡(luò)請(qǐng)求的時(shí)候會(huì)拋出異常:java.net.ConnectException:socket failed:EACCES(Permission denied)
2、為什么無法訪問環(huán)回地址(127.0.0.1)?
A:安全中心-網(wǎng)絡(luò)助手里為用戶提供了網(wǎng)絡(luò)控制功能,如果把A應(yīng)用的移動(dòng)網(wǎng)絡(luò)權(quán)限禁用,則該應(yīng)用訪問環(huán)回地址失敗。
3、為什么我的應(yīng)用在開啟騷擾攔截之后收不到驗(yàn)證短信?
A:騷擾攔截有智能引擎的判斷,在開啟智能攔截后我們會(huì)識(shí)別某些帶有騷擾短信特征的短信。如果您認(rèn)為您的短信被誤判,可以聯(lián)系我們。
4、為什么我的應(yīng)用發(fā)起的回?fù)茈娫挄?huì)被攔截?
A:回?fù)茈娫捰袃煞N:一種是空號(hào)碼,騷擾攔截有空號(hào)碼攔截,在用戶手動(dòng)設(shè)置之后會(huì)攔截空號(hào)碼。一種是正常號(hào)碼,騷擾攔截有標(biāo)記攔截的功能,在開啟標(biāo)記攔截且該號(hào)碼被多次標(biāo)記拉黑則會(huì)被攔截。
5、為什么我的應(yīng)用申請(qǐng)使用su命令會(huì)失?。?/strong>
A:
1)、MIUI的穩(wěn)定版沒有root權(quán)限。
2)、開發(fā)版有root權(quán)限,但是受手機(jī)端App安全中心控制。如果您需要您的應(yīng)用開啟某項(xiàng)權(quán)限,可以引導(dǎo)用戶跳轉(zhuǎn)應(yīng)用權(quán)限管理頁面由用戶手動(dòng)開啟。
Intent intent=new Intent();intent.setAction("miui.intent.action.ROOT_MANAGER");intent.addCategory(Intent.CATEGORY_DEFAULT);
3)、一些應(yīng)用在獲取root權(quán)限后,會(huì)修改系統(tǒng)的su等文件,導(dǎo)致其他應(yīng)用的root不可用。
6、為什么我在Manifest聲明了權(quán)限,依然不能控制Wifi,Gps,顯示懸浮窗等?
A:安全中心會(huì)控制權(quán)限的使用,如果需要開放某個(gè)權(quán)限,可以在安全中心-授權(quán)管理-應(yīng)用權(quán)限管理內(nèi)修改。我們會(huì)根據(jù)應(yīng)用的主要功能開放權(quán)限。
7、為什么WindowManager.addView TYPE_TOAST不能顯示自定義Toast
A:MIUI取消了對(duì)TYPE_TOAST的支持,只能使用zhiandroid.widget.Toast.setView來實(shí)現(xiàn)自定義Toast。用其他方式使用TYPE_TOAST,會(huì)報(bào)告permission denied for this window type錯(cuò)誤,后果取決于應(yīng)用實(shí)現(xiàn),或者閃退,或者內(nèi)容無法顯示。
8、鏈?zhǔn)絾?dòng)控制
A:從MIUI7.3中就添加了“鏈?zhǔn)絾?dòng)”功能,所以A應(yīng)用啟動(dòng)B應(yīng)用也會(huì)受到一定的限制當(dāng)應(yīng)用試圖啟動(dòng)另外一個(gè)應(yīng)用時(shí),根據(jù)鏈?zhǔn)絾?dòng)規(guī)則,可能有部分調(diào)用會(huì)受限制,應(yīng)用應(yīng)該處理啟動(dòng)失敗的情形。如果不處理,依賴于應(yīng)用實(shí)現(xiàn),或者閃退,或者無法正常工作。如果日志中出現(xiàn):miui.security.WakePathChecker:MIUILOG-WAKEPATH:xxx call was rejected by wakepath就代表應(yīng)用啟動(dòng)被鏈?zhǔn)絾?dòng)控制拒絕了。
9、為什么不能在鎖屏顯示Activity
A:MIUI引入了鎖屏顯示窗口權(quán)限控制,默認(rèn)不能在鎖屏上顯示Activity(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD),需要用戶主動(dòng)授予鎖屏上顯示權(quán)限.如果功能需要,可以編碼提示用戶去授權(quán)管理設(shè)置。
10、如何獲取某項(xiàng)權(quán)限是否開啟?
A:暫時(shí)沒有這個(gè)查詢接口,如果您需要您的應(yīng)用開啟某項(xiàng)權(quán)限,可以引導(dǎo)用戶跳轉(zhuǎn)應(yīng)用權(quán)限管理頁面由用戶手動(dòng)開啟。
11、為什么我的Alarm不太精確?
A:Google和MIUI都啟用了對(duì)齊喚醒功能,會(huì)把一小段時(shí)間內(nèi)的Alarm對(duì)齊到某個(gè)Alarm的時(shí)間點(diǎn)一起執(zhí)行,達(dá)到省電的目的。
12、我的應(yīng)用為什么不能自啟動(dòng)?
A:在MIUI上應(yīng)用的自啟動(dòng)由用戶進(jìn)行控制,默認(rèn)不開放自啟動(dòng)權(quán)限,其中自啟動(dòng)包含開機(jī)自啟動(dòng)和接收系統(tǒng)廣播等方式啟動(dòng),但是由A應(yīng)用啟動(dòng)B應(yīng)用則不受限制。如果您需要您的應(yīng)用自啟動(dòng),可以引導(dǎo)用戶跳轉(zhuǎn)自啟動(dòng)管理頁面由用戶手動(dòng)開啟。
13、我的應(yīng)用在小米應(yīng)用商店審核失敗怎么辦?
A:關(guān)于應(yīng)用審核問題、認(rèn)領(lǐng)問題、開發(fā)者郵箱認(rèn)證問題,以及其它關(guān)于小米應(yīng)用商店的運(yùn)營(yíng)問題(除開發(fā)中遇到的問題),請(qǐng)聯(lián)系小米應(yīng)用商店開發(fā)者支持郵箱:developer@xiaomi.com。
14、添加了MIUI提供的沉浸式代碼后發(fā)現(xiàn)軟件盤是否彈出的狀態(tài)獲取不到以及android:windowSoftInputMode="adjustResize"的設(shè)置無作用,該怎么解決?
A:這個(gè)問題是android原生的問題,我們的MIUISDK已經(jīng)解決。如果使用MIUISDK則不會(huì)出現(xiàn)此問題。如果是在原生系統(tǒng)上開發(fā),可以通過如下參考辦法繞過adjustResize無效,參考辦法:輸入法原來沉浸的方法繼續(xù)加上,然后在布局view上面設(shè)置setFitSystemWindow屬性為true,這樣resize屬性會(huì)生效。但是view的頂部會(huì)預(yù)留出來狀態(tài)欄的高度。再重寫界面根view(應(yīng)用xml布局的頂層view)的fitSystemWindow函數(shù),將頂部的padding去掉。有點(diǎn)繞,但是效果出來是對(duì)的。
15、據(jù)說雙卡雙待的功能不是安卓原生的功能,現(xiàn)在我需要調(diào)用系統(tǒng)撥打電話但沒有辦法控制使用那個(gè)卡來撥打,我該怎么解決?
A:原生android在5.1之前本身是沒有雙卡方案,所以5.1之前的所有雙卡方案都是隨著平臺(tái)的不同而不同的。建議就按正常的單卡呼叫方案進(jìn)行,理論上會(huì)給用戶提示選擇用哪個(gè)卡進(jìn)行呼叫。而在原生android5.1及以后,android原生支持了雙卡,這個(gè)將是業(yè)界標(biāo)準(zhǔn)接口,按google方案即可。
16、在SSL協(xié)議握手過程中出現(xiàn)的exception,該怎么解決?
A:可以通過如下方法排查:模擬器里網(wǎng)絡(luò)設(shè)置的是否正常,是否能上其他https的網(wǎng)站。換個(gè)時(shí)間點(diǎn)試試,有可能是服務(wù)器端的問題更新下/system/lib/libssl.so文件
17、如何解決app在淺色背景的主題通知欄看不清通知的問題?如何解決默認(rèn)系統(tǒng)通知欄處部分app字體顏色顯示不明顯問題?
A:在MIUI系統(tǒng)中,通知欄的每一條通知的字體顏色(包括標(biāo)題、主次要文字、時(shí)間等)均使用原生Android規(guī)范,并未系統(tǒng)定義,故,建議各app參照原生Android規(guī)范來寫字體,保證當(dāng)主題修改原生Android字體顏色時(shí),各app的通知顏色可隨之調(diào)整。如下內(nèi)容請(qǐng)轉(zhuǎn)達(dá)給相應(yīng)開發(fā)處理。要想文字跟隨主題變化,TextView需要用android原生的style比如標(biāo)題的Textview可以加上android:textAppearance=" android:style/TextAppearance.StatusBar.EventContent.Title"
以上為應(yīng)用開發(fā)常用問題內(nèi)容。