android 预置apk so库 jar包等

LOCAL_PATH := $(call my-dir) 这一行每个Android.mk 都是要添加的

1.预置aliuyi.apk

预制一个普通的apk

include $(CLEAR_VARS) LOCAL_MODULE := wwwa.apk  LOCAL_SRC_FILES := aliuyi.apk LOCAL_MODULE_CLASS := APPS LOCAL_CERTIFICATE := PRESIGNED LOCAL_MODULE_PATH := $(TARGET_OUT)/app include $(BUILD_PREBUILT)

编译一个需要特殊vendor key签名的APK

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 := LocalPackage LOCAL_CERTIFICATE := vendor/example/certs/app # Tell it to build an APK include $(BUILD_PACKAGE)

预制一个带jar 包的有源码的apk

(这里以系统的计算器apk 为例) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_STATIC_JAVA_LIBRARIES := libarity android-support-v4 guava LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_SDK_VERSION := current LOCAL_PACKAGE_NAME := Calculator include $(BUILD_PACKAGE) ################################################## include $(CLEAR_VARS) LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libarity:arity-2.1.2.jar include $(BUILD_MULTI_PREBUILT) # Use the following include to make our test apk. include $(call all-makefiles-under,$(LOCAL_PATH))
上面的 libarity 指的就是在 Calculator 目录下面的一个jar 包.

2.预置so等资源文件

方法一:预置so等资源文件

include $(CLEAR_VARS) LOCAL_MODULE := wanghai.so LOCAL_SRC_FILES := wanghai.so LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := SHARED_LIBRARIES LOCAL_MODULE_PATH := $(TARGET_OUT)/lib/ include $(BUILD_PREBUILT)

方法二:预置so等资源文件

include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_PREBUILT_LIBS := sdfapk.so sdffff.so include $( BUILD_MULTI_PREBUILT) 备注:上面的方法是把文件预制到system/lib/里面如果要预制到system/lib/hw/下面可以参考下面 LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw语句改成了 LOCAL_MODULE_RELATIVE_PATH := hw,然后再重新编译。 网上说第一个实验path会报错,但是没有验证,实验第2中验证是正常的.

方法三:预置so等资源文件

预置so等资源文件,在Android.mk里 添加 这样一句,注意:这样的方式 如果路径不存在,这条指令 执行 失败,但 不会 报错! $(shell cp -rf $(LOCAL_PATH)/libs/*.so $(TARGET_OUT)/lib)

3.预制jar包到系统

方法1:

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := birdframework_classes:birdframework_classes.jar include $(BUILD_MULTI_PREBUILT)
include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_MODULE := birdframework LOCAL_MODULE_CLASS := JAVA_LIBRARIES LOCAL_NO_EMMA_INSTRUMENT := true LOCAL_NO_EMMA_COMPILE := true LOCAL_DX_FLAGS := --core-library LOCAL_STATIC_JAVA_LIBRARIES := birdframework_classes include $(BUILD_JAVA_LIBRARY) #这里的birdframework_classes 只是一个别名,可以随便取.

方法2:

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := xcap LOCAL_SRC_FILES := javalib.jar LOCAL_MODULE_CLASS := JAVA_LIBRARIES LOCAL_MODULE_SUFFIX := .jar include $(BUILD_PREBUILT)

4.编译一个静态JAVA库(把java代码打包为jar)

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Build all java files in the java subdirectory LOCAL_SRC_FILES := $(call all-subdir-java-files) # Any libraries that this library depends on LOCAL_JAVA_LIBRARIES := android.test.runner # The name of the jar file to create LOCAL_MODULE := sample # Build a static jar file. include $(BUILD_STATIC_JAVA_LIBRARY)

---------- cut here ------------------

解释:

1.LOCAL_PATH := $(call my-dir)  一个Android.mk file首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。在这个例子中,宏函数‘my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。 (菜鸟级别解释::=是赋值的意思,+=是追加的意思,$是引用某变量的值) 2.include $( CLEAR_VARS) CLEAR_VARS由编译系统提供((可以在 android 安装目录下的/build/core/config.mk 文件看到其定义,为 CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk)) 指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...),除LOCAL_PATH 。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。 3.LOCAL_MODULE_TAGS :=user eng tests optional user: 指该模块只在user版本下才编译 eng: 指该模块只在eng版本下才编译 tests: 指该模块只在tests版本下才编译 optional:指该模块在所有版本下都编译 4. LOCAL_STATIC_JAVA_LIBRARIES  和 LOCAL_JAVA_LIBRARIES 的区别 LOCAL_JAVA_LIBRARIES 是添加的动态库,
LOCAL_STATIC_JAVA_LIBRARIES是添加的静态库(编译会以拷贝的方式加到需要他的应用中)


LOCAL_MODULE 指定 拷贝后的apk的名字(全名),这个变量里可以有路径,但路径也会被拷贝,创建如果 是在编译整个android的源码,这个apk必须已经添加到了PRODUCT_PACKAGES 变量里,否则 不会拷贝到,相应的位置,

LOCAL_MODULE_PATH 指定拷贝的路径,如果路径不存在自己创建

LOCAL_CERTIFICATE := PRESIGNED 表示 这个apk已经签过名了,系统不需要再次 签名;

LOCAL_MODULE_CLASS 指定文件类型,apk文件用APPS, 并且 会检查 是否是apk文件,动态库so文件用SHARED_LIBRARIES ,bin文件用EXECUTABLES,其他文件 用ETC

注意:若是被预置的apk里有so库,需要将从Test.apk的 so库拷贝到 out/target/product/xxx/system/lib/目录下,若无 so 库,则去掉此步;

方法一 只能针对 一个文件,方法二 可以 针对多个文件,但 只能 把 文件 拷贝到 system/lib/ 下,
Android提供了Prebuilt编译方法,两个文件prebuilt.mk和multi_prebuilt.mk,对应的方法宏是BUILD_PREBUILT和 BUILD_MULTI_PREBUILT。
prebuilt.mk就是prebuilt的具体实现,它是针对独立一个文件的操作,multi_prebuilt.mk 可以针对多个文件的,它对多个文件进行判断,然后调用prebuilt对独立一个文件进行处理




参考: http://www.th7.cn/Program/Android/201406/212727.shtml
Android Makefile 文件讲解:  http://blog.csdn.net/yangzhiloveyou/article/details/8627969



更多相关文章

  1. NPM 和webpack 的基础使用
  2. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  3. android 内核编译成功
  4. Android环境SDK搭建问题
  5. android集成百度地图SDK 自定义keystore无法编译 Keystore was t
  6. android init 进程分析
  7. 管道的私用,删除android的流氓
  8. android 获取服务器文件流 hander
  9. Android(安卓)studio 使用Google 的AdMob

随机推荐

  1. Android(安卓)Zygote
  2. android EditText 全面阐述
  3. Android概述
  4. android framework 图解分享
  5. Android(安卓)HTTP实例 发送请求和接收响
  6. Android(安卓)中service 详解
  7. 如何删除Android自带的应用程序?
  8. Android(安卓)布局 & 一些控件
  9. Android(安卓)蓝牙4.0代码解析
  10. Android(安卓)Studio 错误:Invalid Androi