一、将无源码的 APK 和它 依赖的库预置进系统,此apk可以升级
方法
---------- cut here ------------------
LOCAL_PATH := $(call my-dir)
#预置aliuyi.apk
include $(CLEAR_VARS)
LOCAL_MODULE := wwwa.apk
LOCAL_SRC_FILES := aliuyi.apk
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := APPS
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MODULE_PATH := $(TARGET_OUT)/app
include $(BUILD_PREBUILT)
#方法一:预置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)
#方法三:
预置so等资源文件,在Android.mk里 添加 这样一句,注意:这样的方式 如果路径不存在,这条指令 执行 失败,但 不会 报错!
$(shell cp -rf $(LOCAL_PATH)/libs/*.so $(TARGET_OUT)/lib)
---------- cut here ------------------
解释:
LOCAL_MODULE 指定 拷贝后的apk的名字(全名),这个变量里可以有路径,但路径也会被拷贝,创建,如果 是在编译整个Android的源码,这个apk必须已经添加到了PRODUCT_PACKAGES 变量里,否则 不会拷贝到,相应的位置,
LOCAL_MODULE_PATH 指定拷贝的路径,如果路径不存在自己创建
LOCAL_SRC_FILES 指定 源apk
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对独立一个文件进行处理。
Android.mk实例
LOCAL_MODULE := test
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_MULTILIB :=32
LOCAL_PREBUILT_JNI_LIBS:= \
lib/armeabi/libcate_bloom_jni_v1.so \
lib/armeabi/libcoo.so
LOCAL_PRIVILEGED_MODULE := true
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)
LOCAL_PRIVILEGED_MODULE := true 表示apk将编译在/system/priv-app目录下
LOCAL_MULTILIB :=32 只是用的32位的lib库(因为5.1是64位编译环境)
这里需要注意:a).LOCAL_CERTIFICATE := PRESIGNED表示APK签名使用原来签名,即第三方签名,若要使用系统签名,则可以改为LOCAL_CERTIFICATE := platform系统前面,可以使apk获得系统权限。
b).LOCAL_MODULE_PATH :=$(TARGET_OUT)/vendor/operator/app表示编译后apk放在/system/vendor/operator/app目录下面,用户可以卸载,否则不加这句,会放在/system/app/下面,用户不可以卸载。
最后
打开文件 build/target/product/${Project}.mk (其中 ${Project} 表示工程名),将 Test 添加到 PRODUCT_PACKAGES 里面。
如有so库, 将从Test.apk解压出来的 so库拷贝到alps/vendor/mediatek/${Project}/artifacts/out/target/product/${Project}/system/lib/目录下,若无 so 库,则去掉此步;
重新 build 整个工程