• compileSdkVersion, minSdkVersion 和 targetSdkVersion详解


    API level

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

    compileSdkVersion(Eclipse中叫做build target)

    1.在eclipse中位于项目根目录中的project.properties文件中
    2.在studio中位于项目中的build.gradle中
    作用:用哪个 Android SDK 版本编译你的应用
    强烈推荐总是使用最新的 SDK 进行编译(默认就是最新的)
    修改 compileSdkVersion 不会改变运行时的行为。当你修改了 compileSdkVersion 的时候,可能会出现新的编译警告、编译错误,
    但新的 compileSdkVersion 不会被包含到 APK 中:它纯粹只是在编译的时候使用。
    注意:如果使用 Support Library ,那么使用最新发布的 Support Library 就需要使用最新的 SDK 编译。
    

    minSdkVersion

    指明应用程序运行所需的最小API level。如果不指明的话,默认是1。也就是说该应用兼容所有的android版本。我们应该总是声明这个属性。
    如果系统的API level低于android:minSdkVersion设定的值,那么android系统会阻止用户安装这个应用
    如果指明了这个属性,并且在项目中使用了高于这个API level的API, 那么会在编译时报错。(下面会讲解解决方法)
    请记住:你所使用的库,如 Support Library 或 Google Play services,可能有他们自己的 minSdkVersion 。你的应用设置的 
    minSdkVersion 必需大于等于这些库的 minSdkVersion 。
    

    targetSdkVersion

    targetSdkVersion 是 Android 提供向前兼容的主要依据
    将 target 更新为最新的 SDK 是所有应用都应该优先处理的事情。但这不意味着你一定要使用所有新引入的功能,也不意味着你可以不
    做任何测试就盲目地更新 targetSdkVersion ,请一定在更新 targetSdkVersion 之前做测试!
    如果平台的API Level高于你的应用程序中的targetSdkVersion属性指定的值,系统会开启兼容行为来确保你的应用程序继续以期望的
    形式来运行。你可以通过指定targetSdkVersion来匹配运行程序的平台的 API level来禁用这种兼容性行为。举例来说,设置这个值为11
    或更高,当你的应用运行在Android3.0或更高的系统上时,系统会为你的应用使用新的默认主题(Holo主题),并且当运行在大屏幕的设
    备上时会禁用屏幕兼容模式(screen compatibility mode),因为支持了 API level 11就暗示了支持大屏幕。
    

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

    1.用@TargeApi($API_LEVEL) 使可以编译通过, 不建议使用@SuppressLint("NewApi");
    区别:
    @SuppressLint("NewApi")屏蔽一切新api中才能使用的方法报的android lint错误
    @TargetApi() 只屏蔽某一新api中才能使用的方法报的android lint错误
    举个例子,某个方法中使用了api9新加入的方法,而项目设置的android:minSdkVersion=8,此时在方法上加@SuppressLint("NewApi")
    和@TargetApi(Build.VERSION_CODES.GINGERBREAD)都可以,以上是通用的情况。
    而当你在此方法中又引用了一个api11才加入的方法时,@TargetApi(Build.VERSION_CODES.GINGERBREAD)注解的方法又报错了,而
    @SuppressLint("NewApi")不会报错,这就是区别。
    2.判断运行时版本,在低版本系统不调用此方法,同时为了保证功能的完整性,需要提供低版本功能实现
    例如:
    public class MainActivity extends AppCompatActivity {
       private  AlertDialog.Builder builder;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //如果API level大于11 大于11的时候能够指定主体
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
                 builder = new AlertDialog.Builder(this,
                        AlertDialog.THEME_HOLO_LIGHT);
    
            }else {
                 builder = new AlertDialog.Builder(this);
    
            }
            builder.setItems(new String[] { "拍照","选择" },
                    new DialogInterface.OnClickListener() {
    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
    
                        }
                    });
            builder.setTitle("选择照片");
            builder.create().show();
        }
    }
     
  • 相关阅读:
    执行sudo命令时command not found的解决办法
    CentOS7编译安装libc++和libc++abi
    CentOS 7 编译安装clang+llvm
    如何使用 Issue 管理软件项目?
    西门子 S7-300 PLC 从入门到精通的100个经典问题
    PLC_SIM 出现I/O访问错误-技术论坛-工业支持中心-西门子中国
    C# Lambda表达式
    C# Task中的Func, Action, Async与Await的使用
    C#委托的介绍(delegate、Action、Func、predicate)
    委托 你怎么看?
  • 原文地址:https://www.cnblogs.com/jiangzhaowei/p/8206697.html
Copyright © 2020-2023  润新知