本文目的是实现内置apk和第三方apk通过aidl通信,着重说下,如何内置apk及内置时有关aidl的一些注意事项。
一、内置带源码的apk
1. 准备工作:
1.1 Android源码
1.2 先在Android Studio中,通过AIDL实现Service[服务端]、Client[客户端]的通信
2. 内置:有以下两种内置方式
2.1 把Service整体作为一个独立的apk进行内置
1) 在packages/apps/SagerealApp/下新建Service文件夹:把AS中Service[服务端]的src、res、adil文件夹和manifest.xml文件复制过来
2) 新建Android.mk文件,内容如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS:=optional
LOCAL_SRC_FILES := \
$(call all-java-files-under, java)
# All of our AIDL files are also compiled into the static library
LOCAL_SRC_FILES += \
aidl/com/lyl/love/Service/IMyAidlInterface.aidl
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
LOCAL_PACKAGE_NAME := Service
LOCAL_CERTIFICATE := platform #若要使用系统签名,可以使apk获得系统权限。
LOCAL_PRIVILEGED_MODULE := true
include $(BUILD_PACKAGE)
## 注意添加.aidl文件的路径,且该路径一定要在"LOCAL_SRC_FILES := $(call all-java-files-under, java)"之后添加。
## 若.aidl文件用到类类型,其对应的.java/.aidl文件其路径不用写明,在"LOCAL_SRC_FILES := $(call all-java-files-under, java)"中已包含到。
3) mm模块编译该Service apk,并push进手机
4) Client在手机上运行,即可实现第三方apk和手机内置代码的通信
2.2 把Service的关键文件内置进Android源码:
1) 把对应的MyService.java、IMyInterface.aidl文件移到vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/mediatek/settings/Service下
2) 在对应的Android.mk中添加IMyInterface.aidl的路径,及在清单文件中注册服务。注意移动后的路径。
LOCAL_SRC_FILES += \
src/com/mediatek/settings/service/IMyAidlInterface.aidl
<service android:name="com.mediatek.settings.sim.MyService" >
<intent-filter>
<action android:name="com.mediatek.settings.sim.MyService.action"/>
</intent-filter>
</service>
3) 模块编译代码vendor/mediatek/proprietary/packages/apps/MtkSettings,并push进手机
4) Client在手机上运行,也可实现第三方apk和手机内置代码的通信
3. 注意:
1). 清单文件修改、模块编译之后,一定要重启手机,才有效果;
2). 若新增方法后,模块编译后无效,重启手机试下;还无效,则要看看Client和Server的aidl文件内容是否一致,编译后重启手机试下;仍无效,再mma模块编译;还无效,再r项目。
3). Android.mk文件中的"LOCAL_CERTIFICATE := platform",表示使用系统签名,同时也要有系统的权限才可以,才可像系统apk一样获取系统数据。要获取系统权限,要在清单文件中添加:android:sharedUserId="android.uid.system" 。
二、内置不带源码的apk (以firefox为例)
1). 在packages/apps/SagerealApp/下新建firefox文件夹,把对应的apk放入,并增加对应的Android.mk文件。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Module name should match apk name to be installed
LOCAL_MODULE := firefox
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED #此时是使用自己的签名。有些apk要使用自己的签名,比如火狐浏览器apk
#添加此行,将apk放置到priv-app下
#LOCAL_PRIVILEGED_MODULE := true
LOCAL_DEX_PREOPT := false
include $(BUILD_PREBUILT)
2). 在alps/device/mediatek/common/device.mk下加上该apk即可
PRODUCT_PACKAGES += firefox
以上修改,会使用该分支下所有的项目都出现火狐浏览器,若只想针对某一项目修改,则要使用宏控。即
ifeq ($(strip $(sagereal_add_app_firefox)), yes)
PRODUCT_PACKAGES += firefox
endif
同时在对应项目的ProjectConfig.mk文件中加入以下语句即可。
sagereal_add_app_firefox = yes //sagereal/mk/MP3P_common_no_GMS/ProjectConfig.mk