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