【Android源码 栏目提醒】:网学会员为广大网友收集整理了,如何将Android应用程序编译至image rom - 互联网,希望对大家有所帮助!
如何将
Android应用程序编译至image rom 有时我们希望将自己的
Android应用程序编译至image/rom中这样程序将被安装至/system/app目录下并且不能被卸载。
下面我以自己的程序TestJniApp为例子仿照源代码中自带的SimpleJNI演示一下怎样将自己的应用程序编译至rom中。
1.搭建编译环境 编译环境Ubuntu 10.10
Android版本
Android 2.2 编译过程中可能需要在Ubuntu上安装必要的一些软件我安装过的包含如下软件不同的系统可能会有差别 jdk6
Android官方建议装jdk5但是我在编译时会遇到Java override问题改用6没有任何问题bisonlib64z1-devlibasound2-devflexgperflibncurses5-dev 2.应用程序存放目录 SimpleJNI是采用
Android NDK和Java编写的程序包含apk和so库文件它的源代码在source tree的development/samples/目录下。
实际上package在编译时所放的目录并没有明确限定编译后apk和so存放的位置是根据目录下
Android.mk所指定的编译类型所决定的例如 SimpleJNI根目录下的
Android.mk中有一行includeBUILD_PACKAGE表示将该目录下的模块编译成package即apk文件默认存放的位置为/system/app。
SimpleJNI/jni目录下的
Android.mk中有一行为includeBUILD_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_PATHcall my-dir Build activity LOCAL_PATHTOP_LOCAL_PATH includeCLEAR_VARS LOCAL_MODULE_TAGSsamples LOCAL_SRC_FILEScall all-subdir-java-files LOCAL_PACKAGE_NAMESimpleJNI LOCAL_JNI_SHARED_LIBRARIESlibsimplejni LOCAL_PROGUARD_ENABLEDdisabled includeBUILD_PACKAGE Also build all of the sub-targets under this onethe shared library. includecall all-makefiles-underLOCAL_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压缩方法主要用来分析压缩程序的在我自己的应用中我没有加这行。
includeBUILD_PACKAGE这行是build的关键表示当前java代码build成apk includecall all-makefiles-underLOCAL_PATH表示需要build该目录下的子目录的文件这样编译系统就会在当前目录下的子目录寻找
Android.mk来编译so等其它程序。
根据上述所写创建我自己的
Android.mk如下 TOP_LOCAL_PATHcall my-dir Build activity LOCAL_PATHTOP_LOCAL_PATH includeCLEAR_VARS LOCAL_MODULE_TAGSoptional LOCAL_SRC_FILEScall all-subdir-java-files LOCAL_PACKAGE_NAMETestJniApp LOCAL_JNI_SHARED_LIBRARIESlibtestjniapp includeBUILD_PACKAGE Also build all of the sub-targets under this onethe shared library. includecall all-makefiles-underLOCAL_PATH看起来很简单吧基本不需要改动即可。
Jni目录下的
Android.mk 由于我们的TestJniApp是用JNI完成的包含C源代码因此也需要一个jni目录下的
Android.mk。
同样首先看看SimpleJNI中jni目录下的
Android.mk的内容 LOCAL_PATHcall my-dir includeCLEAR_VARS LOCAL_MODULE_TAGSsamples This is the target being built. LOCAL_MODULElibsimplejni 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 Dont prelink this library.For more efficient codeyou may want to add this library to the prelink map and set this to true.However its difficult to do this for applications that are not supplied as part of asystem image. LOCAL_PRELINK_MODULEfalse includeBUILD_SHARED_LIBRARYLOCAL_MODULE当前模块的名字即编译后的so文件的名字 LOCAL_SRC_FILES所要编译的文件 LOCAL_SHARED_LIBRARIESLOCAL_STATIC_LIBRARIES该模块要链接的动态库和静态库。
LOCAL_C_INCLUDES要包含的头文件 LOCAL_CFLAGS C语言编译选项 LOCAL_PRELINK_MODULE定义是否使用prelink工具它用事先链接代替运行时链接的方法来加速共享库的加载不仅可以加快起动速度还可以减少部分内存开销。
经过修改后我自己的TestJniApp中jni目录下的
Android.mk如下 LOCAL_PATHcall my-dir includeCLEAR_VARS LOCAL_MODULElibtestjniapp LOCAL_SRC_FILEScom_test_app_Jni.c LOCAL_C_INCLUDESJNI_H_INCLUDE LOCAL_PRELINK_MODULEfalse includeBUILD_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根目录下编译image就可以了。
上一篇:
Eclipse 开发 Android,第一个 HelloWord 程序(学习1)
下一篇:
法律专业开题报告范文