如何在 android 预制apk

来源:互联网 发布:随机森林算法matlab 编辑:程序博客网 时间:2024/04/30 14:24

以下内置方法是基于mtk平台预制资源的学习,参考了各种文档总结的。

内置apk资源的分类:

以下以内置一个flashlight.apk为例。


一:内置不可以卸载apk

1 .1:内置有源码的apk


1)     在 trunk/packages/apps路径创建一个新文件夹flashlight

2)     把flashlight.apk源代码的bin ,gen文件删掉,再把源码拷贝到flashlight文件夹下

3)     在flashlight文件夹下创建一个 Android.mk的文件,把下面内容拷贝到Android.mk文件里面:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := FlashLight
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)

要注意LOCAL_PACKAGE_NAME必须是唯一的,如果已经有FlashLight了则必须重新命名。

4)     打开文件 device\mediatek\common\device.mk将 FlashLight 添加到 PRODUCT_PACKAGES 里面。

PRODUCT_PACKAGES += FlashLight

可以用一个宏来控制

ifeq (yes, $(strip $(MY_FLASHLIGHT_APP)))
    PRODUCT_PACKAGES += FlashLight
endif

如果哪个项目需要则在对应的Project.mk配置文件打开:MY_FLASHLIGHT_APP= yes

5)     重新 build 整个工程



1.2:内置无源码的apk

1)     在 packages/apps 下面以需要预置的 APK 名字创建文件夹,以预置一个名为Flashlight的APK为例

2)     将 Flashlight.apk 放到 packages/apps/flashlight 下面

3)     在  packages/apps/flashlight 下面创建文件 Android.mk,拷贝如下到文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Module name should match apk name to be installed

LOCAL_MODULE := Flashlight

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(LOCAL_MODULE).apk

LOCAL_MODULE_CLASS := APPS

LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

 

LOCAL_PREBUILT_JNI_LIBS:= \

@lib/armeabi/libtest.so  \

@lib/armeabi/libtest2.so 

 

LOCAL_CERTIFICATE := PRESIGNED

include $(BUILD_PREBUILT)

 

若无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抽离出来

 

4)     打开文件 device\mediatek\common\device.mk

 将 flashlight 添加到 PRODUCT_PACKAGES 里面。

PRODUCT_PACKAGES += Flashlight

5)     重新 build 整个工程

注:如果App使用System Level的permission,需要預置到/system/priv-app底下 (原在/system/app)。

修改Android.mk,增加LOCAL_PRIVILEGED_MODULE := true,以声明app需要放在/system/priv-app下。


二:内置可以卸载的apk

2.1:内置恢复出厂设置可以恢复的apk

1在 vendor\mediatek\proprietary\binary\3rd-party\free下面以需要预置的 APK 名字创建文件夹,以预置一个名为Flashlight的APK为例

2 将Flashlight.apk 放入vendor\mediatek\proprietary\binary\3rd-party\free\flashlight下面

3 在vendor\mediatek\proprietary\binary\3rd-party\free\flashlight 下面创建文件 Android.mk,文件内容如下

 

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

 

# Module name should match apk name to be installed

LOCAL_MODULE := Flashlight

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(LOCAL_MODULE).apk

 

LOCAL_MODULE_CLASS := APPS

LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

LOCAL_CERTIFICATE := PRESIGNED

 

LOCAL_MODULE_PATH := $(TARGET_OUT)/vendor/operator/app

include $(BUILD_PREBUILT)

 

2 打开文件device\mediatek\common\device.mk

将 Test 添加到 PRODUCT_PACKAGES 里面。

PRODUCT_PACKAGES += Flashlight

3 然后重新build整个工程

 

请注意:

若需要apk作为32bitapk运行,则需要在Android.mk中定义

LOCAL_MULTILIB :=32


2.2:内置恢复出厂设置不可以恢复的apk

1)     在 packages/apps 下面以需要预置的 APK 名字创建文件夹,以预置一个名为Flashlight的APK为例

2)     将 Flashlight.apk 放到 packages/apps/flashlight 下面

3)     在  packages/apps/flashlight 下面创建文件 Android.mk,文件内容如下:

 

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

 

# Module name should match apk name to be installed

LOCAL_MODULE := Flashlight

LOCAL_MODULE_TAGS := optional

 

LOCAL_SRC_FILES := $(LOCAL_MODULE).apk

LOCAL_MODULE_CLASS := APPS

LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

# LOCAL_PRIVILEGED_MODULE := true

LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)

 

LOCAL_CERTIFICATE := PRESIGNED

include $(BUILD_PREBUILT)

 

4)     打开文件 device\mediatek\common\device.mk

 将 Test 添加到 PRODUCT_PACKAGES 里面。

PRODUCT_PACKAGES += Flashlight

5)     重新 build 整个工程

注意:这个比不能卸载的多了一句

LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)



以上内置apk首先最好用宏控,做如下配置:

在/trunk/device/mediatek/common/device.mk中添加

ifeq (yes, $(strip $(HQ_FLASHLIGHT_APP)))
    PRODUCT_PACKAGES += FlashLight
endif


1 0