工作笔记 - Android make文件学习(主要是编译Android apk)

1.MyTest编译到package/apps下(预置带有源码的apk)

  • □在alps/device/qcom/common/base.mk(这里用的是高通机子,其他的系统,如mtk,mk文件的位置视情况而定,但位置都差不多)里加上

PRODUCT_PACKAGES += MyTest

  • □在eclipse新建android项目命名MyTest,删除无用文件夹(目前只保留了libs res
    src3个文件夹和其他文件,删除了bin和gen目录)
  • □将MyTest项目文件夹cp到package/apps
  • □在cp后的MyTest下新建Android.mk文件,添加如下内容
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Build all java files in the java subdirectory
LOCAL_SRC_FILES := $(call all-subdir-java-files)
# Name of the APK to build
LOCAL_PACKAGE_NAME := MyTest
# Tell it to build an APK
include $(BUILD_PACKAGE)
  • □全编代码,烧录

2.MyTest编译到alps/vendor/simcom下,覆盖package/apps下的MyTest(预置带有源码的apk,并覆盖原来的包名相同的apk,用自己的)

  • □在alps/device/qcom/common/base.mk里加上

PRODUCT_PACKAGES += MyNewTest

  • □cp MyTest到alps/vendor/simcom
  • □在cp后的MyTest下新建Android.mk文件,添加如下内容
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Build all java files in the java subdirectory
LOCAL_SRC_FILES := $(call all-subdir-java-files)

#区别在此
LOCAL_OVERRIDES_PACKAGES := MyTest
# Name of the APK to build
LOCAL_PACKAGE_NAME := MyNewTest

# Tell it to build an APK
include $(BUILD_PACKAGE)
  • □改点string文言以示区别
  • □全编代码,烧录

3.在system/app预置不带源码的apk

  • □随意找一个apk,在packages/apps下新建一个以apk名字为名的文件夹.比如ApkNoSource
  • □把ApkNoSource.apk放到packages/apps/ApkNoSource下面
  • □在packages/apps/ApkNoSource下面新建文件Android.mk,添加如下内容
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

#LOCAL_MODULE变量必须定义,用来标识在Android.mk文件描述的每一个模块。而且名称必须是唯一的,并且不能包含空格。编译系统会自动产生合适的前缀和后缀,比如一个被命名为hello的共享库模块,#将会生成libhello.so文件。如果把库命名为libhello,编译系统将不会添加任何lib前缀,也会生成libhello.so文件。
LOCAL_MODULE := ApkNoSource
# user eng各个版本均要编译
LOCAL_MODULE_TAGS := optional

# LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的源代码文件。如上文中的java文件和本次的apk文件
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
#标识所编译模块最后放置的位置。ETC表示放置在/system/etc.目录下,APPS表示放置在/system/app目录下,SHARED_LIBRARIES表示放置在/system/lib目录下。如果具体指定,则编译的模块不会放到编#译系统中,最后会在out对应product的obj目录下的对应目录中。预置apk基本都是指定为APPS
LOCAL_MODULE_CLASS := APPS
#不用定义,module的后缀,=.apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)


#LOCAL_PREBUILT_JNI_LIBS:= \
#@lib/armeabi/libXXX.so  \
#@lib/armeabi/libXXXX.so 

#若无so,删除LOCAL_PREBUILT_JNI_LIBS
#若有so,使用LOCAL_PREBUILT_JNI_LIBS列出所有so的路径,不要忘记使用@。@标识符会将apk中的so抽离出来build进apk同级目录下的lib文件夹中

#若apk支持不同cpu类型的so,针对so的部分的处理:
#Ifeq ($(TARGET_ARCH),arm)
#LOCAL_PREBUILT_JNI_LIBS := \
#@lib/armeabi-v7a/xxx.so\
#@ lib/armeabi-v7a/xxxx.so
#else ifeq ($(TARGET_ARCH),x86)
#LOCAL_PREBUILT_JNI_LIBS := \
#@lib/x86/xxx.so
#else ifeq ($(TARGET_ARCH),arm64)
#LOCAL_PREBUILT_JNI_LIBS := \
#@lib/armeabi-v8a/xxx.so
#…
#即将和TARGET_ARCH对应的so抽离出来
#此处我们使用不带so的apk,所以注释掉LOCAL_PREBUILT_JNI_LIBS部分

#编译到system/priv-app目录,放到/system/priv-app下的应用比放到/system/app下的应用可以声明获得更多的权限
LOCAL_PRIVILEGED_MODULE := true

#签署当前应用的证书名称
#LOCAL_CERTIFICATE := PRESIGNED表示APK签名使用原来签名,即第三方签名,若要使用系统签名,则可以改为LOCAL_CERTIFICATE := platform系统前面,可以使apk获得系统权限。
LOCAL_CERTIFICATE := PRESIGNED
#LOCAL_MODULE_PATH :=$(TARGET_OUT)/vendor/operator/app表示编译后apk放在/system/vendor/operator/app目录下面,用户可以卸载,恢复出厂设置可以恢复
#LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS) 用户可以卸载,恢复出厂设置不能恢复
#不加LOCAL_MODULE_PATH的定义,会放在/system/app/下面,用户不可以卸载。
LOCAL_MODULE_PATH := $(TARGET_OUT)/vendor/operator/app
include $(BUILD_PREBUILT)

注:#后面注释的大量内容可以先不管

  • □打开文件 device\qcom\common\device.mk,将ApkNoSource添加到 PRODUCT_PACKAGES
    里面。

PRODUCT_PACKAGES += ApkNoSource

  • □全编代码,烧录

4:小知识 编译开关

  • 在配置mk文件中添加如下(需要在alps/device/qcom/common/base.mk之前被检索)

KEY_FOR_TEST = yes

  • 在alps/device/qcom/common/base.mk检查其他mk文件是否定义了KEY_FOR_TEST并且值为yes,如果是,将PRODUCT_PACKAGES变量添加Test选项(strip为去空格函数)
ifeq ($(strip $(KEY_FOR_TEST)), yes)
  PRODUCT_PACKAGES += Test
endif

参考资料:
http://blog.csdn.net/sir_zeng/article/details/51992381
http://www.jb51.net/article/70401.htm

android make 介绍 Make 文件说明 整个 Build 系统的入口文件是源码树根目录下名称为“Makefile”的文件,当在源代码根目录上调用 make 命令 时,make 命令首先将读取该文件Makefile 文件的内容只有一行:“include build/core/main.mk”。该行代码的作用很明显:包含 build/core/main.mk 文 件。在 main.mk 文件中又会包含其他的文件,其他文件中又会包含更多的文件,这样就引入了整个 Build 系统。 这些 Make 文件间的包含关系是相当复杂的,图 3 描述了这种关系,该图中黄色标记的文件(且除了 $开头的文件) 都位于 build/core/ 目录下。 Android 源码中包含了许多的模块,模块的类型有很多种,例如:Java 库,C/C++ 库,APK 应用,以及可执行文件 等 。并且,Java 或者 C/C++ 库还可以分为静态的或者动态的,库或可执行文件既可能是针对设备(本文的“设备”指 的是 Android 系统将被安装的设备,例如某个型号的手机或平板)的也可能是针对主机(本文的“主机”指的是开发 Android 系统的机器,例如装有 Ubuntu 操作系统的 PC 机或装有 MacOS 的 iMac 或 Macbook)的。不同类型的模块 的编译步骤和方法是不一样,为了能够一致且方便的执行各种类型模块的编译,在 config.mk 中定义了许多的常量, 这其中的每个常量描述了一种类型模块的编译方式,这些常量有: BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk BUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mk BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk BUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mk BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk BUILD_PHONY_PACKAGE:= $(BUILD_SYSTEM)/phony_package.mk BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk BUILD_HOST_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值