開發(fā)最佳實(shí)踐與兼容性建議(適配常見問題)

MIUI是基于Android深度定制的操作系統(tǒng),和Android保持100%兼容,我們準(zhǔn)備了一些在Android開發(fā)過程中哦給你可能遇到的問題,也許對您有所幫助。

如果在基于MIUI進(jìn)行開發(fā)、測試的過程中遇到問題,我們會竭盡所能協(xié)助開發(fā)者解決。在和開發(fā)者溝通的過程中,我們發(fā)現(xiàn),很多應(yīng)用遇到的問題,并非因MIUI導(dǎo)致,而是對Android本身。

1.盡量用Android標(biāo)準(zhǔn)的接口,最好不要很“聰明”的讀取較為底層的數(shù)據(jù)

每個手機(jī)的底層都有可能有自己獨(dú)特的實(shí)現(xiàn),這種特殊性,其實(shí)是對開發(fā)者屏蔽的,開發(fā)者直接利用,有時(shí)會得不到期望的效果。

比如之前我們發(fā)現(xiàn)一款app,會直接讀取底層frame buffer,然后以錄像的方式顯示當(dāng)前屏幕,但是由于我們frame buffer的特殊性,結(jié)果它讀出來的就是兩三段斷開的屏幕。

再比如,有些游戲會直接從底層的讀取motion event,然后自己再根據(jù)這些事件做些相應(yīng)操作,但這些事件未經(jīng)過android處理,結(jié)果就有可能有問題。

2.要和Android版本保持一致

Android隨著版本的升級,會有些向后兼容性不好。常見現(xiàn)象是,本來在較低版本上正常運(yùn)行的app,在較高版本上運(yùn)行失敗。

一個常見的問題是權(quán)限相關(guān),比如WRITE_APN_SETTINGS這個權(quán)限是在某個版本上加進(jìn)去的,若app不申請此權(quán)限,在之前Android版本可正常運(yùn)行,但是一旦Android升級,app就會因?yàn)槿狈?quán)限而FC。

3. NDK版本

有些app可能是用NDK開發(fā)的,對于這樣的app,一定要在對應(yīng)的NDK版本下編譯測試,否則極有可能出現(xiàn)莫名其妙的問題。

比如,我們之前和某播放器應(yīng)用聯(lián)調(diào)過一個問題:該播放器在MIUI上播放一段時(shí)間后,立即卡死,當(dāng)時(shí)我們調(diào)試了好久,懷疑SurfaceFlinger,懷疑播放器本身,等等,各種調(diào)試,無果。

最終,還是發(fā)現(xiàn)是由于該播放器編譯時(shí),NDK版本不對。

4. 一定要釋放資源

一些資源,比如WakeLock,WifiLock,F(xiàn)ile descriptor,Cursor等一定要釋放,這些資源甚至?xí)绊懙饺帧1热鏦akeLock和WifiLock會影響屏幕和Wifi的休眠,從而導(dǎo)致耗電。

而Cursor,尤其是一些較為常用的Provider獲得的Cursor,長期不關(guān)閉,有可能會導(dǎo)致該P(yáng)rovider無法工作。

5. 耗電操作

慎用某些對耗電敏感的操作,比如Alarm,比如頻繁掃描Wifi,一定要考慮這些操作的極端最壞情況。比如,之前我們手機(jī)上某NetworkProvider導(dǎo)致手機(jī)空置狀態(tài)下,比以前成倍的耗電。原因就是,Alarm不斷喚醒手機(jī),每次喚醒又不斷的掃描Wifi。

對于有后臺Service的,確保該service只在必要情況下運(yùn)行,而不會一直運(yùn)行,可以用strace查看下app的活動狀態(tài)

6. 在MIUI上出現(xiàn)問題后,排查的手段

  • 首先看原生系統(tǒng)上有無問題\ 找對應(yīng)的Nexus 4或者Galaxy Nexus等,看看是否有相同問題,若有,基本確定是app自身問題,否則有可能和MIUI有關(guān)

  • MIUI對權(quán)限控制較為嚴(yán)格: 若出現(xiàn)問題,可先看看授權(quán)管理,打開相應(yīng)權(quán)限

  • 若確定為MIUI問題,可以和我們聯(lián)系,我們會竭盡全力幫助您解決問題之前我們曾協(xié)助啪啪、暴風(fēng)影音、唱吧以及其它個人開發(fā)者或者終端用戶調(diào)研過遇到的問題,均得到較好的解決方法。

常見問題

1、為什么在Manifest聲明了android.permission.INTERNET還是無法訪問網(wǎng)絡(luò)?

安全中心-網(wǎng)絡(luò)助手里為用戶提供了網(wǎng)絡(luò)控制功能,如果把A應(yīng)用的移動網(wǎng)絡(luò)權(quán)限或者WIFI網(wǎng)絡(luò)權(quán)限禁用了,那么在調(diào)用網(wǎng)絡(luò)請求的時(shí)候會拋出異常:java.net.ConnectException: socket failed: EACCES (Permission denied)

2、為什么無法訪問環(huán)回地址(127.0.0.1)?

安全中心-網(wǎng)絡(luò)助手里為用戶提供了網(wǎng)絡(luò)控制功能,如果把A應(yīng)用的移動網(wǎng)絡(luò)權(quán)限禁用,則該應(yīng)用訪問環(huán)回地址失敗。

3、為什么我的應(yīng)用在開啟騷擾攔截之后收不到驗(yàn)證短信?

騷擾攔截有智能引擎的判斷,在開啟智能攔截后我們會識別某些帶有騷擾短信特征的短信。如果您認(rèn)為您的短信被誤判,可以聯(lián)系我們。strong text####4、為什么我的應(yīng)用發(fā)起的回?fù)茈娫挄粩r截?回?fù)茈娫捰袃煞N:一種是空號碼,騷擾攔截有空號碼攔截,在用戶手動設(shè)置之后會攔截空號碼。一種是正常號碼,騷擾攔截有標(biāo)記攔截的功能,在開啟標(biāo)記攔截且該號碼被多次標(biāo)記拉黑則會被攔截。

5、為什么我的應(yīng)用申請使用su命令會失???

一、MIUI的穩(wěn)定版沒有root權(quán)限。二、開發(fā)版有root權(quán)限,但是受手機(jī)端App安全中心控制。如果您需要您的應(yīng)用開啟某項(xiàng)權(quán)限,可以引導(dǎo)用戶跳轉(zhuǎn)應(yīng)用權(quán)限管理頁面由用戶手動開啟。Intent intent = new Intent(); intent.setAction("miui.intent.action.ROOT_MANAGER"); intent.addCategory(Intent.CATEGORY_DEFAULT); 三、一些應(yīng)用在獲取root權(quán)限后,會修改系統(tǒng)的su等文件,導(dǎo)致其他應(yīng)用的root不可用。

6、為什么我在Manifest聲明了權(quán)限,依然不能控制Wifi,Gps,顯示懸浮窗等?

安全中心會控制權(quán)限的使用,如果需要開放某個權(quán)限,可以在安全中心-授權(quán)管理-應(yīng)用權(quán)限管理內(nèi)修改。我們會根據(jù)應(yīng)用的主要功能開放權(quán)限,如果您的應(yīng)用有權(quán)限控制方面的問題,請聯(lián)系我們。

7、如何獲取某項(xiàng)權(quán)限是否開啟?

暫時(shí)沒有這個查詢接口,如果您需要您的應(yīng)用開啟某項(xiàng)權(quán)限,可以引導(dǎo)用戶跳轉(zhuǎn)應(yīng)用權(quán)限管理頁面由用戶手動開啟。 Intent intent = new Intent(); intent.setAction("miui.intent.action.APP_PERM_EDITOR"); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.putExtra("extra_pkgname", "應(yīng)用包名");

8、為什么我的Alarm不太精確?

Google和MIUI都啟用了對齊喚醒功能,會把一小段時(shí)間內(nèi)的Alarm對齊到某個Alarm的時(shí)間點(diǎn)一起執(zhí)行,達(dá)到省電的目的。

9、我的應(yīng)用為什么不能自啟動?

在MIUI上應(yīng)用的自啟動由用戶進(jìn)行控制,默認(rèn)不開放自啟動權(quán)限,其中自啟動包含開機(jī)自啟動和接收系統(tǒng)廣播等方式啟動,但是由A應(yīng)用啟動B應(yīng)用則不受限制。如果您需要您的應(yīng)用自啟動,可以引導(dǎo)用戶跳轉(zhuǎn)自啟動管理頁面由用戶手動開啟。 Intent intent = new Intent();\ intent.setAction("miui.intent.action.OP_AUTO_START"); intent.addCategory(Intent.CATEGORY_DEFAULT);

10、如何在快捷方式圖標(biāo)上顯示未讀消息的數(shù)字?

請參看:Android系統(tǒng) 小米/三星/索尼快鍵圖標(biāo)BadgeNumber數(shù)字提醒

11、如何將我的音樂播放器控件集成到MIUI自帶的通知欄音樂控制中心去?

請參看:MIUI系統(tǒng)音樂控件標(biāo)準(zhǔn)化方案,第三方APP接入指南

12、我的應(yīng)用在小米應(yīng)用商店審核失敗怎么辦?

關(guān)于應(yīng)用審核問題、認(rèn)領(lǐng)問題、開發(fā)者郵箱認(rèn)證問題,以及其它關(guān)于小米應(yīng)用商店的運(yùn)營問題(除開發(fā)中遇到的問題),請聯(lián)系小米應(yīng)用商店開發(fā)者支持郵箱:developer@xiaomi.com

13、添加了MIUI提供的沉浸式代碼后發(fā)現(xiàn)軟件盤是否彈出的狀態(tài)獲取不到以及android:windowSoftInputMode="adjustResize" 的設(shè)置無作用,該怎么解決?

這個問題是android原生的問題,我們的MIUISDK已經(jīng)解決。如果使用MIUISDK則不會出現(xiàn)此問題。如果是在原生系統(tǒng)上開發(fā),可以通過如下參考辦法繞過adjustResize無效,參考辦法:輸入法原來沉浸的方法繼續(xù)加上,然后在布局view上面設(shè)置setFitSystemWindow屬性為true,這樣 resize屬性會生效。但是view的頂部會預(yù)留出來狀態(tài)欄的高度。 再重寫界面根view(應(yīng)用xml布局的頂層view)的fitSystemWindow函數(shù), 將頂部的padding去掉。 有點(diǎn)繞,但是效果出來是對的。

14、據(jù)說雙卡雙待的功能不是安卓原生的功能,現(xiàn)在我需要調(diào)用系統(tǒng)撥打電話但沒有辦法控制使用那個卡來撥打,我該怎么解決?

原生android在5.1之前本身是沒有雙卡方案,所以5.1之前的所有雙卡方案都是隨著平臺的不同而不同的。建議就按正常的單卡呼叫方案進(jìn)行,理論上會給用戶提示選擇用哪個卡進(jìn)行呼叫。而在原生android5.1及以后,android原生支持了雙卡,這個將是業(yè)界標(biāo)準(zhǔn)接口,按google方案即可。MIUI在開發(fā)的時(shí)候有一個原則是,原生的所有對外基本接口,絕對不會修改。

15、如何調(diào)用小米4的紅外控制接口發(fā)送紅外數(shù)據(jù)?

請參看:https://developer.android.com/reference/android/hardware/ConsumerIrManager.html

16、MIUI 中的藍(lán)牙2.0和android 原生中的藍(lán)牙2.0有什么兼容性問題嗎?

請參看:http://developer.android.com/guide/topics/connectivity/bluetooth.html

17、在SSL協(xié)議握手過程中出現(xiàn)的exception,該怎么解決?

可以通過如下方法排查: 1. 模擬器里網(wǎng)絡(luò)設(shè)置的是否正常,是否能上其他https的網(wǎng)站。2. 換個時(shí)間點(diǎn)試試,有可能是服務(wù)器端的問題。 3. 更新下/system/lib/libssl.so文件

18、如何調(diào)用MIUI 6沉浸式狀態(tài)欄?

請參看:MIUI 6 沉浸式狀態(tài)欄調(diào)用方法

19、如何解決app在淺色背景的主題通知欄看不清通知的問題?如何解決默認(rèn)系統(tǒng)通知欄處部分app字體顏色顯示不明顯問題?

在MIUI系統(tǒng)中,通知欄的每一條通知的字體顏色(包括標(biāo)題、主次要文字、時(shí)間等)均使用原生Android規(guī)范,并未系統(tǒng)定義,故,建議各app參照原生Android規(guī)范來寫字體,保證當(dāng)主題修改原生Android字體顏色時(shí),各app的通知顏色可隨之調(diào)整。

如下內(nèi)容請轉(zhuǎn)達(dá)給相應(yīng)開發(fā)處理。要想文字跟隨主題變化,TextView需要用android原生的style 比如標(biāo)題的Textview可以加上android:textAppearance="@android:style/TextAppearance.StatusBar.EventContent.Title"

如果以上信息沒有對您有幫助的信息請您使用公司域名郵箱務(wù)必按照如下模板填寫您反饋的問題,

發(fā)送到第三方應(yīng)用開發(fā)者反饋郵箱 miui-appfeedback@xiaomi.com

第三方應(yīng)用開發(fā)者問題反饋模板

郵件標(biāo)題:第三方應(yīng)用開發(fā)者反饋:+問題簡述 郵件內(nèi)容:APP名稱: APP版本: 設(shè)備機(jī)型: 系統(tǒng)版本: 問題描述: 代碼或log: 其它文件: 復(fù)制代碼