针对最大数量的受支持设备优化Android清单文件

iwa*_*bed 12 compatibility android manifest android-manifest android-compatibility

当我上传新的APK文件并且我不明白为什么时,我的问题是让我的Manifest文件与许多较新的手机兼容.我正在全新的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>
Run Code Online (Sandbox Code Playgroud)

iwa*_*bed 21

我想发布这个问题,也是一个答案,因为我发现一开始就弄清楚这是非常令人沮丧的.然而,这将我支持的设备数量从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>
Run Code Online (Sandbox Code Playgroud)

引自原始文章:

如果设备屏幕大小和密度与"compatible-screens"元素中的任何屏幕配置(由"screen"元素声明)不匹配,则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>
Run Code Online (Sandbox Code Playgroud)