有时候不得已需要在Android源码里编译应用。譬如说用到了Andorid的隐藏类,譬如说要与系统一起起来的system权限apk,譬如说用eclipse编译时,明明是正确的代码却报错时。就不得不用到在源码里编译了。至于说有apk了,要成为Android预装的应用,那倒是简单,只需要将apk放到out/system/app/目录下重新打包image文件即可,不在本文讨论范畴。
我用到这个的原因就是上述的第三点,完全不知道这个eclipse发了什么神经,明明是正确代码却总是报错。于是乎将其放在Android源码里,只留下res和src目录,以及AndroidManifest.xml文件。由于这个工程还用到了两个jar文件,所以也将它们拷贝过来。然后编辑Android.mk文件(这里主要就是讲这个mk文件如何编写),就可以看到目录下是如此的:
Analytics_Android_SDK_2.0.jar AndroidManifest.xml Android.mk jcifs-1.3.15.jar res src
那么,如何编辑Android.mk呢?首先看我这个Android.mk的写法:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optional#debug
LOCAL_STATIC_JAVA_LIBRARIES := libanalytics \
libjcifsLOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_SDK_VERSION := current
LOCAL_PACKAGE_NAME := FileExpert
include $(BUILD_PACKAGE)
##################################################
include $(CLEAR_VARS)LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libanalytics:Analytics_Android_SDK_2.0.jar \
libjcifs:jcifs-1.3.15.jar
include $(BUILD_MULTI_PREBUILT)
解释一下,其中LOCAL_MODULE_TAGS := optional是说可以配置的,要在core.mk配置,如果你是想将其预装到系统里,最好去配置一下,或者直接:=debug好了。如果不是的话,只是想单独编译一下这个apk,那随你怎么写了,我这里写的就是optional,并且没有在其它build目录下的mk文件里添加内容,因为我只需要编译这一个apk。
LOCAL_STATIC_JAVA_LIBRARIES是这个apk也依赖的库。在eclipse里都好说,只要改一下build path就可以了。但是在Android源码里就没有这么好了,得自己加上去。这里,我用到的两个jar库都是Analytics_Android_SDK_2.0.jar和jcifs-1.3.15.jar,这里两个libanalytics和libjcifs的名字随你怎么取好了,但是关键取好之后要记得,还用得着它们呢。看这个mk文件的倒数两三行LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libanalytics:Analytics_Android_SDK_2.0.jar libjcifs:jcifs-1.3.15.jar,这里就指定了这两个库跟刚才两个名字的关联关系了。后面的include $(BUILD_MULTI_PREBUILT)可别忘记了,这里就跟另一个文件有关了。
在build/core/user_tags.mk里,这个build目录是android源码总目录下面的build目录,几乎所有的编译规则都在这个目录下。修改user_tags.mk文件里的GRANDFATHERED_USER_MODULES变量,在末尾处添加上面写的两个lib,我这里的这个文件原来的末尾是zipalign,所以添加两个之后就是这样的:
zipalign \
libanalytics \
libjcifs
这个就对应着上面写的那个名字,所以说上面写过的东西都要记得。Android.mk文嘉的其它部分就按上面的写好了,只是LOCAL_PACKAGE_NAME := FileExpert要换成你想要的,按照这个编译出来,最后就是FileExpert.apk文件了。
至此,Android.mk文件编辑好,回到Android源码总目录,叫Android-src好了。在Android-src目录下,执行命令:
. build/envsetup.sh
执行这个命令主要是设置一下当前shell的环境变量。然后进入到你apk的源码目录,如我这里放到Android-src/packages/apps/FileExpert,所以我就到这个目录下执行这个命令
mm TARGET_PRODUCT=product_name
这个TARGET_PRODUCT=product_name随你了,如果你原来编译系统直接用的是make命令,那么这个TARGET_PRODUCT=product_name也可以省下了,直接执行mm就可以了。
编译完后,你就可以去Android-src/out/target/product/product_name/system/app目录下找你的apk文件了。