IDE中的安卓工程移植到Android系统源码树

来源:互联网 发布:程序员找工作保密协议 编辑:程序博客网 时间:2024/06/03 17:15

如果只是做上层应用开发,使用IDE添加Module依赖是相当简单的,但是涉及到系统编译的话就比较麻烦了,而且网上关于这方面的资料很少很少,有一篇关于android Build系统的文章写得非常好,大家可以先去看一看。

言归正传,既然需求已经提出来了,那么就得去解决它,网上资料太少了,只能靠自己一点点摸索,对于一个从纯应用开发者来说,这确实有点难度,于是我冷静了一下,理了一下思路:

既然添加的是Module依赖,那么我们可以先看看Module中有哪些是可以被依赖的:

  • java文件
  • 第三方jar包
  • resource资源文件
  • 清单文件中的声明
  • 公共库(v7,cardview,recycleview等)
  • assert文件
  • so动态库文件
  • jni文件
  • aidl文件

我们知道,编译的时候根据mk文件来的,因此我们需要先了解一下mk文件,以最简单的包含c的mk工程hello-jni和最简单的不包含c的hello-world讲解,具体点击这里。

到这里MK文件就分析完了,我们开始实战。

添加依赖

纯java依赖

我脑海中立即想到直接把java文件拖过去不就好了,当然这个是一种方法,简单粗暴,但是不好解耦,因此我们找一种比较稳妥的方法。
怎么找呢?我随手打开了安卓源码工程下一个工程,看看他是怎么把java文件添加进去的,这里我们顺带把android.mk文件里面的内容分析一下。

找来找去,我发现./package/apps/Tag这个工程的Android.mk里面包含的最少,只引用了guava,guava具体是个什么东西我们暂时不讨论,首先我们知道他是一个jar包,这个jar包在源码树目录里面,具体放在哪里呢?我们来看下mk文件

LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_STATIC_JAVA_LIBRARIES := guava com.android.vcard# Only compile source java files in this apk.LOCAL_SRC_FILES := $(call all-java-files-under, src)LOCAL_PACKAGE_NAME := TagLOCAL_PRIVILEGED_MODULE := true#LOCAL_SDK_VERSION := currentinclude $(BUILD_PACKAGE)

前面的知识我们科普完了,因此只讲前面没有出现过的内容,这里使用了LOCAL_STATIC_JAVA_LIBRARIES 变量,表示当前模块依赖的 Java 静态库有两个:
guava
com.android.vcard

细心的朋友发现既然第一个使用的模块名,第二个为啥要使用包名的方式呢?第二个我们知道是名片夹应用,那么我进进入到名片夹应用的源码。这个问题我们后面寻找答案。

我们先找一下这个guava到底在哪里。guava我们知道,他不是安卓系统自带的库,因此应该会放在第三方库的目录下,从源码目录看过来,我们发现有个文件夹最有嫌疑,位于根目录下的external文件夹,我们进去果然发现了guava既然看到了guava,我们又知道这个guava被Tag应用工程引用,又知道他是个纯jar的module(可以打包成jar),所以我们索性来研究一下,这么做的好处:
1. 在源码目录下以源码的方式而不是jar包的方式
2. 有一个需求就是这个纯java依赖需要做成公共的,大家都用的到
3. 有利于了解源码目录。
具体怎么做呢?点击这里

有朋友会问了,如果我就是想通过引用jar包的形式呢?没问题,我们也来研究一下jar包怎么引用。不过这个方式我不是在源码中摸索出来的,我百度发现了一大把,所以在这里也把这种方法贴出来:

Android源码树中往工程目录下添加jar依赖

带有资源文件的模块依赖

纯java依赖探索完了,我们来深入一下,探索一下怎么引用带有资源文件的module,还是以上面的hellojar为例,在上面做扩展,我们往资源文件里面添加三个常见的资源:

  1. color.xml里面添加白色定义
  2. string.xml里面添加”这是jar定义的文本”
  3. drawable里面添加logo_from_jar.png

其他的资源文件的添加类似,所以以这三种典型的为例;



























































文件名 说明 host_static_library.mk 定义了如何编译主机上的静态库。 host_shared_library.mk 定义了如何编译主机上的共享库。 static_library.mk 定义了如何编译设备上的静态库。 shared_library.mk 定义了如何编译设备上的共享库。 executable.mk 定义了如何编译设备上的可执行文件。 host_executable.mk 定义了如何编译主机上的可执行文件。 package.mk 定义了如何编译 APK 文件。 prebuilt.mk 定义了如何处理一个已经编译好的文件 ( 例如 Jar 包 )。 multi_prebuilt.mk 定义了如何处理一个或多个已编译文件,该文件的实现依赖 prebuilt.mk。 host_prebuilt.mk 处理一个或多个主机上使用的已编译文件,该文件的实现依赖 multi_prebuilt.mk。 java_library.mk 定义了如何编译设备上的共享 Java 库。 static_java_library.mk 定义了如何编译设备上的静态 Java 库。 host_java_library.mk 定义了如何编译主机上的共享 Java 库。。

原创粉丝点击