Google Play和基于Feature的过滤

Android App Bundle 已取代 APK 对新应用程序的要求 更新现有应用程序的要求 即时体验的要求 一起前进 利用功能模块,实现自定义分发 应用模块化 功能模块清单 测试 Play Feature Delivery 为资源构建 URI 有关功能模块的注意事项 阅读详情

原文地址:http://blog.youkuaiyun.com/thl789/article/details/10737533

田海立@优快云

翻译自Google Play and Feature-Based Filtering



GooglePlay会过滤出那些对用户可见的应用程序,因此用户只能看到和下载那些与他们的设备兼容的应用程序。过滤应用程序其中的一种方法就是通过Feature兼容性。

Google Play为判断应用程序与给定的用户设备是否兼容,比较:

  • 应用程序需要的Feature– 应用程序在它自己的manifest中通过<uses-feature>申明所需要的Feature;

  • 在设备上有效的硬/软件Feature-- 设备用只读的系统属性报告的它所支持的Feature。

为了确保Feature的准确比较,AndroidPackage Manager提供了一个共享的Feature常量集合,应用程序和设备都使用这些常量来声明各自所需要和支持的Feature。可用的Feature常量在本文下面的Feature参考表中被列出,它们定义在类文档PackageManager中。

当用户启动GooglePlay时,应用程序通过调用getSystemAvailableFeatures()方法,来查询包PackageManager中所列出的设备上可用的Featurelist。然后在建立用户会话的时候,软件商店(TheStore)应用程序会把这个Featurelist上传给GooglePlay。

每次把应用程序上传给GooglePlay的发布网站时,GooglePlay都会扫描应用程序的Manifest文件。它会查找Manifest中的<uses-feature>元素,并且在某些情况下,会把它们跟其他元素组合在一起来评估,如<uses-sdk>和<uses-permission>元素。在建立了应用程序所需的Feature集合之后,GooglePlay会把这个列表做为跟应用程序的.apk和版本相关联的内部元数据保存起来。

当用户使用GooglePlay应用程序查询或浏览应用商店里的应用程序时,服务就会把每个应用程序所需的Feature跟用户设备上可用的Feature进行比较。如果应用程序所需要的所有Feature在设备上都存在,那么GooglePlay就允许用户看到该应用程序,并潜在的可下载它。如果应用所需的任何一个Feature不被设备所支持,GooglePlay就过滤掉该应用程序,这样用户就看不到并且也不能够下载。

因为在<uses-feature>元素中声明的Feature直接影响到GooglePlay如何过滤应用程序,因此理解GooglePlay是如何评估应用程序的Manifest和建立需求Feature的集合是至关重要的,以下章节会详细说明。

基于明确声明Feature的过滤

一个明确声明的Feature就是应用程序声明的一个<uses-feature>元素。Feature声明可以包含一个android:required=["true"| "false"]的属性(如果在APILeve5或以上的版本上编译),这个属性指定了应用程序是否绝对的需要该Feature,如果目标设备上不存在该Feature,该应用程序就不能正常的运行("true"的场合),或指定应用程序偏好该Feature,在Feature有效的时候就使用该它,而在该Feature无效时,应用程序也被设计成也是可以运行的("false"的场合)。

Google Play用以下方法来处理明确声明的Feature:

  • 如果一个Feature被明确声明为必须的,那么GooglePlay就会把该Feature加入到该应用程序所需要的功能列表中。然后把应用程序从没有提供该应用所需Feature的设备中过滤掉。例如:

    <uses-feature android:name="android.hardware.camera" android:required="true" />
  • 如果一个Feature被明确声明为非必须的,GooglePlay就不会把这个的Feature添加到所需的Feature列表中。由于这个原因,明确声明的非必须的Feature,在GooglePlay过滤应用程序时就不会被考虑。即使设备不声明提供该Feature,GooglePlay依然会认为该应用程序与设备是兼容的,并允许显示给用户,除非使用了其他过滤规则。例如:

    <uses-feature android:name="android.hardware.camera" android:required="false" />
  • 如果一个Feature被明确声明,但没有设置android:required属性,那么GooglePlay就会假定该功能是必须的,并且要针对该功能进行过滤。(译者注:缺省是true)

通常,如果应用程序被设计成要运行在Android1.6或更早的版本上,那么在API中android:required属性是无效的,并且GooglePlay会假定<uses-feature>的申明都是必须的。

注意:通过明确声明一个Feature,并且包含android:required=”false”的属性,能够禁止GooglePlay针对该Feature的所有过滤。

基于隐式Feature的过滤

一个隐式的Feature是为了让应用程序正确运行所需的功能,但是,这个Feature并不在申明在Manifest的<uses-feature>元素中。严格来说,每个应用程序都应该始终声明它所使用和需要的所有Feature,因此对于应用程序使用的Feature,却没有声明,应该被认为是一个错误。但是,出于对用户和开发者的保护,GooglePlay会查看每个应用程序的隐式Feature,并基于这些Feature来建立过滤器,就像是对明确声明的Feature所做的处理一样。

应用程序可能需要一个Feature,但却没有声明,这是因为:

  • 应用程序是针对较旧的Android类库版本(Android1.5或更早)来编译的,当时<uses-feature>元素还是无效的;

  • 开发者错误的假定所需要的Feature在所有的设备上都存在,而认为没有必要声明;

  • 开发者不小心忽略的该Feature的声明;

  • 开发者明确的声明了该Feature,但该声明是无效的。例如:<uses-feature>元素名的一个拼写错误或给android:name属性设定一个无法识别的字符串,这些都会导致Feature声明的无效。

To account for the cases above, Google Play attempts to discoveran application's implied feature requirements by examining otherelements declared in the manifest file, specifically,<uses-permission>elements.基于以上原因的考虑,GooglePlay会尝试通过检查Manifest文件中其他元素(特别是<uses-permission>元素)的声明来发现被应用隐式需要的Feature。

如果一个应用程序申请了硬件相关的权限,那么GooglePlay就会假定应用程序要使用底层的硬件Feature,并因此而需要那些Feature,即使可能没有相应的<uses-feature>声明。针对这样的权限申请,GooglePlay也会把底层的硬件Feature添加到它所保持的对应的应用程序的元数据中,并基于这些信息来建立相应的过滤器。

例如,如果应用程序申请了CAMERA权限,但却没有声明一个<uses-feature>元素要求android.hardware.cameraFeature,那么GooglePlay就会认为应用程序需要照相机,并且该应用程序不应该显示给没有提供照相机功能的那些用户设备。

如果不想要GooglePlay基于某个特殊的隐式Feature来过滤应用程序,就要禁止这种行为。通过在<uses-feature>元素中明确的声明Feature,并包含一个android:required="false"属性,可以达到禁止GooglePlay过滤应用程序的目的。例如:要禁止由CAMERA权限所派生出来的过滤,就要像下面这样声明Feature:

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

理解用<uses-permission>元素声明的权限能够直接影响GooglePlay对应用程序的过滤是至关重要的。在下面的权限隐含的Feature需求章节中,列出了所有的隐含的Feature需求的权限集,并因此而引发的过滤处理。

对于蓝牙Feature的特殊处理

当GooglePlay针对蓝牙功能来判断过滤时,它会使用比以上描述稍微不同的规则。

如果应用程序在其清单的一个<uses-permission>元素中声明了一个蓝牙权限,但没有明确的在<uses-feature>>元素中声明蓝牙Feature,那么GooglePlay会检查应用程序被设计成要运行在Android平台的哪个版本上,这个版本是在<uses-sdk>元素中被指定的。

如下表所示,GooglePlay只会在应用程序把Android2.0(APILeve5)或更高的版本作为最低版本或目标平台时,才会启用针对蓝牙功能的过滤。但是,要注意的是,当应用程序在<uses-feature>元素中明确声明了蓝牙Feature时,GooglePlay会使用普通的规则来进行过滤处理。

表1:GooglePlay如何判断申请了蓝牙权限但却没有在<uses-feature>元素中声明蓝牙Feature的应用程序的蓝牙Feature需求的:

如果minSdkVersion

或targetSdkVersion

结果

<=4 (或者uses-sdk没被申明)

<=4

对于任何报告其支持android.hardware.bluetoothFeature的设备,GooglePlay不会把应用程序过滤掉。

<=4

>=5

对于任何不支持android.hardware.bluetooth Feature的设备,GooglePlay都会把该应用程序过滤掉。

>=5

>=5

以下的例子,基于GooglePlay如何处理蓝牙Feature,演示了不同的过滤效果。

第一个例子中,应用程序被设计成要运行在比较旧的APILevel 上并声明了蓝牙权限,但是它没有在其 <uses-feature> 元素中声明蓝牙Feature 。
结果:GooglePlay 不会把该应用程序从任何设备上过滤掉。
<manifest ...>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-sdk android:minSdkVersion="3" />
    ...
</manifest>
第二个例子,相同的应用程序,还声明了一个目标APILevel 是5 的属性。
结果:GooglePlay 会假设应用程序需要蓝牙Feature ,并把应用程序从那些没有报告支持蓝牙功能的设备上过滤掉,包括那些运行较旧平台版本的的设备。
<manifest ...>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" />
    ...
</manifest>
这里,相同的应用程序,但声明的蓝牙Feature 需求。
结果:与第二个例子相同(过滤被应用)。
<manifest ...>
    <uses-feature android:name="android.hardware.bluetooth" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" />
    ...
</manifest>
最后,上面的例子中,相同的应用程序,但添加了 android:required="false" 属性。
结果:GooglePlay 会针对所有设备禁止使用基于蓝牙Feature 支持的过滤。
<manifest ...>
    <uses-feature android:name="android.hardware.bluetooth" android:required="false" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" />
    ...
</manifest>

测试应用程序所需要的Feature

可以使用包含在AndroidSDK中的aapt工具,来判断GooglePlay会怎样过滤自己的应用程序(基于应用声明的Feature和Permission/权限)。用dump badging 命令来运行aapt工具,执行该项测试工作。aapt工具会解析应用程序的Manifest文件,并且使用与GooglPlay相同的规则,来判断应用程序所申请的Feature。

以下是使用这个工具的步骤:

  1. 首先,把应用程序作为一个未签名的..apk来编译并导出。如果使用带有ADT的Eclipse来开发应用程序,那么右击工程,并选择AndroidTools > Export Unsigned ApplicationPackage。选择目标文件名和路径,点击OK按钮。

  2. 接下来,如果在环境变量PATH中没有设置aapt的路径,定位找到它。如果使用的是SDK Toolsr8或更高的版本,那么可以在<SDK>/platform-tools/目录中找到aapt。

    注意:所使用的aapt工具版本必须是提供给最新的可用的平台工具组件。如果没有,使用AndroidSDK Manager 来下载。

  3. 使用以下语法来运行aapt:

$ aapt dump badging <<em>path_to_exported_.apk</em>>

以下例子是针对上面第二个蓝牙的例子的命令输出:

$ ./aapt dump badging BTExample.apk
package: name='com.example.android.btexample' versionCode='' versionName=''
<strong>uses-permission:'android.permission.BLUETOOTH_ADMIN'
uses-feature:'android.hardware.bluetooth'</strong>
sdkVersion:'3'
targetSdkVersion:'5'
application: label='BT Example' icon='res/drawable/app_bt_ex.png'
launchable activity name='com.example.android.btexample.MyActivity'label='' icon=''
uses-feature:'android.hardware.touchscreen'
main
supports-screens: 'small' 'normal' 'large'
locales: '--_--'
densities: '160'

google play获取app的详细信息 源码 程序中取得一些Android应用的信息,Google的Android Market公布了api,可以取得Android Market上的Android应用的包括名字、作者、应用的描述、评论、图标与软件截图等信息。 基于Google Protocol Buffers 议实现 立即下载

相关推荐

google play - uber英文评论-语料

2016.3.30 - 2016.5.17 google play上 uber下的英文评论 约 2W条 例子: DATE:March 30, 2016 REVB: Fast, reliable, safe and friendly service. Affordable to boot. MARK:5

为您的应用配置 Play Feature Delivery

这是一个新的系列文章,我们称之为 "Modern Android Development 技巧",简称为 "MAD Skills"。本系列文章致力于帮助开发...

Android开发者 801

facebook 评论数据 语料 google play 爬虫抓取

爬虫抓取2016.3-2016.4 google play上facebook的英文评论(有少部分西语没有处理)共计10W条

探索 Google Play 应用商店的宝藏:Google Play Crawler

探索 Google Play 应用商店的宝藏:Google Play Crawler google-play-crawler Play with Google Play API :) 项目地址: https://gitcode.com/gh_mirrors/go/...

gitblog_00021的博客 714

googleplayspider:Google Play的抓取工具,可下载包含其他信息的所有应用

Google-PlaySpider Tool The documentation and introduction could be reachable at . Google Play爬虫工具 本工具的介绍和文档可以在 中获得。 Last Update (22/Jun/2018) Recently, we update this tool, since Google changes the class names used in Google Play site. We will keep upgrading this tool once Google makes changes on Google Play site. Contact

msf使用木马控制android手机

使用msfvenom生成木马控制手机

my_name_is_sy的博客 3521

Python爬虫常用:谷歌浏览器驱动—

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。放在项目文件夹的话,便捷一点。选择icons/以上的版本,越靠近icons/的版本越新。最近我才对这些路线做了一下新的更新,知识体系更全面了。

2401_83974173的博客 1489

深入了解torch框架

大国的游戏,政府支持到位,是未来;AI : Artificial Intelligence,旨在研究、开发能够模拟、延伸和扩展人类智能的理论、方法、技术及应用系统,是一种拥有自主学习和推理能力的技术。它模仿人类大脑某些功能,包括感知、学习、理解、决策和问题解决。AI本质​ NLP(说话,听)、CV(眼睛)、自动驾驶、机器人(肢体动作)、大模型三要素:数据、网络、算力① 神经网络:找到合适的数学公式;② 训练:用已有数据训练网络,目标是求最优解;③ 推理:用模型预测新样本;PyTorch,简称Torch

qq_74732076的博客 1135

Google Play和基于Feature的过滤 —— Feature 参考手册

翻译自 Features Reference 下表列出了软/硬件Feature和权限的参考信息,它们被用于GooglePlay。 硬件feature 下面列出了被大多数当前发布的平台所支持的硬件功能描述。为了标明应用程序所使用或需要的某个硬件Feature,都要在一个独立的&lt;uses-feature&gt;元素的android:name属性中声明。 Feat...

weixin_34096182的博客 120

IEEE Transactions模板中参考文献作者缩写、期刊名缩写

本文章记录如何在IEEE Transactions的模板中,解决参考文献的作者缩写、期刊名字缩写的问题。

weixin_43981621的博客 1万+

DeepSeek-OCR又更新:一起看下OCR1和OCR2

DeepSeek-AI 最近又又开源了,这次是DeepSeek-OCR2,结合之前发布的DeepSeek-OCR ,可以发现DeepSeek走出了一条不同于主流 OCR 方案的技术路线。第一代模型探索了**“视觉作为文本压缩介质”的可行性,打破了传统的序列长度限制;第二代模型则通过“Visual Causal Flow(视觉因果流)”**架构,将因果推理引入视觉编码器,解决了复杂排版下的阅读顺序难题。本文将从架构设计、逻辑结构、训练范式及工程实现四个维度,深度剖析这两代模型的异同与创新。

kakaZhui的博客 622

Google Play Store过滤规则

Google 文档连接:https://developer.android.google.cn/google/play/filters?hl=en 一、Google Play上的过滤器工作方式 Google Play 使用下述过滤限制来确定是否向正在 Google Play 应用中浏览或搜索应用的用户显示您的应用。 在确定是否显示您的应用时,Google Play 会检查设备的硬件和软件要求及其运...

m0_46211029的博客 2475

qt实现OCC读取STEP模型并显示(附完整源码)

qt实现OCC读取STEP模型并显示(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1480

Android APP在Google play中搜索不到或显示不兼容

##原因 Google play根据AndroidManifest.xml文件中的设置自动过滤掉一些不支持的机型 屏蔽依据uses-feature(硬件需求) 或者 uses-permission(权限需求) ##现象 有些机型被屏蔽是因为在manifest.xml文件中设置了uses-feature(硬件检测) 有些APP并没有uses-feature(

u011411094的专栏 3995

Office系列完全干净卸载工具合集(最全)

使用 Microsoft Fix it 卸载 Microsoft Office 套件 一、Windows 7、Windows Vista或Windows XP下卸载Office 1.MicrosoftEasyFix50416 工具用来卸载office 2003 MicrosoftEasyFix50416_Office2003.msi 2.MicrosoftEasyFix50154 工具用来卸载office 2007 MicrosoftEasyFix50154_Office2007.msi 3.Microso

业精于勤,荒于嬉 3万+

手把手教你学 NPU 驱动开发--第一部分:基础准备 开发环境搭建:Linux 内核编译与 NPU 仿真平台配置

摘要:本文详细介绍了搭建Linux内核编译与NPU仿真平台的完整流程。主要内容包括:1) 准备ARM64交叉编译工具链;2) 编译支持KGDB调试的Linux内核;3) 构建最小根文件系统;4) 使用QEMU模拟自定义NPU设备;5) 配置KGDB调试环境。文章重点讲解了如何通过修改设备树添加虚拟NPU设备,并提供了开源NPUIP Gemmini作为实验对象。最后展示了简单的"Hello NPU"驱动验证方法,为后续NPU驱动开发奠定了基础。文中还附有常用命令速查表,方便开发者快速搭建调

MHD0815的博客 382

Android开发-API指南-<uses-feature>(1)

Android开发-API指南- 英文原文:http://developer.android.com/guide/topics/manifest/uses-feature-element.html 语法: uses-feature android:name="string" android:required=["true" | "false

小点滴 2028

uniapp - 实现免费OCR文字识别方案,用户上传图片后进行扫描识别获取图片上的文字,uniApp纯前端做图片OCR识别——无需服务器进行OCR识别插件(不需要依赖任何SDK或第三方API服务)

uniapp实现orc识别免费的插件识别不花钱,无需第三方OCR文字识别API,uniApp拍照或者选择图片免费识别,纯前端不需要服务器,Uniapp提取图片上的文字,本地ocr识别技术,uni-app图片OCR识别文本,uniapp有没有免费的ocr识别组件,uniapp前端实现文字识别,身份证识别,营业执照识别 (兼容APP、H5、小程序 不需要任何SDK)跨端无SDK方案:Uniapp实现OCR文字,离线OCR识别,uniapp tesseract.js实现文字识别,uniapp文字识别无需依赖sdk

🏆 前端领域优质创作者 4249

<uses-feature>

http://write.blog.youkuaiyun.com/postedit

Felblade 847

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Google play中“此应用与您设备不兼容”的问题

经历重重困难,终于把应用上架到Google play ,上架是成功了,但是市场同事反馈说海外用户搜索不到应用,换手机后还是搜索不到,于是开始查找原因。经了解,发现是Manifest 中申请的权限如果与硬件相关,google就会把不支持该硬件的设备全部过滤,这些设备上的google play 无法搜索到我们应用。 比如,应用中申请了android.permission.CAMERA权限,如果用户设备不支持camera的相关功能,这个设备的 google play中就搜不到我们这个应用。 找到问题原因 那么究

weixin_44429934的博客 4万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: android--keystore介绍
下一篇: Google Play和基于Feature的过滤 —— Feature 参考手册
cbbbc
博客等级 码龄15年 609粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值