发布 APK 到 Google Play 之 uses-featrue 的配置

在发布应用到 Google Play 之前有一个细节可能很多人会忽略,这就是 <uses-featrue> 的配置。

什么是 <uses-featrue>

所谓 <uses-featrue> 就是 Android 官方为发布到 Google Play 的程序建立的一套筛选机制。每一个 <uses-featrue> 都声明了对某种系统资源的硬性要求,在编译阶段,会自动根据我们程序中调用到的资源来添加。 Google Play 会读取 APK 文件信息中的 <uses-featrue>,当用户检索应用的时候,会自动过滤掉那些他们可能无法适用的应用程序。

比如,我们的应用中某个地方使用到了蓝牙操作,编译时,Android 编译系统会自动在我们的 APK 文件信息中增加对蓝牙的 <uses-featrue> 声明,大概长这个样子:

 <uses-feature android:name="android.hardware.bluetooth" android:required="true" />

如此,不具有蓝牙模块的设备在 Google Play 中检索应用时,将无法看到我们的应用。

为什么我们需要去配置 <uses-featrue>

前文说明了,默认状态下 <uses-featrue> 是自动生成了,所以看起来我们不需要去手动配置,但问题是编译系统其实没有那么智能,可以直接筛选出必要的设备需求,现实情况是只要我们程序中有引用到某种资源(可能这种资源并不是必要的),最终的 APK 信息中就会包含这种资源的 <uses-featrue> 声明。

当然,我们希望我们的应用能有尽可能多的受众,所以发布到 Google Play 之前进行 <uses-featrue> 的配置,避免因为使用了某种不必要的资源被 Google Play 过滤掉,就显得有必要了。

如何去配置 <uses-featrue>

网上有很多介绍 <uses-featrue> 的文档,这里就不做搬运工了,本文只介绍如何查看 APK 文件的 <uses-featrue> 和配置方法。

步骤一:查看 APK 文件的 <uses-featrue>>

环境需要 : Android SDK

我们需要使用 Android SDK 工具中的 aapt 工具,其路径一般是在:

你的 SDK 路径\build-tools\对应编译工具版本目录\

这个路径下有很多编译工具,我们用的 aapt 工具就在这里。

找到后,切换到上述目录下,运行命令:

aapt dump badging demo.apk

将上面的 demo.apk 换成你的 APK 名字就可以了。回车执行命令后,会输入整个 APK 的信息,如下是微信的 APK 信息:

package: name='com.tencent.mm' 
versionCode='861' 
versionName='6.3.25' 
platformBuildVersionName='6.0-2704002'
install-location:'auto'sdkVersion:'15'
targetSdkVersion:'23'
uses-permission: name='com.tencent.mm.plugin.permission.READ'
uses-permission: name='com.tencent.mm.plugin.permission.WRITE'
uses-permission: name='com.tencent.mm.permission.MM_MESSAGE'
uses-permission: name='com.huawei.authentication.HW_ACCESS_AUTH_SERVICE'
uses-permission: name='android.permission.ACCESS_NETWORK_STATE'
uses-permission: name='android.permission.ACCESS_COARSE_LOCATION'
uses-permission: name='android.permission.ACCESS_FINE_LOCATION'
uses-permission: name='android.permission.CAMERA'
uses-permission: name='android.permission.GET_TASKS'
uses-permission: name='android.permission.INTERNET'
uses-permission: name='android.permission.MODIFY_AUDIO_SETTINGS'
uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED'
uses-permission: name='android.permission.RECORD_AUDIO'
uses-permission: name='android.permission.READ_CONTACTS'
uses-permission: name='android.permission.READ_SMS'
uses-permission: name='android.permission.VIBRATE'
uses-permission: name='android.permission.WAKE_LOCK'
uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE'
uses-permission: name='android.permission.WRITE_CONTACTS'
uses-permission: name='android.permission.WRITE_SETTINGS'
uses-permission: name='com.android.launcher.permission.INSTALL_SHORTCUT'
uses-permission: name='com.android.launcher.permission.UNINSTALL_SHORTCUT'
uses-permission: name='com.android.launcher.permission.READ_SETTINGS'
uses-permission: name='com.tencent.mm.location.permission.SEND_VIEW'
uses-permission: name='android.permission.BLUETOOTH'
uses-permission: name='android.permission.BLUETOOTH_ADMIN'
uses-permission: name='android.permission.BROADCAST_STICKY'
uses-permission: name='android.permission.SYSTEM_ALERT_WINDOW'
uses-permission: name='android.permission.CHANGE_WIFI_STATE'
uses-permission: name='android.permission.GET_PACKAGE_SIZE'
uses-permission: name='android.permission.DOWNLOAD_WITHOUT_NOTIFICATION'
uses-permission: name='android.permission.NFC'
uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE'
uses-permission: name='android.permission.WRITE_APP_BADGE'
uses-permission: name='android.permission.ACCESS_WIFI_STATE'
uses-permission: name='android.permission.READ_PHONE_STATE'
uses-permission: name='com.tencent.mm.ext.permission.READ'
uses-permission: name='com.tencent.mm.ext.permission.WRITE'
uses-permission: name='com.android.vending.BILLING'
uses-permission: name='android.permission.READ_EXTERNAL_STORAGE'
uses-permission: name='com.android.alarm.permission.SET_ALARM'
uses-permission: name='com.tencent.mm.wear.message'
uses-permission: name='android.permission.BODY_SENSORS'
uses-permission: name='android.permission.USE_CREDENTIALS'
uses-permission: name='com.google.android.c2dm.permission.RECEIVE'
uses-permission: name='android.permission.GET_ACCOUNTS'
uses-permission: name='com.tencent.mm.permission.C2D_MESSAGE'
uses-permission: name='android.permission.USE_FINGERPRINT'
uses-permission: name='android.permission.MANAGE_ACCOUNTS'
uses-permission: name='android.permission.AUTHENTICATE_ACCOUNTS'
uses-permission: name='android.permission.READ_SYNC_SETTINGS'
uses-permission: name='android.permission.WRITE_SYNC_SETTINGS'
uses-permission: name='android.permission.READ_PROFILE
'application-label:'WeChat'
application-label-az-AZ:'WeChat'
application-label-bn-BD:'WeChat'
application-label-en:'WeChat'
application-label-en-AU:'WeChat'
application-label-en-GB:'WeChat'
application-label-en-IN:'WeChat'
application-label-es-US:'WeChat'
application-label-et-EE:'WeChat'
application-label-eu-ES:'WeChat'
application-label-fa:'WeChat'
application-label-fr-CA:'WeChat'
application-label-gl-ES:'WeChat'
application-label-gu-IN:'WeChat'
application-label-hy-AM:'WeChat'
application-label-is-IS:'WeChat'
application-label-ka-GE:'WeChat'
application-label-kk-KZ:'WeChat'
application-label-km-KH:'WeChat'
application-label-kn-IN:'WeChat'
application-label-ky-KG:'WeChat'
application-label-lo-LA:'WeChat'
application-label-mk-MK:'WeChat'
application-label-ml-IN:'WeChat'
application-label-mn-MN:'WeChat'
application-label-mr-IN:'WeChat'
application-label-ms-MY:'WeChat'
application-label-my-MM:'WeChat'
application-label-ne-NP:'WeChat'
application-label-pa-IN:'WeChat'
application-label-pt-BR:'WeChat'
application-label-pt-PT:'WeChat'
application-label-si-LK:'WeChat'
application-label-sq-AL:'WeChat'
application-label-sr:'WeChat'
application-label-sv:'WeChat'
application-label-sw:'WeChat'
application-label-ta-IN:'WeChat'
application-label-te-IN:'WeChat'
application-label-tl:'WeChat'
application-label-uk:'WeChat'
application-label-ur-PK:'WeChat'
application-label-uz-UZ:'WeChat'
application-label-zh-CN:'寰俊'
application-label-zh-TW:'WeChat'
application-label-zu:'WeChat'
application-icon-120:'r/j/icon.png'
application-icon-160:'r/j/icon.png'
application-icon-213:'r/y/icon.png'
application-icon-240:'r/y/icon.png'
application-icon-320:'r/a0/icon.png'
application-icon-480:'r/a2/icon.png'
application-icon-640:'r/a2/icon.png'
application: label='WeChat' 
icon='r/j/icon.png'
uses-library-not-required:'com.google.android.maps'
uses-library-not-required:'com.sec.android.app.multiwindow'
launchable-activity: name='com.tencent.mm.ui.LauncherUI' 
label='WeChat' 
icon=''
uses-library-not-required:'com.here.android'
feature-group: 
label='' 
uses-feature-not-required: name='android.hardware.bluetooth' 
uses-feature-not-required: name='android.hardware.bluetooth_le' 
uses-feature-not-required: name='android.hardware.camera' 
uses-feature-not-required: name='android.hardware.camera.autofocus' 
uses-feature-not-required: name='android.hardware.location' 
uses-feature-not-required: name='android.hardware.location.gps' 
uses-feature-not-required: name='android.hardware.location.network' 
uses-feature-not-required: name='android.hardware.microphone' 
uses-feature-not-required: name='android.hardware.telephony' 
uses-feature-not-required: name='android.hardware.touchscreen' 
uses-feature-not-required: name='android.hardware.wifi' 
uses-feature: name='android.hardware.screen.portrait' 
uses-implied-feature: name='android.hardware.screen.portrait' 
reason='one or more activities have specified a portrait orientation'
mainother-activitiesother-receiversother-services
supports-screens: 'small' 'normal' 'large' 'xlarge'
supports-any-density: 'true'locales: '--_--' 'az-AZ' 'bn-BD' 'en' 'en-AU' 'en-GB' 'en-IN' 'es-US' 'et-EE' 'eu-ES' 'fa' 'fr-CA' 'gl-ES' 'gu-IN' 'hy-AM' 'is-IS' 'ka-GE' 'kk-KZ' 'km-KH' 'kn-IN' 'ky-KG' 'lo-LA' 'mk-MK' 'ml-IN' 'mn-MN' 'mr-IN' 'ms-MY' 'my-MM' 'ne-NP' 'pa-IN' 'pt-BR' 'pt-PT' 'si-LK' 'sq-AL' 'sr' 'sv' 'sw' 'ta-IN' 'te-IN' 'tl' 'uk' 'ur-PK' 'uz-UZ' 'zh-CN' 'zh-TW' 'zu'
densities: '120' '160' '213' '240' '320' '480' '640'
native-code: 'armeabi' 'lib/'

可以看到,下面的以 uses-feature 打头的信息就是了,发现没有,微信使用了很多uses-feature-not-required的声明,这就是我们接下来需要做的事情了。

步骤二:声明不必要的资源

如上面微信的那样,我们声明那些不必要的资源,告诉 Google Play 在不具备这些资源的设备上显示我们。

经过步骤一,我们已经可以拿到自己应用的 APK 信息了,跟声明应用权限很类似,我们只需要在 Androidmainfest.xml 文件中声明对应不需要的信息为 false 就可以了,比如声明上面的蓝牙信息为不必要:

<uses-feature android:name="android.hardware.bluetooth" android:required="false" />

这样再使用步骤一的命令查看应用信息,就会看到uses-feature-not-required: name='android.hardware.bluetooth' 了,如此没有蓝牙设备的用户就会在 Google Play 中看到我们了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容