已解决(转)关于android - apk(解析错误)解析程序包时出现问题
如果开发的应用用户较多,那么必须保证应用在多个版本不同的设备上能够正确的运行。这就要求对各个版本比较熟悉,知道在什么版本中加入了什么新的功能或特性。但是Android的版本太多了,是个令人头疼的问题。如果想了解Android的版本差异,建议读一下Android开发者文档上相关的章节。
为了让你的应用程序指定可以运行的版本,Android的manifest文件中提供了<uses-sdk>标签。该标签中有三个属性,分别是minSdkVersion,targetSdkVersion,maxSdkVersion。这三个属性比较容易让人迷惑,我也是仔细读了谷歌的官方文档,才弄清楚这三个属性的意义。此外,在项目构建时,还有个概念叫build target,在本文中也会进行分析。
什么是API level
其实标签<uses-sdk>中指定的并不是我们使用的sdk的版本,也不是Android系统的版本,而是我们使用的Android平台的版本,即API level。API level是一个整数,它指的是我们使用的框架(Framework)的版本,也就是我们使用的sdk中的各个平台下的android.jar。但是这个API level又和Android系统的版本有着对应关系,并且每个系统都会在内部记录它所使用的API level。举例来说,我使用的手机系统是Android 2.3.3, 那么它就会在内部记录使用的API level为10。这个内部的API level可以让系统判定能不能安装一款app,这个问题会在下文中提及。
下面给出android系统版本,API level和版本代号之间的对应关系表。(该表来自谷歌官方文档:http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#provisional)
由上表可以看出,android的系统版本和API level之间并不是一一对应的,比如Android 2.3, Android 2.3.1, Android 2.3.2对应API level 9, 而Android 2.3.3, Android 2.3.4对应API level 10。API level是Android向开发者提供的一套Framework(android.jar)的代号,可能发布了新的系统版本,但是这一套接口并没有变化,所以就不必提供新的Framework开发包,所以API level也不必改变。由此可知Android系统版本和API level是多对一的关系。由于API level就是发布的android.jar(一套接口)的代号,所以API level和sdk中platforms目录中的各个android.jar是一一对应的。说白了,Android系统版本是给Android用户看的,而API level是给应用程序开发者看的。
什么是build target
每当修改了build target,就会将另一个android.jar加入到build path中替换原来的jar。将build target改成android-17后的效果如下图:
如果将build target 改成android-8,那么就会使用sdk中android-8下的android.jar编译项目,如果在Activity中调用ActionBar相关的Api,那么就会报错,因为ActionBar相关的Api是在API level 11中才加进来的。
一般情况下,应该使用最新的API level作为build target。这也是eclipse生成项目时的默认行为。
android:minSdkVersion
提示手机API level的版本太低,安装失败。
如果没有设置minSdkVersion这个属性,那么默认是1。表明程序兼容所有的Android系统,能够在所有Android系统上运行。如果使用了高于API level 1 的API, 如ActionBar。那么在构建项目时,会提示和上面相同的错误,项目构建失败。
android:targetSdkVersion
标明应用程序目标API Level的一个整数。如果不设置,默认值和minSdkVersion相同。
这个属性通知系统,你已经针对这个指定的目标版本测试过你的程序,系统不必再使用兼容模式来让你的应用程序向前兼容这个目标版本。应用程序仍然能在低于targetSdkVersion的系统上运行。
由于Android不断向着更新的版本进化,一些行为甚至是外观可能会改变。然而,如果平台的API Level高于你的应用程序中的targetSdkVersion属性指定的值,系统会开启兼容行为来确保你的应用程序继续以期望的形式来运行。你可以通过指定targetSdkVersion来匹配运行程序的平台的 API level来禁用这种兼容性行为。举例来说,设置这个值为11或更高,当你的应用运行在Android3.0或更高的系统上时,系统会为你的应用使用新的默认主题(Holo主题),并且当运行在大屏幕的设备上时会禁用屏幕兼容模式(screen compatibility mode),因为支持了 API level 11就暗示了支持大屏幕。
根据你设置的targetSdkVersion 的值,系统会执行很多兼容行为。一些行为在对应平台版本的Build.VERSION_CODES中有讨论。
为了让你的应用程序支持每个Android版本,你应当提高targetSdkVersion的值到最新的API level,然后在对应的平台上彻底的测试你的应用。
从上面的论述可知,targetSdkVersion这个属性是在程序运行时期起作用的,系统根据这个属性决定要不要以兼容模式运行这个程序。
一般情况下,应该将这个属性的值设置为最新的API level 值,这样的话可以利用新版本系统上的新特性。eclipse在生成项目时,默认将该值设置为最高,如果设置一个较低的值,会给出一个警告,如下图所示。
这个警告的意思是没有将targetSdkVersion的值设置为最高值,较新的系统会以兼容模式运行该程序。请考虑在新版本系统上测试程序并将targetSdkVersion设置为最新。更详细的信息请参考android.os.Build.VERSION_CODES 。
android:maxSdkVersion
在Android1.5, 1.6, 2.0 和2.0.1,在安装应用或系统升级时,系统会检查这个值。在这两种情况下,如果应用设置的maxSdkVersion 值低于系统本身使用的API Level,系统将不会允许安装该应用。在系统升级后,新系统会重新校验这个值,如果新系统的API Level高于这个值,新系统会删除你的应用。
在高于2.0.1的系统上,安装应用时不会再检验应用中设置的maxSdkVersion值,在系统升级后也不会重新校验这个值。但是在向用户展示可用的应用时,Google Play会继续使用这个属性进行过滤。
经过测试,将maxSdkVersion的值设置成9,程序是可以安装在4.2的手机上的。说明这个值已经不再起作用。
- <uses-sdk
- droid:minSdkVersion="8"
- android:targetSdkVersion="19"
- android:maxSdkVersion="9"/>
原文参考: http://blog.csdn.net/zhangjg_blog/article/details/17142395
已解决(转)关于android - apk(解析错误)解析程序包时出现问题相关推荐
- 解决java编译错误(程序包javax.servlet不存在javax.servlet.*)
解决java编译错误(程序包javax.servlet不存在javax.servlet.*) 两种解决方法 第一种: 1.在电脑搜索servlet-api.jar 一般在apache-tomcat-8 ...
- 【ROS系统】解决找不到用户工作空间下的程序包的问题——E:No such package
[ROS系统]解决找不到用户工作空间下的程序包的问题--E:No such package 参考文章: (1)[ROS系统]解决找不到用户工作空间下的程序包的问题--E:No such package ...
- 卷影复制服务错误: 调用程序 CoCreateInstance 时的意外错误。hr = 0x8007045b, 系统正在关机。
服务器有时自动重启: 卷影复制服务错误: 调用程序 CoCreateInstance 时的意外错误.hr = 0x8007045b, 系统正在关机. 在服务中是:Volume Shadow Copy和 ...
- R包安装时安装程序包****时退出的状态不是0,或者版本不适的一种解决方法。
Bioconductor中包几乎都是安装下面代码安装.比如:miRBaseVersions.db包 if (!requireNamespace("BiocManager", qui ...
- Android解析错误 解析软件包错误
在真机测试的时候可能大家会遇到安装手机上,然后出现安装包解析错误,解析错误,我之前安装的时候没事,但是有些权限可能需要系统授权,这是最好的解决的办法就是 第一步: 在setting 里面直接搜索 意 ...
- Unity3D 解决 “SpeedTree materials need to be regenerated.” 导入资源包时出现的错误
我的Unity版本:2019.3.2f1 在导入标准资源包时出现了以下错误: 解决办法:去Unity的Asset Store下载标准资源包即可,其他地方下载的版本可能是不兼容. 我的标准资源包是一个群 ...
- 无法卸载office2003的解决方法:出现“无法打开此修补程序包”错误
大家可能在卸载office2003会出现"无法打开此修补程序包"错误,重新安装仍出现"无法打开此修补程序包"错误. 其实这是由于office2003自动更新文件 ...
- java运行库未能修复,如何修复Microsoft Visual Studio错误:“程序包未正确加载”?...
回答(21) 2 years ago 我开始在一个全新的Windows和安装了Update 2的Visual Studio 2013 Ultimate上看到这个(虽然其他人也在更新3和4以及专业版上报 ...
- R语言:关于“安装程序包****时退出的状态不是0”的解决方法01
第一次在CSND写推文,也是第一次使用网页版的Markdown编辑器. 之前每次写代码的时候总是出现些小问题,百度也搜不到(或许是我不太会搜索),上了qq群问了大佬才慢慢得到一些答案,把问题记录下来, ...
最新文章
- 从传感器到算法原理,机器人、视觉避障尽在此文
- 嵌入式linux dhcp移植,嵌入式linux中的dhcp服务器
- javascript笔记——点击按钮(或超链接)如何跳转到另外一个页面并执行目标页面的js函数...
- 如何使用定时器settimeout、setInterval执行能传递参数的函数(转)
- 知物由学 | 未来安全隐患:AI的软肋——故意欺骗神经网络
- 吴恩达机器学习(第三章)——线性代数回顾
- c语言读取acc文件的采样率,C语言文件操作:打开检查文件指针访问模式
- 安全运维 - Windows系统攻击回溯
- lua学习 第二章数据与标准库
- SONiC testbed
- Windows中如何对电脑硬盘进行分区
- 开源项目9GAG源码解析与Material改造(三)
- AndroMDA Getting started(七)
- word中硬回车(enter)与软回车(shift+enter)
- 电脑加一个固态硬盘,如何修改电脑的启动项。
- hdu1296多项式
- java制作摄影建模,照片建模的拍摄要求
- 计算机毕业设计Java乒乓球俱乐部管理(源码+系统+mysql数据库+lw文档)
- 一张表告诉你木兰宽松许可证第二版(MulanPSL v2)与业界主流许可证的主要异同...
- 波特、码元与比特的关系