针对最大数量的受支持设备优化 Android 清单文件
Posted
技术标签:
【中文标题】针对最大数量的受支持设备优化 Android 清单文件【英文标题】:Optimizing Android manifest file for largest number of supported devices 【发布时间】:2012-12-10 15:45:06 【问题描述】:当我上传新的 APK 文件时,我无法让我的清单文件与许多较新的手机兼容,我不明白为什么。我正在一个全新的HTC Evo V 上对其进行测试,但无论出于何种原因,该设备都不会出现在兼容性列表中。
我正在针对 API 17 进行编译,最低支持 API 10,因此应该涵盖绝大多数手机。
我尝试过的:
删除所有权限;没有变化 尝试使 WIFI 不需要;没有变化 删除了installLocation
,看看它是否有所作为;没有变化
甚至尝试添加小屏幕支持以查看它是否会显示;没有变化
我读过的:
http://developer.android.com/google/play/filters.html http://developer.android.com/guide/practices/screens-distribution.html http://developer.android.com/guide/practices/compatibility.html http://developer.android.com/guide/topics/manifest/manifest-intro.html我的清单文件:
<?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: 没有显示更多设备的原因是,当您使用 <compatible-screens>
标记时,Google 会更积极地过滤。就我而言,我没有足够的不同屏幕尺寸和密度组合,所以它过滤掉了我遗漏的所有内容(请参阅下面的技巧 2)。
如果您只使用<supports-screens />
标签,那么您的应用程序将能够被更多设备找到。所以请帮自己一个忙,删除 <compatible-screens>
块中的所有其他标签。
您可以使用这样的简写形式:
<supports-screens android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" android:anyDensity="true"></supports-screens>
引用自original article:
如果设备屏幕尺寸和 密度与任何屏幕配置都不匹配(由 “screen”元素)在“compatible-screens”元素中。
注意:通常,您不应使用此清单元素。使用 此元素可以显着减少您的潜在用户群 应用程序,通过排除屏幕尺寸和密度的所有组合 你没有列出。您应该改用 “supports-screens”清单元素(如上表 1 所述)到 为您拥有的屏幕配置启用屏幕兼容模式 没有考虑到替代资源。
技术 2: 您可以使用的另一种技术是使您的<compatible-screens>
标记更加具体,并摆脱<supports-screens />
标记。您可以根据您的应用要求以及latest device distribution numbers 做出这些决定。
在下面的示例中,我不想支持小屏幕或普通、大或 xlarge 屏幕的 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>
【讨论】:
@Arash 我刚刚过渡到 Android 世界,所以希望这会帮助其他一些人。 感谢您的提示,这真的很有帮助 “这将我支持的设备数量从 499 个更改为 1968 个”-@iWasRobbed 你是如何获得这些数字的? 它们会在您将新 APK 上传到 Google Play 开发控制台 @skataben 时显示 等等,我应该同时拥有支持屏幕和兼容屏幕吗?还是只有一个?为什么?谢谢老兄以上是关于针对最大数量的受支持设备优化 Android 清单文件的主要内容,如果未能解决你的问题,请参考以下文章
仅适用于 Android TV 的 Android 清单 - 支持的设备太少?
清单合并失败:针对 Android 12 的应用程序 - Android Studio 错误 [重复]
神经网络APIKotlin支持,那些你必须了解的Android 8.1预览版和Android Studio 3.0新特性