微信号:mobdev

介绍:分享 kvh 对于技术、创业的理解和实践

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

2016-09-23 20:53 kvh

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

收到邮件

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

 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.

 ...

大概意思是:

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

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

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

做做功课

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

  • 官方文档

    https://developer.android.com/guide/topics/location/strategies.html#Permission
     https://developer.android.com/guide/topics/manifest/uses-feature-element.html#permissions

  • StackOverflow 讨论

    http://stackoverflow.com/questions/39603270/when-do-i-need-android-hardware-location-gps-and-android-hardware-location-netwo

总结一下

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

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

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

      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 命令得出结果,有一点其实有疑问:

  • 编译条件:

      compileSdkVersion 23
      buildToolsVersion '23.0.2'
    
      minSdkVersion 14
      targetSdkVersion 23
  • dump 命令

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

      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

    <uses-feature
        android:name="android.hardware.location.gps"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.location.network"
        android:required="false" />


『mobdev』微信公众号二维码


 
KVH 更多文章 Android Gradle 构建系统·初探 Bugtags 创业一年总结 Hexo 与 Nginx 实现沉浸式多语言博客 NDK SO 库开发与使用中的 ABI 构架选择 Android Gradle 技巧之二: 最爱命令行
猜您喜欢 网约车市场短暂的双寡头时代结束,滴滴和Uber中国合并之后的数据研究 TokuDB的索引结构–分形树的实现 StackOverflow:7个你从未见过的Java问题最佳答案 Android Debug memory leak 五分钟理解一致性哈希算法