compileSdkVersion
指定apk编译时的用的哪个 Android SDK 版本, compileSdkVersion 不会改变apk运行时的行为,不会被编译到 APK 中:它只是在编译的时候使用。
minSdkVersion
apk只能运行在版本>=minSdkVersion的Android手机上,其中v4和v7包的 minSdkVersion 分别是 4和7 ,也就是说v4包只能在API 4以上的手机上才能运行,所以你的应用的minSdkVersion要>=4
targetSdkVersion
targetSdkVersion 是 Android 提供向前兼容的主要依据(md,什么意思啊),先看代码理解一下吧,源码来自AlarmManager.java,compileSdkVersion = 23
private final boolean mAlwaysExact;
private final int mTargetSdkVersion;
/**
* package private on purpose
*/
AlarmManager(IAlarmManager service, Context ctx) {
mService = service;
mTargetSdkVersion = ctx.getApplicationInfo().targetSdkVersion;
mAlwaysExact = (mTargetSdkVersion < Build.VERSION_CODES.KITKAT);
}
private long legacyExactLength() {
return (mAlwaysExact ? WINDOW_EXACT : WINDOW_HEURISTIC);
}
...
public void set(int type, long triggerAtMillis, PendingIntent operation) {
setImpl(type, triggerAtMillis, legacyExactLength(), 0, 0, operation, null, null);
}
private void setImpl(int type, long triggerAtMillis, long windowMillis, long intervalMillis,
int flags, PendingIntent operation, WorkSource workSource, AlarmClockInfo alarmClock) {
if (triggerAtMillis < 0) {
/* NOTYET
if (mAlwaysExact) {
// Fatal error for KLP+ apps to use negative trigger times
throw new IllegalArgumentException("Invalid alarm trigger time "
+ triggerAtMillis);
}
*/
triggerAtMillis = 0;
}
try {
mService.set(type, triggerAtMillis, windowMillis, intervalMillis, flags, operation,
workSource, alarmClock);
} catch (RemoteException ex) {
}
}
代码中可以看出当targetSdkVersion小于19时windowMillis = WINDOW_EXACT, 而大于等于19时windowMillis = WINDOW_HEURISTIC。也就是说当targetSdkVersion<19的时候,及时手机android版本>19,也不会运行最新的api。
即在应用的 targetSdkVersion 没有更新之前系统不会应用最新的行为变化
这里再多说一嘴,都知道android6.0后,是运行时权限,但是想要实现运行时权限需要满足下面两个条件:
android版本6.0以上的手机
targetSdkVersion更新到23以上
support 路径以及版本号:
D:\AppData\Local\Android\sdk\extras\android\m2repository\com\android\support