Оптимизация файла манифеста Android для наибольшего количества поддерживаемых устройств
У меня возникают проблемы с тем, чтобы мой файл манифеста был совместим с множеством новых телефонов при загрузке нового файла APK, и я не понимаю, почему. Я тестирую его на совершенно новом HTC Evo V, но по какой-то причине это устройство не будет отображаться в списке совместимости.
Я собираюсь против API 17 с минимальной поддержкой API 10, поэтому это должно охватывать большинство телефонов.
Что я пробовал:
- Удалены все разрешения; без изменений
- Пробовал делать WIFI не требуется; без изменений
- Удалено
installLocation
, чтобы узнать, не изменилось ли это; без изменений
- Даже попробовал добавить поддержку небольшого экрана, чтобы посмотреть, не появится ли она; без изменений
Что я читал:
Мой файл манифеста:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.somecompany.appname"
android:versionCode="10"
android:versionName="1.0"
android:installLocation="preferExternal">
<!-- For expansion pack downloads -->
<!-- Required to access Android Market Licensing -->
<uses-permission android:name="com.android.vending.CHECK_LICENSE" />
<!-- Required to download files from Android Market -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- Required to keep CPU alive while downloading files (NOT to keep screen awake) -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- Required to poll the state of the network connection and respond to changes -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- Required to check whether Wi-Fi is enabled -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!-- Required to read and write the expansion files on shared storage -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="17"/>
<supports-screens android:normalScreens="true"/>
<supports-screens android:largeScreens="true"/>
<supports-screens android:xlargeScreens="true"/>
<compatible-screens>
<screen android:screenSize="normal" android:screenDensity="mdpi" />
<screen android:screenSize="large" android:screenDensity="hdpi" />
<screen android:screenSize="xlarge" android:screenDensity="xhdpi" />
</compatible-screens>
<application android:icon="@drawable/icon" android:label="@string/app_name" android:allowBackup="false">
<activity android:name="somecompany.appname.SplashScreen"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="somecompany.appname.SoundAndCallActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.NoTitleBar"/>
<activity android:name="somecompany.appname.MainScreenActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.NoTitleBar"/>
<activity android:name="somecompany.appname.SettingsActivity" android:screenOrientation="portrait" android:theme="@style/Theme.Transparent"/>
</application>
</manifest>
Ответы
Ответ 1
Я хотел опубликовать этот вопрос и также ответ, потому что я обнаружил, что это так расстраивает, чтобы понять сначала. Однако это изменило количество поддерживаемых устройств с 499 по 1968 год. Надеемся, это поможет большему количеству людей в будущем, поскольку это кажется неясной темой.
Техника 1: Причина, по которой больше устройств не появлялась, заключалась в том, что Google более агрессивно фильтрует, когда вы используете тег <compatible-screens>
. В моем случае у меня не было достаточного количества различных размеров экрана и комбинаций плотности, поэтому он отфильтровывал все те, которые я оставил (см. Методику 2 ниже).
Если вместо этого вы используете ТОЛЬКО теги <supports-screens />
, вы сможете включить приложение, которое будет найдено многими другими устройствами. Сделайте себе одолжение и удалите все теги в блоке <compatible-screens>
.
Вы можете использовать такую короткую форму:
<supports-screens android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" android:anyDensity="true"></supports-screens>
Цитируется из оригинальной статьи:
Google Play фильтрует приложение, если размер экрана устройства и плотность не соответствует ни одной конфигурации экрана (объявленной элемент "screen" ) в элементе "совместимые экраны".
Предостережение: Обычно вы не должны использовать этот манифест. С помощью этот элемент может значительно уменьшить потенциальную базу пользователей для вашего приложения, исключив все комбинации размера экрана и плотности что вы не указали. Вместо этого вы должны использовать элемент манифеста "поддержка-экраны" (описанный выше в таблице 1), чтобы включить режим совместимости экрана для конфигураций экрана, которые у вас есть не учитываются альтернативными ресурсами.
Техника 2: Другой метод, который вы можете использовать, должен быть более конкретным с вашим тегом <compatible-screens>
и избавиться от тегов <supports-screens />
. Вы можете основывать эти решения на своих требованиях к приложениям, а также на последние номера устройств распространения.
В приведенном ниже примере я не хочу поддерживать небольшие экраны или плотности ldpi
для обычных, больших или больших экранов, поэтому я их не выбрал.
<compatible-screens>
<!-- all normal size screens -->
<screen android:screenSize="normal" android:screenDensity="mdpi" />
<screen android:screenSize="normal" android:screenDensity="hdpi" />
<screen android:screenSize="normal" android:screenDensity="xhdpi" />
<!-- all large size screens -->
<screen android:screenSize="large" android:screenDensity="mdpi" />
<screen android:screenSize="large" android:screenDensity="hdpi" />
<screen android:screenSize="large" android:screenDensity="xhdpi" />
<!-- all xlarge size screens -->
<screen android:screenSize="xlarge" android:screenDensity="mdpi" />
<screen android:screenSize="xlarge" android:screenDensity="hdpi" />
<screen android:screenSize="xlarge" android:screenDensity="xhdpi" />
</compatible-screens>