為什麼應用商店裡搜尋不到你的App?

大頭發表於2013-06-07

最近連續有國外的客戶報告在某些特定的Android裝置上搜尋不到我們的應用。
一開始懷疑uses-feature的設定排除了硬體不支援的裝置。我們在manifest裡有以下設定:

<uses-feature android:glEsVersion="0x00020000" />

該設定會排除不支援OpenGL ES 2.0的裝置,但是客戶報告的裝置Sony Xperia Tablet Z是支援OpenGL ES 2.0的。需要注意的是,據《Beginning Android Games》一書所說,有個東西,有時候不靈。(感謝這篇部落格。)

NOTE: This feature is reported incorrectly by some devices out there, making your application invisible to otherwise perfectly fine devices. Use it with caution.

更穩妥的做法是設定android:required為false。這表示不支援OpenGL ES 2.0的裝置也可以搜尋到App並安裝,但是需要在程式碼裡判斷做一些該做的事。

<uses-feature android:glEsVersion="0x00020000" android:required="false" />

排除這個,繼續找原因。
manifest裡還有一些permission,有些permission需要硬體許可權,即,其隱含了uses-feature,也會排除一些不支援該feature的裝置。這可是一個大坑。
檢查我們App的設定,有如下兩項。

<uses-permission android:name="android.permission.READ_PHONE_STATE" />  
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> 

PROCESS_OUTGOING_CALLS需要android.hardware.telephony,就是說等同於設定了“android.hardware.telephony”的uses-feature,不支援電話功能的tablet,無法在應用商店裡搜尋到該應用。
測試一下這個猜測,在ASUS TF101(沒有電話功能)上的Google Play搜尋,搜不到我們App,在Samsung Nexus S手機上的Google Play搜尋同樣的關鍵詞,可以搜到我們的App。感謝這篇部落格

其實,Google的developer.android.com裡都介紹了上面說的這些。仔細閱讀以下內容還是很有必要的。
1. Google Play and Feature-Based Filtering: http://developer.android.com/guide/topics/manifest/uses-feature-element.html#market-feature-filtering
2. uses-feature element:http://developer.android.com/guide/topics/manifest/uses-feature-element.html
3. Permissions:http://developer.android.com/guide/topics/security/permissions.html
如果需要設定一個permission,但又不希望其implicit的uses-feature過濾掉裝置,可以用uses-feature的android:required="false"屬性設定來達到目的。

再試驗一下,修改manifest後做了一個App的簽名apk上傳到Google Play,不釋出,只看一眼預覽,可以看到,之前支援1247個裝置(不支援1891個),現在支援1638個裝置(391 added)。
顯示remove掉了“android.hardware.telephony”這個feature的過濾。

這個故事結束了,經上線驗證,可行。接下來是另一個故事。
有個日本客戶,拿兩臺Acer Iconia Tab測試,一臺A100,一臺A500。報告我們說某款應用在A100上可以安裝,A500上顯示“未對應裝置”,無法安裝。但是在Google Play Developer Console裡顯示為“對應裝置”。
在Developer Console裡都顯示為對應裝置,應該不是上述故事中說的坑。而A100和A500的區別是,A100的屏是7.0 inches,1024*600 pixels,A500的屏是10.1 inches,1080*800 pixels。
一篇日文文章裡提到Motorola Xoom 10英寸平板遇到的類似問題時有這麼一句:

Xoomは10インチタブレットなので、xlargeサイズ扱いとなり、対象外になってしまったと。

Google翻譯說:

Xoom是10英寸平板電腦,大小XLARGE處理,

雖然不懂日語,但也知道這和android:xlargeScreens="true"有關。可是,在另一款App的manifest檔案裡,也沒有如下設定,卻不會在A500上有問題。

<supports-screens android:xlargeScreens="true" />

差異在android:targetSdkVersion。
android:xlargeScreens屬性是從API level 9(Android 2.3)開始才支援的。
出問題的那款App,沒有顯式指定android:targetSdkVersion,於是targetSdkVersion等於minSdkVersion,為8。
經測試,指定targetSdkVersion為9即可解決該坑。

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="9" />

相關文章