2014-02-09 20 views
1

我知道appcompat库为在早期版本的Android下运行的应用程序提供了额外的功能,而不是应用程序的目标级别。我的问题是,如果我在设备上检测到早期版本的Android,如果我从未调用任何方法,那么是否需要包含appcompat库。换句话说,appcompat库是否具有较晚类的存根以防止Dalvik动态类加载器崩溃,或者如果类未被动态引用则不需要那些类?如果从未使用其功能,是否需要appcompat?

// Will Android/Dalvik barf if this class is loaded on a pre-Honeycomb device? 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {   
    ActionBar actionBar = getActionBar(); 
} 
+1

如果您尝试加载不存在的类,它会崩溃。兼容性库没有存根。他们定义了新的版本'android.support.v7.app.ActionBar'与'android.app.ActionBar',可能在内部重定向到本地实现,如果有这样的事情。 – zapl

+0

@zapl,谢谢。只有动态引用的类才会被加载,而不是如果类文件包含的引用永远不会被执行? –

+2

类加载在需要时发生,例如你访问一个类的静态字段/常量/方法或者创建一个实例。例如,在http://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom中使用(ab) – zapl

回答

2

我的问题是我是否需要包括程序兼容性库,如果我从来没有调用它的任何方法,如果我检测设备在Android的早期版本。

不,那你就不会需要吧。 appcompat库不仅仅是ActionBar的后端端口。它还包括一些小于Gingerbread的新平台的修补程序。 Here就是一个例子。正如你所看到的,对于Appcompat ActionBar,有HC,ICSGB的ActionBar的实现,所有这些都来自基础实现。但是一般来说,如果您在早期版本中不使用ActionBar,则不需要它。 ActionBar已经足够稳定,用于更高版本的appcompat库所做的修复并不十分重要。

如果你在Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB中包装了某些东西,那么它肯定不会在早于HoneyComb的版本中被调用,所以不可以,你可以继续为API做这件事,以后推出而不会崩溃早期版本。

相关问题