本文是《Android内核开发》系列的第十二篇文章,上一篇文章介绍了如何从源码中删除出厂的app应用,本文则在此基础上,详细介绍一下如何在Android内核源码树中添加一个新的app应用。


网上也有介绍怎么在源码中添加新的app应用的博文,但大都数只介绍了不含有jni本地代码的app的添加方法,本文会更加全面地介绍三种不同类型的app应用如何添加到Android内核源码树中编译。


假设新的应用名字叫:HelloWorld,并且已经在Eclipse或者Android Studio中编译和调试通过了,我们下面分三种情况来讨论如何将它添加到Android内核源码树中。


1. 不带jni本地代码


首先,在Android内核源码中选择一个目录来存放HelloWorld应用的源码,比如放到/packages/apps目录下。


(1) 在HelloWorld目录下新建Android.mk文件,示例如下:


LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_MODULE_TAGS:=engLOCAL_SRC_FILES:=$(callall-subdir-java-files)LOCAL_PACKAGE_NAME:=HelloWorldinclude$(BUILD_PACKAGE)


注:LOCAL_MODULE_TAGS的备选值有user,eng,tests,optional,本示例中使用的TAGS值为eng,因此,仅当用户指定的编译选项为eng时才会编译该工程。


(2) 配置makefile,添加新的项目


这一步与《Android内核开发:从源码树中删除出厂的app应用》正好相反,选择 /device/<company>/ <product>/xxxx.mk,或者从build/target/product/ 目录下选择一个被“引用”的.mk,在其中的PRODUCT_PACKAGES参数列表中添加本工程:


PRODUCT_PACKAGES:=\DeskClock\Calculator\Calendar\Camera2\Email\HelloWorld


(3) 编译模块


在HelloWorld目录下输入mm命令,或者切换到Android源码根目录下执行下面任意一条命令即可:


$makeHelloWorld$mmmpackage/apps/HelloWorld


编译生成的apk会放到在out/target/product/<product>/system/app/目录下。


2. 含有jni本地代码


对于含有jni的项目,则需要修改上述新建的Android.mk,如下:


LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_MODULE_TAGS:=engLOCAL_SRC_FILES:=$(callall-subdir-java-files)LOCAL_PACKAGE_NAME:=HelloWorldLOCAL_JNI_SHARED_LIBRARIES:=libmynativeinclude$(BUILD_PACKAGE)include$(callall-makefiles-under,$(LOCAL_PATH))


jni目录下的Android.mk如下(假设jni目录下有inc和src目录):


LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_MODULE:=libmynativeLOCAL_SRC_FILES:=src/mynative.cLOCAL_C_INCLUDES+=$(JNI_H_INCLUDE)LOCAL_C_INCLUDES+=$(LOCAL_PATH)/incinclude$(BUILD_SHARED_LIBRARY)


3. 含有jni本地代码,并且本地代码依赖第三方库(.a或者so)


假设本地代码依赖的第三方库为:encoder.a 和 decoder.so


(1) 修改上述jni目录下的Android,mk,添加如下两项:


LOCAL_STATIC_LIBRARIES:=libencoderLOCAL_SHARED_LIBRARIES:=libdecoder


(2) 修改HelloWorld目录下的Android.mk文件


首先把 encoder.a 和 decoder.so 都拷贝到工程根目录下,然后修改Android.mk文件,添加如下两项即可:


include$(CLEAR_VARS)LOCAL_MODULE:=libencoderLOCAL_SRC_FILES:=encoder.aLOCAL_MODULE_TAGS:=engLOCAL_MODULE_CLASS:=STATIC_LIBRARIESLOCAL_MODULE_SUFFIX:=.ainclude$(BUILD_PREBUILT)include$(CLEAR_VARS)LOCAL_MODULE:=libdecoderLOCAL_SRC_FILES:=decoder.soLOCAL_MODULE_TAGS:=engLOCAL_MODULE_CLASS:=SHARED_LIBRARIESLOCAL_MODULE_SUFFIX:=.soinclude$(BUILD_PREBUILT)


关于如何在源码树中添加新的app应用就介绍到这里了,有任何疑问或者建议欢迎留言或者来信lujun.hust@gmail.com交流,或者关注我的新浪微博 @卢_俊 获取最新的文章和资讯。


更多相关文章

  1. android利用ZXing进行条码扫描二维码扫描源码简化
  2. android 关于图片的放大,缩小,旋转功能的实现(附源码)
  3. Android(安卓)应用程序主动请求Vsync
  4. Android源码去除状态栏
  5. Android开发常见问题 不定期更新。开发环境Android(安卓)Studio
  6. exp:Android(安卓)Studio调试系统源码的方法 (干货分享)
  7. exp:Android(安卓)Studio调试系统源码的方法 (干货分享)
  8. android http中请求访问添加 cookie
  9. android系统核心机制 基础(09)Android(安卓)添加新模块

随机推荐

  1. Android Makefile and build system 分析
  2. 转载-Android运行时异常“Binary XML file
  3. 知乎日报 - 我的第一个Kotlin项目
  4. Android中使用ORMLite入门示例学习
  5. AndroidStudio安装SDKComponentSetup无法
  6. Android 中的网络操作(HttpURLConnection)
  7. Android用Websocket实现聊天室
  8. cm-14.1 Android系统启动过程分析(四)-Laun
  9. Android中Gravity中的一些值都是些什么意
  10. Android之ButterKnife用法详解