在做定制化ROM的同学一定有这样的经历:公司要求在定制化ROM里加入一些预装应用,主要有两种:①公司开发的项目,有源码;②其他应用,只有apk安装包。
一、有源码的。
【源码根目录/packages/apps/】下(或者【packages/experimental/】下,这个目录放一些实验性质的应用)新建一个文件夹,重命名为项目名称HelloAndroid,并把项目源码放进去,同时新建一个Android.mk文件,目录结构大致如下:
---AndroidMenifest.xml
---Android.mk
---src
------com/itant/test
---------HelloAndroid.java
---res
------layout
---------main.xml
------values
---------strings.xml
------drawable
---------icon.png
Android.mk文件内容如下(LOCAL_PACKAGE_NAME写自己的项目名称,一般就是你新建的文件夹名称):
# Android.mk通常需要定义好LOCAL_PATH,表示当前工作路径,函数my-dir是编译系统提供的,返回当前路径
LOCAL_PATH := $(call my-dir)
# 这一步操作主要是清空之前定义的LOCAL_XXX开头的变量,是必须要的操作。CLEAR_VARS 变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx,例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理LOCAL_PATH.
# 这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响。
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
# 定义编译模块所需的源文件
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := HelloAndroid
# 定义编译出来的目标文件,如动态库,静态库,jar包以及apk
include $(BUILD_PREBUILT)
接下来执行"只有apk安装包的步骤3",添加项目文件夹名称到core.mk文件中
然后编译即可,具体编译流程可以参考我另一篇文章安卓5.0源码编译及烧录到真机
二、只有APK文件,假设为HelloAndroid.apk
1.同样是在【源码根目录/packages/apps/】新建文件夹HelloAndroid,拷贝HelloAndroid.apk进去。
2.新建Android.mk文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := HelloAndroid
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_SRC_FILES := HelloAndroid.apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
include $(BUILD_PREBUILT)
3.在【源码根目录/build/target/product/core.mk】文件添加刚才添加的项目文件夹名称
#
# Copyright (C) 2007 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Base configuration for communication-oriented android devices
# (phones, tablets, etc.). If you want a change to apply to ALL
# devices (including non-phones and non-tablets), modify
# core_minimal.mk instead.
PRODUCT_PACKAGES += \
HelloAndroid \
BasicDreams \
Browser \
Calculator \
Calendar \
CalendarProvider \
CaptivePortalLogin \
CertInstaller \
Contacts \
DeskClock \
DocumentsUI \
DownloadProviderUi \
Email \
Exchange2 \
ExternalStorageProvider \
FusedLocation \
InputDevices \
KeyChain \
Keyguard \
LatinIME \
Launcher2 \
ManagedProvisioning \
PicoTts \
PacProcessor \
libpac \
PrintSpooler \
ProxyHandler \
QuickSearchBox \
Settings \
SharedStorageBackup \
Telecom \
TeleService \
VpnDialogs \
MmsService
$(call inherit-product, $(SRC_TARGET_DIR)/product/core_base.mk)
4.编译源码即可
参考以下
https://stackoverflow.com/questions/10579827/how-do-i-add-apks-in-an-aosp-build
https://groups.google.com/forum/#!topic/android-building/i4oaJ2DtadM
https://stackoverflow.com/questions/12643465/include-app-in-rom-as-system-app
如果你没有ROM的源码,那么可以试试XDA论坛大神的工具APK Swapper,可以从打包好的ROM中剔除不想要的预装软件,以及加入自己需要的第三方软件。
https://stackoverflow.com/questions/30865870/install-an-app-as-a-system-app-programmatically/30872375#30872375