最近連續有國外的客戶報告在某些特定的Android設備上搜索不到我們的應用。
一開始懷疑uses-feature的設置排除了硬件不支持的設備。我們在manifest里有以下設置:
<uses-feature android:glEsVersion="0x00020000" ></uses-feature>
該設置會排除不支持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"></uses-feature>
排除這個,繼續找原因。
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。感謝這篇博客。
測試一下這個猜測,在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" />
