Оптимизация файла манифеста 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>