预置app/apk到系统 && 预置so库进系统 && 预置普通文件和文件夹进系统

有些APP应用或者工程,如果我们想把它放进android的CODEBASE中编译,想让生成的apk直接就在system/app中,这个时候就需要用到如何把一个app编译进工程。

(1)对APP工程,首先在packages/app目录下新建工程名,比如xxxx,然后移入工程的src,res,androidmanifest.xml即可(要删除bin跟gen,易造成冲突)。配以对应的android.mk文件(也可参照现成)。内容是:

[html]  view plain  copy
  1. LOCAL_PATH:= $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3.   
  4. LOCAL_JAVA_LIBRARIES :mediatek-framework  
  5.   
  6. LOCAL_MODULE_TAGS :optional  
  7.   
  8. LOCAL_SRC_FILES := $(call all-java-files-under, src)  
  9.       
  10. LOCAL_PACKAGE_NAME :=<span style="color: rgb(255, 0, 0);"> </span><span style="color:#330033">xxxx  
  11. </span>LOCAL_CERTIFICATE :platform  
  12.   
  13. LOCAL_PROGUARD_ENABLED :full  
  14. #LOCAL_PROGUARD_FLAG_FILES :proguard.flags  
  15.   
  16. include $(BUILD_PACKAGE)  
  17. # Use the following include to make our test apk.  
  18. include $(call all-makefiles-under,$(LOCAL_PATH))  

      修改了对应的工程名就行。然后运行./mk mm xxxx,即可在out\target\product\xxxx\system\app\下生成对应的apk。 注意:一些常用名字的解释

LOCAL_MODULE :

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

LOCAL_MODULE_TAGS

user: 指该模块只在user版本下才编译
eng: 指该模块只在eng版本下才编译
tests: 指该模块只在tests版本下才编译
optional:指该模块在所有版本下都编译

LOCAL_SRC_FILES 

指定源,如果是apk或者so,指定原名;如果是apk包,指定代码路径

LOCAL_MODULE_PATH 

指定要拷贝到的路径,如果路径不存在会自己创建。如果APK要求能卸载,改成LOCAL_MODULE_PATH:=$(TARGET_OUT_DATA_APPS)

LOCAL_CERTIFICATE :

PRESIGNED :表示 这个apk已经签过名了,系统不需要再次 签名;如果要求内置的APK可以升级,则需要修改LOCAL_CERTIFICATE := PRESIGNED。

LOCAL_MODULE_CLASS :

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

LOCAL_PRIVILEGED_MODULE :

为true,表示该app会放入权限较高的priv-app目录中。

LOCAL_PATH := $(my-dir)

include $(call all-makefiles-under,$(LOCAL_PATH))

索引同级或者子目录下的其它mk,可根据具体需求修改。另外,如果有些app工程带自身的jar包,参见http://blog.csdn.net/gieghia007/article/details/5662220

(2)对APP已经是一个现成的apk了,要放进系统中。新建一个目录,把apk跟android.mk放在一起,mk内容(也可参照现成)是:

[cpp]  view plain  copy
  1. LOCAL_PATH := $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3. # Module name should match apk name to be installed  
  4. LOCAL_MODULE := xxxx  
  5. LOCAL_MODULE_TAGS := optional  
  6. LOCAL_SRC_FILES := $(LOCAL_MODULE).apk  
  7. LOCAL_MODULE_CLASS := APPS  
  8. LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)  
  9. LOCAL_MODULE_PATH := $(TARGET_OUT)/app  
  10. LOCAL_CERTIFICATE := platform  
  11. include $(BUILD_PREBUILT)  

若是被预置的apk里有so库,需要将so库也预置到系统中。

(3)以上两个过程,都要在对应的系统mk文件中给PRODUCT_PACKAGES赋值。我的路径是build\target\product\common.mk,里面的

[java]  view plain  copy
  1. PRODUCT_PACKAGES := \  
  2.     AccountAndSyncSettings \  
  3.     DeskClock \  

    在后面跟上APK包名就行了

(4)预置apk到/data/app中,即让预置的apk可以卸载。

在5.0 6.0之后的系统中,使用LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)即可实现这个功能。比如:

[cpp]  view plain  copy
  1. LOCAL_PATH := $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3.   
  4. LOCAL_MODULE := comhere  
  5. LOCAL_MODULE_TAGS := optional  
  6.   
  7. #LOCAL_PRIVILEGED_MODULE := true  
  8.   
  9. LOCAL_SRC_FILES := $(LOCAL_MODULE).apk  
  10. LOCAL_MODULE_CLASS := APPS  
  11. LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)  
  12. LOCAL_CERTIFICATE := PRESIGNED  
  13. LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)  
  14. include $(BUILD_PREBUILT)  

预置apk到data区,类似于手动安装,这种so不需要分离。但是有缺陷,即恢复工厂模式就没有了。

(5)为了解决复位后应用就丢失的缺陷,必须采用一种方法,即复位后应用需拷贝到/data//app下。方法是http://blog.csdn.net/keranCSDN/article/details/43525699,注意权限和执行时间点。

===============================预置so库进系统==============

(1)预置单个so,同级目录下的Android.mk这么写

[cpp]  view plain  copy
  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4. LOCAL_PREBUILT_LIBS := hwcomposer.rk30board.so  
  5. LOCAL_MODULE_TAGS := optional  
  6. LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)  
  7. include $(BUILD_MULTI_PREBUILT)  
(2)预置多个so。比如当前目录下有gralloc.rk30board.so和hwcomposer.rk30board.so两个文件,同目录下的Android.mk这么写即可:

[cpp]  view plain  copy
  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4. LOCAL_PREBUILT_LIBS := hwcomposer.rk30board.so  
  5. LOCAL_MODULE_TAGS := optional  
  6. LOCAL_MODULE_PATH := $(TARGET_OUT)/lib  
  7. include $(BUILD_MULTI_PREBUILT)  
  8.   
  9. include $(CLEAR_VARS)  
  10. LOCAL_PREBUILT_LIBS := gralloc.rk30board.so  
  11. LOCAL_MODULE_TAGS := optional  
  12. LOCAL_MODULE_PATH := $(TARGET_OUT)/lib  
  13. include $(BUILD_MULTI_PREBUILT)  
默认预置到system/lib/ 。Android提供了Prebuilt编译方法,两个文件prebuilt.mk和multi_prebuilt.mk,对应的方法宏是BUILD_PREBUILT和 BUILD_MULTI_PREBUILT。

prebuilt.mk就是prebuilt的具体实现,它是针对独立一个文件的操作,multi_prebuilt.mk 可以针对多个文件的,它对多个文件进行判断,然后调用prebuilt对独立一个文件进行处理。

        大量预置同级目录下的.so,比如多达几十个到system/lib中,Android.mk这样写

[cpp]  view plain  copy
  1. LOCAL_PATH := $(my-dir)  
  2. include $(CLEAR_VARS)  
  3.   
  4. libs := $(patsubst $(LOCAL_PATH)/%,%,$(wildcard $(LOCAL_PATH)/*.so))  
  5.   
  6. $(foreach i,$(libs),\  
  7.     $(eval m := $(basename $(patsubst lib/%,%,$(i)))) \  
  8.     $(eval LOCAL_PREBUILT_LIBS += $(m):$(i)) \  
  9.     $(eval $(ALL_PREBUILT):$(m)) \  
  10.     $(eval m := ) \  
  11. )  
  12. LOCAL_MODULE_TAGS := optional  
  13. include $(BUILD_MULTI_PREBUILT)  

(3)如果预置某个文件夹下的so(跟apk无关),假设是armeabi文件夹下的so到system/lib中,同级目录下的xxx.mk可以写

[cpp]  view plain  copy
  1. CUR_PATH := device/rockchip/rkpx2/carbit  
  2. sf_lib_files := $(shell ls $(CUR_PATH)/armeabi | grep .so)  
  3. PRODUCT_COPY_FILES += \  
  4.        $(foreach file, $(sf_lib_files), $(CUR_PATH)/armeabi/$(file):system/lib/$(file))  
上一级的Android.mk写
[cpp]  view plain  copy
  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(call all-makefiles-under,$(LOCAL_PATH))  

直接调用各自的.mk。

(4)到android 5.0 6.0之后,由于系统分成32位和64位,对应的so也分32位和64位,分开存放。那么预置的方法就有差别,不然会导致放不到固定的目录中

采用prebuilt 的方式,在当前so 所在目录下写 Android.mk ,内容类似如下:

[cpp]  view plain  copy
  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4. LOCAL_MODULE := 此so 库名(不加so后缀)  
  5. LOCAL_SRC_FILES_32 := xxx.so (表示是32 bit 的so)  
  6. LOCAL_SRC_FILES_64 := xxx.so (表示是64 bit的so)  
  7. LOCAL_MULTILIB := 32/64/BOTH(只编译32bit/64bit/both)  
  8. LOCAL_MODULE_CLASS := SHARED_LIBRARIES  
  9. LOCAL_MODULE_SUFFIX := .so  
  10. include $(BUILD_PREBUILT)  
比如某个apk的so只放在system/lib中,写法:

[cpp]  view plain  copy
  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4. LOCAL_MODULE := libcshell  
  5. LOCAL_SRC_FILES_32 := libcshell.so  
  6. LOCAL_MULTILIB := 32  
  7. LOCAL_MODULE_CLASS := SHARED_LIBRARIES  
  8. LOCAL_MODULE_SUFFIX := .so  
  9. include $(BUILD_PREBUILT)  

不然就会一编译就放在lib64中,修改module path无用。

如果是在32 64并存的系统上编译生成so,普通Android.mk脚本生成,会在lib和lib64下都生成。

============================预置普通文件和文件夹进系统============

续上,如果简单的把文件夹和文件,内置到system的某个目录中,假设


同级的carbit.mk如下

[cpp]  view plain  copy
  1. CUR_PATH := device/rockchip/rkpx2/carbit  
  2.   
  3. $(shell cp -af $(CUR_PATH)/carbit $(ANDROID_PRODUCT_OUT)/system/)  
  4.   
  5. PRODUCT_COPY_FILES += \  
  6.     $(CUR_PATH)/adb-ec/adb-ec:root/sbin/adb-ec \  
  7.     $(CUR_PATH)/adb-ec/usb_modeswitch-ec:root/sbin/usb_modeswitch-ec\  
  8.     $(CUR_PATH)/init.carbit.sh:system/bin/init.carbit.sh  
内置文件用PRODUCT_COPY_FILES宏,内置文件夹用sh执行拷贝命令。不过sh拷贝在编译时老会提示目录不存在的输出打印,如果不想看到这种提示,就直接把目录的每个文件单独PRODUCT_COPY_FILES。

参考原文:http://www.2cto.com/kf/201211/169358.html

参考原文:http://blog.csdn.net/yinwei520/article/details/6598476

参考原文:http://blog.csdn.net/gieghia007/article/details/5662220

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值