Оптимизация файла манифеста 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 фильтрует приложение, если размер экрана устройства и плотность не соответствует ни одной из конфигураций экрана (объявлен элемент" экран") в элементе" совместимые экраны".

внимание: обычно не следует использовать этот элемент манифеста. С помощью этот элемент может значительно снизить потенциальную базу пользователей для применение, путем исключать все сочетания из размер и плотность экрана что вы не перечислили. Вы должны вместо этого используйте элемент манифеста "supports-screens" (описанный выше в таблице 1) для включить режим совместимости для конфигурации экрана не учитывается с альтернативными ресурсами.

Метод 2: другой метод вы можете использовать, чтобы быть более конкретные С <compatible-screens> тег и избавиться от <supports-screens /> теги. Вы можете основывать эти решения на ваших требованиях к приложению, а также на последний распределительного устройства числа.

в приведенном ниже примере я не хочу поддерживать небольшие экраны или ldpi плотности нормальных, больших или xlarge экранов, поэтому я оставил их.

<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>