添加一个APK项目可能是很多应用工程师经常遇到的问题,以下要介绍的是如何给Android源码中添加一个APK项目。
首先,假设已经在Eclipse下新建了一个名称为HelloApk的Android应用项目,下面要做的就是要将这个项目移植到Android的源码中。 编译中枢会搜索Android根目录下除out目录外的所有子目录,并找出Android.mk文件作为一个子项目。因此,理论上讲可以将HelloApk项目放在任何目录下,只不过为了目录的清晰,厂商一般习惯于将自定义的项目放到vendor下的相应目录中,因此,本例就将HelloApk放到vendor/smc/k/apps目录下。 然后,删除HelloApk目录下的bin和gen目录,因为这两个目录是Eclipse编译的输出目录而其对Android编译系统而言是多余的,它甚至会认为这是两个源码目录。 接下来就需要新建一个Android.mk文件,并将其放到HelloApk目录下,该Android.mk的内容如以下代码所示。 LOCAL_PATH:=$(call my-dir) Include $(CLEAR_VARS) LOCAL_MODULE_TAGS:=optional LOCAL_SRC_FILES :=$(callall-java-files-under,src) LOCAL_PACKAGE_NAME :=HelloApk LOCAL_SDK_VERSION :=current LOCAL_CERTIFICATE :=platform LOCAL_PROGUARD_FLAG_FILES :=proguard.cfg Include $(BUILD_PACKAGE) 以上mk文件说明如下: LOCAL_MODULE_TAGS用于指定该项目的标签值,对应用类子项目而言,只能指定为三种情况,分别是optional、tests、eng,本例中使用的是optional。因此,必须在device/smc/k/k.mk文件中包含该项目,如以下代码所示,否则产品将不会包含该项目。 PRODUCT_PACKAGES:=\ HelloMake \ HelloApk LOCAL_SRC-FILE用于指定该项目中的Java源码,编译中枢中提供了一个函数,可以直接遍历指定目录下的所有Java文件,从而不必手工列出所有的Java文件列表。 LOCAL_PACKAGE_NAME用于描述APK项目的名称。 LOCAL_SDK_VERSION用于指定该APK项目所需的SDK版本,current代表了当前Android源码的版本。 LOCAL_CERTIFICATE用于指定该APK项目将使用何种签名文件签名最后生成的apk文件。系统一共包含四种签名文件,分别如下。 platform,Framework源码最后将生成一个jar包,该jar包默认使用该类型签名。 shared,一些系统应用程序使用该类型签名,比如Contacts等。 user,一些私有项目使用该签名。 tests,调试过程中一般使用该签名。 至于选择何种签名取决于项目的需求,一般当需要和特定的程序共享数据库资源时,两个项目必须拥有相同的签名。 LOCAL_PROGUARD_FLAG_FILES,该变量的作用暂不详,不过从实验的结果来看,应该赋值为Eclipse项目中的proguard.cfg文件。 最后,使用include包含BUILD_PACKAGE命令宏告诉编译中枢该项目的目标是一个APK程序。 以上介绍的是以源码的方式添加一个项目,有些时候可能还需要以一个APK文件的方式添加一个项目,在这种情况下,本质上添加的不是一个项目,而仅仅是一个文件。前面讲过,一个product中包含的项目分为三种,其中最后一种就是私有的项目或者文件,而这种方式实际中就是私有的文件,因此,需要在product相关的脚本文件中声明该product中包含该apk文件。本例中就应该在k.mk文件中添加以下代码,其中赋值的源路径是主机系统上的路径,而目标路径是设备上的路径,两者使用冒号分隔。 PRODUCT_COPY_FILES :=\ vendor/smc/k/helloapk/helloapk.apk:/system/app 该段代码仅仅是将该HelloApk.apk复制到最终设备的/system/app目录下。 如果想给该APK进行签名怎么办?对不起,编译中枢中没有单独提供这个功能,也就是说,在把HelloApk.apk复制到源码中前,应该事先给该APK进行签名。
|