Android工程中compileSdkVersion、minSdkVersion、targetSdkVersion区别

一、mips、armeabi、armeabi-v7a和x86说明

        在Android日常的开发过程中有的项目需要引入第三方的库,有时候会在jniLibs文件夹下看到mips、armeabi、armeabi-v7a和x86类似的文件夹。这些文件夹下面存放的用C编译的本地库文件(各类.so文件),一些重要的加密算法或者核心协议一般都用c写然后给java调用,这样可以避免反编译后查看到应用的源码。不同文件夹是为了兼容不同Android手机CPU架构。

        早期的Android系统几乎只支持ARMv5的CPU架构,到现在为止Android系统可以支持以下七种不同的CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起),每一种都关联着一个相应的ABI(应用程序二进制接口)。 

        ABI定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。在Android 系统上,每一个CPU架构对应一个ABI:armeabi,armeabi-v7a,x86,mips,arm64- v8a,mips64,x86_64。

        Android L开始才真正支持32位和64位的ART虚拟机,配合上64位处理器,名正言顺的运行64位软件。但是问题又来了,没有软件商愿意开发64位程序。 ARMv8是一套不错的指令集,它既支持未来的64位程序,也向下兼容现有32位程序。有了ARMv8的支撑,以后的64位手机操作系统,如Android L 64bit都可以简单、高效地支持现有的32位App,你不用担心兼容性问题。

特别说明:

        1)放置.so文件的正确姿势其实就两句话:为了减小apk体积,只保留armeabi 和armeabi-v7a两个文件夹,并保证这两个文件夹中.so数量一致对只提供 armeabi 版本的第三方.so,原样复制一份到armeabi-v7a文件夹。

        2)手机芯片厂家:高通骁龙、华为海思麒麟、联发科、三星猎户座。

        3)芯片架构:ARM、MIPS、X86(AMD、Intel架构设计)。

二、compileSdkVersion、minSdkVersion、targetSdkVersion区别

Android API level是一个整数,它指的是我们使用的框架(Framework)的版本,也就是我们使用的sdk中的各个平台下的android.jar。但是这个API level又和Android系统的版本有着对应关系,并且每个系统都会在内部记录它所使用的API level。

1)compileSdkVersion

作用:用哪个Android SDK版本编译你的应用。强烈推荐总是使用最新的 SDK 进行编译(默认就是最新的)。修改compileSdkVersion不会改变运行时的行为,当你修改了 compileSdkVersion 的时候,可能会出现新的编译警告、编译错误。

注意:如果使用 Support Library ,那么使用最新发布的 Support Library 就需要使用最新的 SDK 编译。

2)minSdkVersion

指明应用程序运行所需的最小API level。如果不指明的话,默认是1。也就是说该应用兼容所有的android版本。我们应该总是声明这个属性。如果系统的API level低于android:minSdkVersion设定的值,那么android系统会阻止用户安装这个应用。如果指明了这个属性,并且在项目中使用了高于这个API level的特有方法, 那么会在编译时报错。

请记住:你所使用的库,如Support Library或Google Play services,可能有他们自己的minSdkVersion。你的应用设置的minSdkVersion必需大于等于这些库的 minSdkVersion。

3)targetSdkVersion

targetSdkVersion是Android提供向前兼容的主要依据,将target更新为最新的 SDK 是所有应用都应该优先处理的事情。但这不意味着你一定要使用所有新引入的功能,也不意味着你可以不做任何测试就盲目地更新targetSdkVersion,请一定在更新targetSdkVersion之前做测试!

如果平台的API Level高于你的应用程序中的targetSdkVersion属性指定的值,系统会开启兼容行为来确保你的应用程序继续以期望的形式来运行。你可以通过指定targetSdkVersion来匹配运行程序的平台的API level来禁用这种兼容性行为。举例来说,设置这个值为11或更高,当你的应用运行在Android3.0或更高的系统上时,系统会为你的应用使用新的默认主题(Holo主题),并且当运行在大屏幕的设备上时会禁用屏幕兼容模式(screen compatibility mode),因为支持了 API level 11就暗示了支持大屏幕。

4)Android 高版本API方法在低版本系统上的兼容性处理

1.使用@TargeApi($API_LEVEL)可以编译通过,不建议使用@SuppressLint("NewApi");

两者区别:

@SuppressLint("NewApi")屏蔽一切新api中才能使用的方法报的android lint错误。@TargetApi() 只屏蔽某一新api中才能使用的方法报的android lint错误。

举个例子进行说明,某个方法中使用了API9新加入的方法,而项目设置的最小API Level为android:minSdkVersion=8,此时在方法上加@SuppressLint("NewApi")和@TargetApi(Build.VERSION_CODES.GINGERBREAD)都可以,以上是通用的情况。而当你在此方法中又引用了一个API11才加入的方法时,@TargetApi(Build.VERSION_CODES.GINGERBREAD)注解的方法又报错了,而@SuppressLint("NewApi")不会报错,这就是区别。

2.判断运行时版本,在低版本系统不调用此方法,同时为了保证功能的完整性,需要提供低版本功能实现。

三、px、dp和sp

px和dp换算公式:px=dp*(dpi/160)
dp控件宽高、边距大小。
sp 指定字体大小,当用户修改显示字体时,sp随之修改。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值