解决:使用eclipse导出的jar,报控件找不到id,或者直接报控件空指针异常

因为最近在开发公司的SDK,因为不想让游戏开发商看到SDK源码。所以最后会把项目导出成jar给开发商,但是在导出测试jar的时候发现,总是闪退。报各种错误:

1.会报控件id找不到对应的控件

2.会报控件的类型错误(例如会告诉你Button类型的控件不能用TextView表示)

先解释一下为什么会出现这种错误吧,因为当我们项目导出成jar。里面java文件里面的findViewById,ADT就会监测到,自动在R.java里注册一个ID方便使用。 但是反编译后,你会看到R文件文件id内部静态类


所以这说明你导出来的jar包里面的控件的id值是固定值的。这会出现什么问题呢?很简单,当我们的项目被用作jar包后,在主项目里面R文件会为重新为我们控件生成新的id。但是我们jar包里面findViewById的ID值是固定的,所以这最终造成了jar包里面的控件findViewById会报控制正异常,又或者是报控件类型转换错误。


画的有点丑,大概意思就是这样子,我们SDK里面的控件findViewById的值是不变的,但是我们布局文件里面的id值是会变的。问题找到了,接下来就是要怎么解决的问题了。既然目标项目会为jar的控件重新生成id,那我们就不要让它帮我们生成新的id,要实现这个功能,第一步要SDK项目中,我们要自己定义id,在values文件夹下新建一个ids的xml文件,还有一个public的xml文件。


比如我们要写一个btn_login的id,现在ids文件写


然后在public.xml写,注意里面的id字段使我们自己定义的,这个id我们在R文件里面拿到



下一步就是在布局文件修改一下


其他的控件id是一样套路,我们在ids文件和public文件定义自己的id。然后再次导出jar,然后clean一下项目。这样我们的目标项目就不用为我们重新控件id,而是会直接在我们定义的xml文件找id,所以这样一来。目标项目就不会出现控件空指针或者类型转换错误。

这个让我烦恼几天的问题终于解决了,希望和我遇到同样问题的同学。看到这篇文章后能完美解决这个问题。我是一名android工程师,我为自己加油

猜你喜欢

转载自blog.csdn.net/ruan_number3/article/details/79883630