m,mm,mmm的⽤法
通过查看android源码⽬录下的build/envsetup.sh⽂件,可知:
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory.
- mmm: Builds all of the modules in the supplied directories.
要想使⽤这些命令,⾸先需要在android源码根⽬录执⾏. build/envsetup.sh
m:编译所有的模块
mm:编译当前⽬录下的模块,当前⽬录下要有Android.mk⽂件
mmm:编译指定路径下的模块,指定路径下要有Android.mk⽂件
下⾯举个例⼦说明,假设我要编译android下的libjpeg模块,当前⽬录为源码根⽬录,⽅法如下:
1、. build/envsetup.sh
2、mmm external/jpeg/
或者:
1、. build/envsetup.sh(.和build之间有空格)
2、cd external/jpeg
3、mm
最后说明⼀下,envsetup.sh只要source⼀次就够了,source之后还可以⽤croot命令返回到源码根⽬录,很好⽤。
1、修改APK应⽤:在packages中的应⽤如果修改后都可以单独编译。先执⾏
$. build/envsetup.sh #初始化
$mmm packages/providers/ContactsProvider/
##⽤mm/mmm来编译⽣成的.apk并不会打包到system.img中,需要我们⼿动通过make snod把system⽂件夹打包为system.img
##可以使⽤make snod将模块打包到system.img中,也可以使⽤ adb install *.apk安装
注:通过mmm packages/providers/ContactsProvider/ 编译后的apk在 out/target/product/generic/system/app
这时候通过 adb install out/target/product/generic/system/app/xxx.apk 安装你刚修改过的apk就可以在模拟器上看到你修改的效果了。
adb push⽅式进去:
adb shell mount -o rw,remount -t ext3 /dev/block/mmcblk0p2 /system 挂载并获取写⼊权限
adb push xxx.apk /system/app
修改framework:如果在Contacts.java中修改了,必须重新编译下framework。先执⾏
$ . build/envsetup.sh #初始化
#⽹上有的说要执⾏ make update-api,实际上直接make PRODUCT-sdk-sdk就可以将修改后的framework编译到sdk中。 #编译framework 后,那些修改了的应⽤可以不⽤再单独编译了。4~6分钟
$ make PRODUCT-sdk-sdk #重新⽣成SDK 10~20分钟
2.三个m的含义
以下是在help中看到的信息
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory.
- mmm: Builds all of the modules in the supplied directories.
m,显然是make
mm ,在编译单⼀模块的时候可以在当前⽬录下使⽤
mmm 可以在android⽬录下使⽤
3、不是android的⼀个,但是经常⽤。make 2&>txt
将make的信息输出到txt中,如果make > txt则⽆法输⼊
Linux Shell 环境中⽀持输⼊输出重定向,⽤符号"<"和">"来表⽰。0、1和2分别表⽰标准输⼊、标准输出和标准错误信息输出,可以⽤来指定需要重定向的标准输⼊或输出
make &>test
表⽰标准和错误全部输出
4、make -n &>txt
make -n 是现实编译命令,但是不去执⾏,⾮常有⽤
5.显⽰详细的编译过程信息(ndk)
在definitions.mk中有定义。
ifeq ($(V),1)
hide = $(empty)
else
hide = @
endif
include of 用法要想把所有的编译命令输出来,只需要先export V=1就可以了。
输出NDK详细log
$NDK/ndk-build V=1 2>&1 |
Android NDK 打印log
1. 在c源⽂件中,需要include头⽂件、定义宏
#define LOG_TAG "TestLib" //⾃定义的变量,相当于logcat函数中的tag
#undef LOG
#include <android/log.h> //#include <utils/Log.h>//在源码环境中,头⽂件的路径不同
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__) 可以定义多种log级别,在log.h中可以看到:
typedef enum android_LogPriority {
ANDROID_LOG_UNKNOWN = 0,
ANDROID_LOG_DEFAULT, /* only for SetMinPriority() */
ANDROID_LOG_VERBOSE,
ANDROID_LOG_DEBUG,
ANDROID_LOG_INFO,
ANDROID_LOG_WARN,
ANDROID_LOG_ERROR,
ANDROID_LOG_FATAL,
ANDROID_LOG_SILENT, /* only for SetMinPriority(); must be last */
} android_LogPriority;
2. 在c源⽂件中,调⽤输⼊log的函数
LOGD("Hello LIB!\n");//将会输出“TestLib” “Hello LIB!”
3.在mk⽂件中,需要包含响应的库
LOCAL_C_INCLUDES := $(JNI_H_INCLUDE) //包含相应的头⽂件
LOCAL_LDLIBS := -llog //包含打印log需要的库⽂件
LOCAL_PRELINK_MODULE := false
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论