我的应用依赖于操作栏的 Android 支持库 V7 AppCompat(支持存储库版本 2)。Eclipse 中的该库项目在其 libs/ 目录中包含 Android Support Library V4(版本 18)作为依赖项。我的应用程序的项目文件夹不包含 libs/ 中的支持库,大概是依靠 AppCompat 来导出的。在大多数情况下,我的抽屉式导航代码类似于标准示例。
在 Android 4+ 上一切正常,但在 Android 2 设备(Gingerbread 模拟器和 DROID 2)上,活动开始时我得到一个 VerifyError:
08-18 23:50:06.538: E/AndroidRuntime(6232): java.lang.VerifyError: com.myapp.activities.MainActivity$2
08-18 23:50:06.538: E/AndroidRuntime(6232): at com.myapp.activities.MainActivity.onCreate(MainActivity.java:76)
08-18 23:50:06.538: E/AndroidRuntime(6232): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
...
事实证明,当我调用 ActionBarDrawerToggle 的构造函数时发生了崩溃。
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarActivity;
public class MainActivity extends ActionBarActivity {
private DrawerLayout drawerLayout;
private ActionBarDrawerToggle drawerToggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
drawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);
drawerView = (ListView)findViewById(R.id.left_drawer);
drawerView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView parent, View view, int position, long id) {
selectItem(position);
}
});
drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {
public void onDrawerClosed(View view) {
invalidateOptionsMenu();
}
public void onDrawerOpened(View drawerView) {
invalidateOptionsMenu();
}
};
drawerLayout.setDrawerListener(drawerToggle);
...
}
请注意,先前对强制转换 DrawerLayout 的调用不会导致 VerifyError。
ADT 22,目标 API 17,最小 API 7。不使用 Proguard,我的 project.properties 很简单:
target=android-17
android.library.reference.1=../libraries/appcompat
我确实在我的构建路径上(在项目和 AppCompat 库项目中)将 Android Private Libraries 标记为导出条目,这似乎排除了支持库导致 VerifyError 的最常见原因之一。