我不记得我更新了什么(可能是一些Android ADK项目),但突然间我经常在Eclipse中遇到"发生问题"文本框.它说:
"运行Android Lint"遇到了问题.失败
还有一个OK和一个Details按钮.当我点击详细信息时,我得到:
java.lang.NullPointerException失败
从文本框中,我无法分辨出失败的原因......听起来像Lint本身的运行失败了,并且从NPE失败了.在任何地方都没有与任何代码关联的行号,所以我认为这不是来自我的代码.
我已经尝试禁用运行Lint以及其他所有内容...但是单击"运行Android Lint"的复选框只会导致Lint运行,从而给出消息框警告.它似乎确实在运行,因为底部会出现几个Lint警告.但它似乎仍然告诉我Lint本身正在拥有NPE ......而且我已经知道在哪里解决这个问题.
我在Windows Home Premium 64位中运行Eclipse SDK 3.7.2,使用JDK 6(最近卸载了JDK 7并安装了6个.)
我正在开发一个设备驱动程序模块和相关的用户库来处理ioctl()调用.该库获取相关信息并将其放入一个结构中,该结构被传递到驱动程序模块并在那里解压缩然后处理(我省略了很多步骤,但这是整体想法).
通过ioctl()通过结构传递的一些数据是uint32_t类型.我发现该类型是在stdint.h和linux/types.h中定义的.到目前为止,我一直在使用linux/types.h来定义该值,包括在用户库中.但我理解在用户空间中使用linux/*.h库是不好的形式,所以如果我删除它们而不是使用stdint.h,那么当我的驱动程序模块包含struct定义时,它必须包含stdint.h也.
在我看来,linux/types.h的意思是在内核文件中定义类型,所以我不确定这是否意味着使用stdint.h是不好的主意.我还发现,当我在我的驱动程序模块中使用stdint.h时,我得到了关于重新定义的编译错误,即使我用stdint.h替换linux/types.h的所有实例(并把它放在上面)也不会消失包含订单的顶部).
洙....
谢谢.
我每隔2分钟设置一次警报来运行服务.我也在别处检查,看看当前是否设置了警报.但是,我对警报的检查总是返回false(它没有设置),但是如果我在服务中放置一个断点,当然,在2分钟内,它会命中它.所以,警报设置,但我不知道.
这是我用来设置闹钟的代码:
public void setWakeUpFromNow(long millisecFromNow) {
Intent i = new Intent(mContext, OnWakeUpReceiver.class);
PendingIntent pIntent = PendingIntent.getBroadcast(mContext, 0, i, PendingIntent.FLAG_ONE_SHOT);
Calendar now = Calendar.getInstance();
mAlarmManager.set(AlarmManager.RTC_WAKEUP, now.getTimeInMillis() + millisecFromNow, pIntent);
}
Run Code Online (Sandbox Code Playgroud)
这是我检查它是否设置的地方
public boolean isWakeUpSet() {
Intent i = new Intent(mContext, OnWakeUpReceiver.class);
PendingIntent pIntent = PendingIntent.getBroadcast(mContext, 0, i, PendingIntent.FLAG_NO_CREATE);
return pIntent != null;
}
Run Code Online (Sandbox Code Playgroud)
isWakeUpSet总是返回false,即使OnWakeUpReceiver后来被唤醒了.
我的应用程序使用闹钟定时器每2分钟左右检查服务器上的更新.我使用这个创建一个定期计时器:
alarmIntent = new Intent(context, OnWakeUpReceiver.class);
PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);
mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 120000, pIntent);
Run Code Online (Sandbox Code Playgroud)
对于绝大多数人来说,这很好用.但是有少数人报告该应用程序突然停止更新.我进行了一个简单的检查,看看计时器是否存在:
PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, PendingIntent.FLAG_NO_CREATE);
Run Code Online (Sandbox Code Playgroud)
当然,当应用程序不再更新时,返回null,表示没有计时器仍然存在.
我的应用程序一直在控制闹钟定时器(当没有网络连接时将其关闭,然后在有其他情况时将其重新打开).我想也许我在某种程度上把它关掉而不是把它重新打开.所以我创建了一个版本,我删除了每个调用以取消闹钟定时器.所以我的应用程序不再有任何取消该计时器的方法.但仅仅几天后,警报计时器再次出现,应用程序没有更新.
我无法在我自己的系统上实现这一点,或者让某人找到一种万无一失的方式在他们的系统上重复它.我想知道Android系统是否可能取消它(虽然这会阻止我的应用程序再次运行),但在一个更多的问题系统上,他说他几乎没有任何东西在手机上运行.
我不知道任务杀手是否也会杀死闹钟定时器,但是我知道在我认为SDK 8之后,任务杀手无论如何都无法做到这一点,而且我在发布第8版时遇到了问题.没有运行任务杀手的系统,并没有扎根.
我甚至创建了一个"看门狗"闹钟计时器,它运行一个接收器,只是为了检查主应用程序计时器是否已经停止更新.我发现那个计时器也被取消了(它没有进一步的"最后运行"更新,并且从未注意到主应用程序已停止).
这个问题对我来说是一个app杀手.任何人都可以建议任何方式甚至尝试调试何时以及发生了什么?当计时器被取消时,系统是否有任何日志条目,无论是系统还是其他东西?我讨厌它只是消失得无影无踪.
我正在尝试能够在命令行执行"make debug",它将使用-DDEBUG_OUTPUT定义构建我的驱动程序模块,这将导致编译某些代码段.
在2.4内核makefile中,这很容易.我只是创建一个debug:target并在该目标的cc编译命令参数中包含"-DDEBUG_OUTPUT".简单.
不幸的是(对我而言),2.6完全改变了模块的编译方式,我只能找到简单的"全部"和"干净"的例子,这些例子没有显示在编译时添加自定义定义.
我试过这个:
debug:
make -C $(KERNEL_DIR) SUBDIRS='pwd' -DDEBUG_OUTPUT modules
Run Code Online (Sandbox Code Playgroud)
并得到了来自make的投诉.
我也尝试过:
.PHONY:调试
debug:
make -C $(KERNEL_DIR) SUBDIRS='pwd' EXTRA_CFLAGS="$(EXTRA_CFLAGS) -DDEBUG_OUTPUT" modules
Run Code Online (Sandbox Code Playgroud)
但它没有看到EXTRA_CFLAGS包含的内容.我可以从命令行输出中看到它确实将-D正确地附加到现有的EXTRA_CFLAGS上,其中包括-I for includes dir.但是,驱动程序文件现在不会编译,因为它找不到包含目录...所以不知何故它没有看到EXTRA_CFLAGS包含的内容.