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. android集成百度地图SDK 自定义keystore无法编译 Keystore was t
  2. Android:启动页有短暂白屏的解决方法
  3. 关于Android生命周期方法调用return的问题
  4. android 获取服务器文件流 hander
  5. android颜色设使用方法
  6. android 点击返回键退出程序的方法
  7. Android studio+真机 运行报错[INSTALL_FAILED_INSUFFICIENT_STO
  8. 在android中创建bitmap避免内存不足的方法

随机推荐

  1. 在activity中调用Application 出现androi
  2. Android——编译release版签名系统
  3. Android开发书籍和教程
  4. android模拟器介绍和基本使用
  5. 使用GDB调试Android(安卓)Native Lib
  6. 开发环境搭建
  7. Android——Toast重复显示解决方法
  8. android 获取屏幕分辨率
  9. Ubuntu eclipse下android virtual device
  10. Android应用程序上传错误The package nam