怎么把应用程序app编译进android 编译系统系统

9154人阅读
Android开发(5)
&&&&& 有时我们希望将自己的Android应用程序编译至image/rom中,这样程序将被安装至/system/app目录下,并且不能被卸载。下面我以自己的程序TestJniApp为例子,仿照源代码中自带的SimpleJNI,演示一下怎样将自己的应用程序编译至rom中。
1.&&& 搭建编译环境
编译环境: Ubuntu 10.10
Android版本:Android 2.2
编译过程中可能需要在Ubuntu上安装必要的一些软件,我安装过的包含如下软件,不同的系统可能会有差别:
jdk6(Android官方建议装jdk5,但是我在编译时会遇到Java override问题,改用6没有任何问题), bison, lib64z1-dev, libasound2-dev, flex, gperf, libncurses5-dev
2.&&& 应用程序存放目录
&&&&& SimpleJNI是采用Android NDK和Java编写的程序,包含apk和so库文件,它的源代码在source tree的development/samples/目录下。
&&&&& 实际上package在编译时所放的目录并没有明确限定,编译后apk和so存放的位置是根据目录下Android.mk所指定的编译类型所决定的,例如:
SimpleJNI根目录下的Android.mk中有一行include $(BUILD_PACKAGE),表示将该目录下的模块编译成package,即apk文件,默认存放的位置为/system/app。
SimpleJNI/jni目录下的Android.mk中有一行为include $(BUILD_SHARED_LIBRARY),表示将该目录下的native.cpp编译为共享库文件,即so文件,默认存放的位置为/system/lib
&&&&& 因此,如果我们想要将自己编写的程序编译至image中,只需要将Eclipse下完成的整个工程copy到source tree下的某个目录即可,我一般习惯放到packages/apps下。
3.&&& 添加Android.mk
完成了上一步,可以知道,Android.mk在编译中起着至关重要的作用,这其实就是Android编译环境中的make file。为了完成我们的工作,需要在源代码中添加Android.mk。添加自己的Android.mk可以仿照SimpleJNI中的Android.mk,稍微修改即可。我们首先看看SimpleJNI目录下的两个Android.mk的内容:
目录下的Android.mk
TOP_LOCAL_PATH:= $(call my-dir)
# Build activity
LOCAL_PATH:= $(TOP_LOCAL_PATH)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := samples
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := SimpleJNI
LOCAL_JNI_SHARED_LIBRARIES := libsimplejni
LOCAL_PROGUARD_ENABLED := disabled
include $(BUILD_PACKAGE)
# ============================================================
# Also build all of the sub-targets under this one: the shared library.
include $(call all-makefiles-under,$(LOCAL_PATH))
&&&&& 根目录下的Android.mk决定了整个工程编译的配置,其中,
&&&&& LOCAL_PATH 定义了当前的目录
&&&&& LOCAL_MUDULE_TAGS 定义了当前模块的类型,编译器在编译时会根据类型的不同有些差别,有些tags的module甚至不会被编译至系统中。LOCAL_MUDULE_TAGS主要有如下几种:user debug eng tests optional samples shell_ash shell_mksh。optional表示在所有版本的编译条件下都被编译至image中,剩下的表示在该版本中才会被编译只image中,如user表示在user版本下才会被编译至image中。
对于包含LOCAL_PACKAGE_NAME的mk文件,该项默认为optinal,具体可以参看build/core/package.mk。SimpleJNI中定义为samples的具体作用我也不太清楚,为了保险起见,我自己的apk一般定义为optional。
&&&&& LOCAL_SRC_FILES 定义了编译apk所需要的java代码的目录
&&&&& LOCAL_PACKAGE_NAME 这里需要改成自己的package的名字
&&&&& LOCAL_JNI_SHARED_LIBRARIES 定义了要包含的so库文件的名字,如果你的程序没有采用JNI,这行不需要。
&&&&& LOCAL_PROGUARD_ENABLED 定义了Java开发中的ProGuard压缩方法,主要用来分析压缩程序的,在我自己的应用中我没有加这行。
&&&&& include $(BUILD_PACKAGE) 这行是build的关键,表示当前java代码build成apk
&&&&& include $(call all-makefiles-under,$(LOCAL_PATH)) 表示需要build该目录下的子目录的文件,这样编译系统就会在当前目录下的子目录寻找Android.mk来编译so等其它程序。
&&&&& 根据上述所写,创建我自己的Android.mk如下:
TOP_LOCAL_PATH:= $(call my-dir)
# Build activity
LOCAL_PATH:= $(TOP_LOCAL_PATH)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := TestJniApp
LOCAL_JNI_SHARED_LIBRARIES := libtestjniapp
include $(BUILD_PACKAGE)
# ============================================================
# Also build all of the sub-targets under this one: the shared library.
include $(call all-makefiles-under,$(LOCAL_PATH))
&&&&& 看起来很简单吧,基本不需要改动即可。
Jni目录下的Android.mk
&&&&& 由于我们的TestJniApp是用JNI完成的,包含C源代码,因此也需要一个jni目录下的Android.mk。同样首先看看SimpleJNI中jni目录下的Android.mk的内容:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := samples
# This is the target being built.
LOCAL_MODULE:= libsimplejni
# All of the source files that we will compile.
LOCAL_SRC_FILES:= /
& native.cpp
# All of the shared libraries we link against.
LOCAL_SHARED_LIBRARIES := /
&&&&&&& libutils
# No static libraries.
LOCAL_STATIC_LIBRARIES :=
# Also need the JNI headers.
LOCAL_C_INCLUDES += /
&&&&&&& $(JNI_H_INCLUDE)
# No special compiler flags.
LOCAL_CFLAGS +=
# Don't prelink this library.& For more efficient code, you may want
# to add this library to the prelink map and set this to true. However,
# it's difficult to do this for applications that are not supplied as
# part of a system image.
LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)
&&&&& LOCAL_MODULE 当前模块的名字,即编译后的so文件的名字
&&&&& LOCAL_SRC_FILES 所要编译的文件
&&&&& LOCAL_SHARED_LIBRARIES, LOCAL_STATIC_LIBRARIES 该模块要链接的动态库和静态库。
&&&&& LOCAL_C_INCLUDES 要包含的头文件
&&&&& LOCAL_CFLAGS& C语言编译选项
&&&&& LOCAL_PRELINK_MODULE 定义是否使用prelink工具,它用事先链接代替运行时链接的方法来加速共享库的加载,不仅可以加快起动速度,还可以减少部分内存开销。
&&&&& 经过修改后,我自己的TestJniApp中jni目录下的Android.mk如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE&&&
:= libtestjniapp
LOCAL_SRC_FILES := com_test_app_Jni.c
LOCAL_C_INCLUDES += $(JNI_H_INCLUDE)
LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)
& 这里有一点需要注意,如果要将so文件编译入image,必须要修改LOCAL_MODULE_TAGS,将原有的值samples修改为user,或者可以直接删掉
。删掉是因为对于包含LOCAL_MODULE的mk文件,如果没有指定LOCAL_MODULE_TAGS,该项默认为user,而只有定义为user的情况下,才会将so文件编译入image,具体定义可以参看build/core/base_rule.mk。
4.&&& 修改/bulid/target/product/generic.mk 把工程编译到系统中
&&&&& 至此,还有最后一部工作。为了将工程编译进入image,还需要在/bulid/target/product/generic.mk文件中将package name添加进去
PRODUCT_PACKAGES := /
&&& AccountAndSyncSettings /
&&& CarHome /
&&& DeskClock /
&&& SyncProvider /
&&& TestJniApp
完成上面这些步骤后,在
source tree
根目录下编译
就可以了。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:391981次
积分:2237
积分:2237
排名:第13768名
原创:29篇
评论:86条
(2)(1)(1)(1)(1)(1)(5)(2)(1)(4)(1)(3)(1)(6)如何把应用程序app编译进android系统 - 无语 - ITeye技术网站
博客分类:
转载:
http://ywxiao66./blog/static//
------------------------------------------------------------------
把常用的应用程序编译到img文件中,就成了系统的一部分,用户不必自己安装,当然也卸载不了;
同时也可以删减系统自带的应用程序,精简系统;
1.\build\target\product 目录下generic.mk文件:
PRODUCT_PACKAGES := \
AccountAndSyncSettings \
DeskClock \
AlarmProvider \
Bluetooth \
Calculator \
Calendar \
CertInstaller \
DrmProvider \
Gallery3D \
LatinIME \
Launcher2 \
我们添加一个testMid \ 应用名称。
2.把testMid包放入
\packages\apps 目录下,修改android.mk文件。
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := testMid
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
注:LOCAL_PACKAGE_NAME := testMid (包名必须和generic.mk中添加的相同)
编译源码,可以看到在
\out\target\product\smdkv210\system\app
目录下生存了testMid.apk了。这时system.img也包含了此应用。
-------------------------------------------------------------------
特殊情况:有时,应用需要包含jar包,这时的app导入源码时会出现问题:
MODULE.TARGET.JAVA_LIBRARIES.libarity already defined by ... stop
由于 LOCAL_STATIC_JAVA_LIBRARIES := libarity& 会引发错误信息。
目前解决方法是:
\build\core 目录下修改base_rules.mk
注释掉错误信息:
ifdef $(module_id)
#$(error $(LOCAL_PATH): $(module_id) already defined by $($(module_id)))
endif
$(module_id) := $(LOCAL_PATH)
--重新编译,这时可以通过了。
& (2)、删除原厂(Telchips)带源码的应用程序,如DTV_DVBT
& 在/device/telechips/m801/device.mk
& 注释掉相应语句:
& # PRODUCT_PACKAGES += \
& #&&& SampleDVBTPlayer \
& 同时,在/out/target/product/m801/system/app 找到相应的.APK包,并删除
浏览: 93185 次
来自: 深圳
原来是要这样子滴,谢谢博主咯!Android:如何静默升级/system/app下的自定义的系统应用程序。 - 开源中国社区
当前访客身份:游客 [
当前位置:
Android:如何静默升级/system/app下的自定义的系统应用程序。
说明:我们的设备移植了Android2.3.1,由于该设备自动运行在野外,而且无法人工干预。
为了获取系统权限,我们的程序预装到了Android内核里,位于目录/system/app。我们的程序会自动运行,同服务中心Socket通信。
问题:当服务中心通知软件升级时,先Http下载该升级包,然后进行升级,那如何实现后台自动升级/system/app呢?各位有何高见,给点思路,谢谢!
共有5个回答
<span class="a_vote_num" id="a_vote_num_
直接覆盖吧,钛备份之类的就是这样干的
<span class="a_vote_num" id="a_vote_num_
如何覆盖呢?因为这个程序是/system/app目录下的。
--- 共有 2 条评论 ---
(3年前)&nbsp&
(4年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
你有什么方式解决?楼主解决了?
<span class="a_vote_num" id="a_vote_num_
<span class="a_vote_num" id="a_vote_num_
更多开发者职位上
有什么技术问题吗?
类似的话题

我要回帖

更多关于 android 编译系统 的文章

 

随机推荐