本篇文章主要介绍了"制作不暴露源码的Android Library Project",主要涉及到Activity,AndroidManifest.xml方面的内容,对于移动开发感兴趣的同学可以参考一下:
Android Library Project(库工程)是一个可以被其他Android工程所引用的工程。那为什么需要使用这个工程呢,打个比方,我...
Android Library Project(库工程)是一个可以被其他Android工程所引用的工程。那为什么需要使用这个工程呢,打个比方,我们在开发Android项目的时候,常常会遇到这样的问题,几个Android项目的开发过程中,会有可以重复利用的代码段或者资源。如果每个项目都要重复编写或者添加这些代码或者资源,将会非常的影响效率。为了避免重复发明轮子,我们可以将这些重复的资源添加到Android Library Project中。那么以后,我们要复用这些东西的时候,只要在当前项目中引用这个Android Library Project就可以了。
当然我们的Android Library Project不仅仅是给我们自己使用,如果我们要把这个Android Lib Project共享给别人,但是又不希望暴露自己的源代码,那么,这就是我们这篇文章要讲的内容。
HOW
首先,这篇文章中我们会提到三个项目。
LibraryProject : 我们需要共享给别人的不包含源代码的工程。
LibraryProjectSource : LibraryProject包含源代码的版本。
AndroidProject : 引用LibraryProject的版本。
和我们开发正常的Android项目一样,我们先建立一个项目,但是在开始正常的编码之前,我们需要先弄清楚原理和注意事项:不暴露源码的方式是将LibraryProjectSource中的源代码打包成JAR包,然后添加到我们要共享给他人的工程中。如果这个工程中没有引用到资源(res目录下的文件),那么就很容易实现了。但是如果有引用到资源(例如通过R.id.resource方式),我们就可以能会遇到资源引用错乱的问题。
打个比方,在AndroidProject中如果引用TextView可以会定位到一个ImageView上。这是因为,如果在源代码中有使用R.id.resource引用资源,在编译成JAR包的时候,R.id.resource会用R.java文件中相应的十六进制的int值替换。但是在AndroidProject文件中资源的会结合LibraryProject中的资源重新生成一个新的十六进制int值。而同一个资源,在LibraryProjectSource中的这个int值和AndroidProject中的就可能不相同了。
所以我们必须实时的获取这个十六进制的数值。有两个方式可以选择:
1.(推荐)通过android.content.res.Resources类的int getIdentifier(String name, String defType, String defPackage) .
比如,我们需要在Activity中设置布局,我们要得到res/layout/目录下的 “main_layout.xml” 布局文件的ID.