Google Play 改变关于 location.gps feature 的设定

目录
  1. 1. 收到邮件
  2. 2. 做做功课
  3. 3. 总结一下
  4. 4. 一点疑问
  5. 5. 要做的改变
  6. 6. Bugtags 新增了下面两个 uses-feature

上个阶段忙一些个人事务,更新的少了。这段时间会集中发一些个人学习心得。

收到邮件

21号收到一封 Google Play 发来的邮件,告知如下信息:

1
2
3
4
5
Hello Google Play Developer,
We're writing to let you know that the apps listed at the end of this email may be affected by an upcoming platform change.
Action required: If your app requires GPS hardware to operate properly, you will need to explicitly add the "android.hardware.location.gps" uses-feature to your manifest.

...

大概意思是:

1
2
3
4
5
对于 `target sdk >= 21(5.0)` 的 APK 包,使用 `ACCESS_FINE_LOCATION` 权限的时候,并不会隐含的使用 `android.hardware.location.gps` 这个 feature。

可能带来的后果是,一些没有 GPG 芯片的设备,也可以安装这个 APK,导致用户体验就很不好。

需要做的是,显式的声明对这个权限的使用。

做做功课

翻了下关于这个权限的文档:

总结一下

  • uses-feature 这个机制,主要是方便 APP 商店过滤和匹配设备与 APK。

  • 官方希望大家显式的声明需要用到的硬件或者软件 feature,但是做了隐含的声明机制。

    例如在使用 ACCESS_WIFI_STATE 这个权限的时候,会隐含的加入 android.hardware.wifi,这一点,可以使用如下命令来确认:

    1
    aapt dump bading <apk-path>
  • target sdk >= 21(5.0) 有了些改变,ACCESS_COARSE_LOCATION 不再隐含加入 android.hardware.location.networkACCESS_FINE_LOCATION 不再隐含加入 android.hardware.location.gps

一点疑问

对于使用 aapt dum badging 命令得出结果,有一点其实有疑问:

  • 编译条件:

    1
    2
    3
    4
    5
    compileSdkVersion 23
    buildToolsVersion '23.0.2'

    minSdkVersion 14
    targetSdkVersion 23
  • dump 命令

    1
    ~/sdk/build-tools/23.0.1/aapt dum badging dev-com-debug.apk
  • dump 结果

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    uses-feature: name='android.hardware.location'
    uses-implied-feature: name='android.hardware.location' reason='requested android.permission.ACCESS_COARSE_LOCATION permission, and requested android.permission.ACCESS_FINE_LOCATION permission'
    uses-feature: name='android.hardware.location.gps'
    uses-implied-feature: name='android.hardware.location.gps' reason='requested android.permission.ACCESS_FINE_LOCATION permission'
    uses-feature: name='android.hardware.location.network'
    uses-implied-feature: name='android.hardware.location.network' reason='requested android.permission.ACCESS_COARSE_LOCATION permission'
    uses-feature: name='android.hardware.touchscreen'
    uses-implied-feature: name='android.hardware.touchscreen' reason='default feature for all apps'
    uses-feature: name='android.hardware.wifi'
    uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission'

    为什么这里面还是隐含使用了 android.hardware.location.gps 等 feature?可能 aapt 的 print 规则和最新的现在规则不一致?

要做的改变

  • 这个机制只会影响 target sdk >= 21(5.0) 的 APK
  • 最好显式的加入 uses-feature,否则 Google Play 会认为你不使用某些 feature,那就允许不具备某些 feature 的硬件安装这个 APK,可能会囧
  • 在声明 uses-feature 的时候,注意 required,在不显式设置的情况下,是 true。true 代表只有这个 feature 才能安装,false 代表没有也 OK

Bugtags 新增了下面两个 uses-feature

1
2
3
4
5
6
<uses-feature
android:name="android.hardware.location.gps"
android:required="false" />
<uses-feature
android:name="android.hardware.location.network"
android:required="false" />
本文由 kvh 创作,采用 CC BY 3.0 CN协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。