3

我有一个没有特定 android 权限的应用程序(例如android.permission.CHANGE_CONFIGURATION)。

  1. 我没有它的源代码。
  2. 我正在开发 AOSP。

我预先构建了这个应用程序,例如:

  1. 放入APK/device/model/apps/HERE
  2. 在 Android.mk 中添加这些代码段:

define PREBUILT_templateByMe LOCAL_MODULE := $(1) LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_CERTIFICATE := PRESIGNED LOCAL_SRC_FILES := $$(LOCAL_MODULE).apk LOCAL_REQUIRED_MODULES := $(2) include $(BUILD_PREBUILT) endef

define PREBUILT_APP_templateByMe include $$(CLEAR_VARS) LOCAL_MODULE_TAGS := optional $(call PREBUILT_templateByMe, $(1), $(2)) endef

prebuilt_appsByMe := \ myapp

$(foreach app,$(prebuilt_appsByMe), \ $(eval $(call PREBUILT_APP_templateByMe, $(app),))) include $(call all-makefiles-under,$(LOCAL_PATH))

它工作得很好,并且 myapp 预构建到操作系统中。

现在我想将特定的 android 权限(android.permission.CHANGE_CONFIGURATION)添加到 myapp。

我阅读了这个这个和许多其他文档,但我不知道应用程序的这个 XML 文件的内容;还是有可能?!
(这些链接是否有助于指导我正确了解 XML 文件的内容?这个这个


我尝试了另一种方法,但没有用(预安装应用程序并通过 shell 脚本添加权限:
注意:首先,我应该说它以前在另一个自定义 AOSP 上有效,但在这个上无效!

  1. 放入APK/device/model/apps/HERE
  2. 在 Android.mk 中添加此代码段

include $(CLEAR_VARS) LOCAL_MODULE := myapp.apk LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := ETC LOCAL_MODULE_PATH := $(TARGET_OUT)/preinstall LOCAL_SRC_FILES := myapp.apk include $(BUILD_PREBUILT)

include $(CLEAR_VARS) LOCAL_MODULE := preinstall.sh LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := ETC LOCAL_MODULE_PATH := $(TARGET_OUT)/preinstall LOCAL_SRC_FILES := preinstall.sh include $(BUILD_PREBUILT)

  1. preinstall.sh 的内容:

#!/system/bin/sh
MARK=/data/local/symbol_thirdpart_apks_installed PKGS=/system/preinstall/
if [ ! -e $MARK ]; then echo "booting the first time, so pre-install some APKs."
busybox find $PKGS -name "*\.apk" -exec sh /system/bin/pm install {} \;
touch $MARK echo "OK, installation complete." fi
busybox sh /system/bin/pm grant com.example.myapp android.permission.CHANGE_CONFIGURATION;

  1. 在 init.rc 文件中将此 shell 脚本作为服务调用,例如:
    on boot start preinstallByMe

service preinstallByMe /system/bin/sh /system/preinstall/preinstall.sh class main user root group root disabled oneshot

但似乎它不是调用。

  1. 即使 init.rc 文件中的这些代码段也不起作用:

    1. service installapk /system/preinstall/preinstall.sh class main oneshot

    2. on boot exec /system/preinstall/preinstall.sh

    3. busybox /system/preinstall/preinstall.sh
    4. pm grant com.example.myapp android.permission.CHANGE_CONFIGURATION;

注意:如果我手动从 shell 调用 preinstall,它就可以工作。
PS:如果你不允许调用你的脚本,你可以通过添加这样的东西来添加权限/system/core/include/private/android_filesystem_config.h

{ 00755, AID_ROOT, AID_ROOT, 0, "system/preinstall/preinstall.sh"},

原因第二种方式(预安装并通过 shell 添加权限),在这个自定义 AOSP 中不起作用,我将通过预构建从头开始向我的应用程序添加特定的 android 权限;但是,如果有人知道第二种解决方案有什么问题,我将不胜感激。

4

3 回答 3

2

在 shell 脚本文件中,您必须使用:

pm grant com.example.myapp android.permission.CHANGE_CONFIGURATION

并将 shell 脚本复制到 /system/bin/

在 init.rc 中,您在启动完成后执行 shell:

on property:sys.boot_completed=1
   exec /system/bin/preinstall.sh

我已经成功了

于 2017-10-29T09:18:06.570 回答
1

您可以在以下位置修改框架清单:

frameworks\base\core\res\Manifest.xml

并将权限protectionLevel:值更改为"normal",这样priv-app(即使没有使用框架密钥构建)您应该自动授予所有正常权限,请记住您为该特定权限设置了安全桥。

于 2016-11-07T16:21:14.433 回答
1

要获得系统权限,您应该将 APK 放在/system/priv-app文件夹中。
注意:在 Kitkat 之前,系统分区上的所有 APK 都可以使用这些权限。

将 APK 复制到的示例代码段/system/priv-app

include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := apkname.apk
LOCAL_MODULE_CLASS := APPS
LOCAL_PRIVILEGED_MODULE := true
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MODULE_PATH := $(TARGET_OUT)/priv-app
LOCAL_SRC_FILES := apkname.apk
include $(BUILD_PREBUILT)

了解更多信息:

某些系统应用程序比其他系统应用程序更系统“signatureOrSystem”权限不再适用于 /system 分区中的所有应用程序。取而代之的是一个新的 /system/priv-app 目录,并且只有 APK 在该目录中的应用程序才被允许使用 signatureOrSystem 权限而不共享平台证书。这将减少可能利用系统捆绑应用程序来尝试访问受权限保护的操作的表面积。

ApplicationInfo.FLAG_SYSTEM 标志仍然是文档中所说的意思:它表示应用程序 APK 捆绑在 /system 分区上。引入了一个新的隐藏标志 FLAG_PRIVILEGED,它反映了访问这些权限的实际权限。

[来源:https ://stackoverflow.com/a/20104400/421467 ]

更新:
演练:https ://github.com/Drjacky/Install-Google-Play-Manually

于 2016-11-09T06:08:30.080 回答