> 文章列表 > 使用需要权限的系统api

使用需要权限的系统api

使用需要权限的系统api

天气app需要做埋点,但是埋点相关API已经集成到Framework.jar,如果要调用埋点需要依赖Framework.jar。

但是单独编译的apk是没有直接引用Framework的,但是如果需要去调用埋点的api就需要权限,否则就会报错,无法初始化埋点的实例。

由于app安装的位置不同所以授权的地点也不同。

例如,录音机安装在/system/priv-app/SoundRecorder目录下,那么授权白名单文件就放在/system/etc/sysconfig目录下。

天气安装在/product/app/Weather目录下,那么授权白名单的文件就放在/product/etc/sysconfig目录下。

那么授权白名单需要怎么配置呢?

如下/product/etc/sysconfig/com.test.xxxx

<?xml version="1.0" encoding="utf-8"?>
<config><hidden-api-whitelisted-app package="com.test.xxxx" />
</config>

那么问题来了,如何在编译源码的时候将这个白名单com.test.xxxx 动态的在/product/etc/sysconfig/目录下创建呢?

既然涉及到源码编译,那么还是要去配置android.mk或者android.bp文件的。

在原先的编译目录下,需要创建一个sysconfig目录,然后创建android.bp文件以及配置如下:

prebuilt_etc {name: "sysconfig_com.test.xxxx",product_specific: true,sub_dir: "sysconfig",src: "com.test.xxxx.xml",filename_from_src: true,
}

然后在编译的android.mk文件中依赖此android.bp文件即可

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := demo
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MODULE_CLASS := APPS
LOCAL_PRODUCT_MODULE := true
LOCAL_REQUIRED_MODULES := sysconfig_com.test.xxxxx
include $(BUILD_PREBUILT)

那么,当我们在编译源码的时候就会将com.test.xxxx文件动态在sysconfig目录下生效,自然就可以调用到系统隐藏api啦~