12

Mam problemy z pobieraniem pliku manifestu do kompatybilności z wieloma nowszymi telefonami podczas przesyłania nowego pliku APK i nie rozumiem, dlaczego tak się stało. Testuję to na zupełnie nowym HTC Evo V, ale z jakiegokolwiek powodu to urządzenie nie pojawi się na liście kompatybilności.Optymalizowanie pliku manifestu systemu Android dla największej liczby obsługiwanych urządzeń

Kompiluję się przeciwko API 17 z minimalnym wsparciem API 10, więc powinien on obejmować znaczną większość telefonów.

Co próbowałem:

  • Usunięto wszystkie uprawnienia; bez zmian
  • Próbowałem sprawić, że WIFI nie jest wymagana; bez zmiany
  • Usunięto installLocation, aby sprawdzić, czy to miało znaczenie; bez zmian
  • Nawet próbował dodać obsługę małego ekranu, aby sprawdzić, czy się pojawi; bez zmian

co czytałem:

Mój plik manifestu:

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

Odpowiedz

20

Chciałem opublikować to pytanie i również odpowiedź, ponieważ na początku było to frustrujące. Jednak zmieniło to moją liczbę obsługiwanych urządzeń od 499 do 1968. Mam nadzieję, że to pomoże większej liczbie osób w przyszłości, ponieważ wydaje się być niejasnym tematem.

Technika 1: Powodem więcej urządzeń nie pojawiają się dlatego, filtry Google bardziej agresywnie podczas korzystania tag <compatible-screens>. W moim przypadku nie miałem wystarczającej liczby różnych rozmiarów ekranu i kombinacji gęstości, więc odfiltrowałem wszystkie te, które pominięto (patrz Technika 2 poniżej).

Jeśli zamiast tego używasz TYLKO znaczników <supports-screens />, aplikacja będzie dostępna dla wielu innych urządzeń. Zrób sobie przysługę i usuń wszystkie inne znaczniki z bloku <compatible-screens>.

Można użyć Shortform takiego:

<supports-screens android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" android:anyDensity="true"></supports-screens> 

cytat z original article:

Google Play filtruje wniosek, jeśli wielkość ekranu urządzenia i gęstość nie pasuje do żadnej z ekranu konfiguracje (zadeklarowane przez element "screen" ) w elemencie "compatible-screens".

Ostrzeżenie: Zwykle nie należy używać tego elementu manifestu.Ten element może znacznie zmniejszyć potencjalną bazę użytkowników dla aplikacji , wykluczając wszystkie kombinacje rozmiaru i gęstości ekranu, których nie ma na liście. Zamiast tego należy użyć elementu manifestu "suporty wsporników" (opisanego powyżej w tabeli 1) do włączyć tryb zgodności ekranu dla konfiguracji ekranu, które masz , które nie są uwzględnione w alternatywnych zasobach.

Technika 2: Inną techniką można użyć ma być bardziej specyficzny z tagu <compatible-screens> i pozbyć się <supports-screens /> tagów. Możesz opierać te decyzje na wymaganiach aplikacji, a także na latest device distribution numbers.

W poniższym przykładzie nie chcę obsługiwać małych ekranów ani gęstości ekranów normalnych, dużych lub Xlarge, więc je opuściłem.

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

Wydaje pomocny THX –

+1

@Arash ja właśnie teraz przechodzi w świecie Androida, więc mam nadzieję, że przyczyni się to kilka innych osób, które są tak dobrze. – iwasrobbed

+1

Dzięki za podpowiedź, to było naprawdę pomocne –

Powiązane problemy