【问题标题】:How to add extra permission to a prebuilt application (no source code) in AOSP如何在 AOSP 中为预构建的应用程序(无源代码)添加额外权限
【发布时间】:2016-11-03 09:04:57
【问题描述】:

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

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

我像这样预构建了这个应用程序:

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

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.

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


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

  1. 将APK放入/device/model/apps/HERE
  2. 在 Android.mk 中添加这个 sn-p 代码

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 文件中的这些 sn-p 代码也不起作用:

    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 权限; 但是如果有人知道第二种解决方案有什么问题,我将不胜感激。

【问题讨论】:

  • 你可以反编译apk文件并修改其中的manifest,有相应的工具,例如:javadecompilers.com/apk
  • @Mixaz 我正在使用 GApps 应用程序之一。所以保留原始证书很重要。
  • 您能解释一下如何通过预构建将特定的 android 权限添加到您的应用程序中吗?
  • @ChrisSchiffhauer 你从事 AOSP 工作吗?您的 Android 操作系统版本是多少?你试过第四步吗? (在 init.rc 文件中添加您的脚本)。不管怎样,你也可以看看这个链接:github.com/Drjacky/Install-Google-Play-Manually
  • 是的,我正在使用我编写的后台服务构建 AOSP 7.1,并且我想预先授予该服务的位置权限。我会试试你的 init.rc 实现。

标签: bash shell android-permissions android-source android.mk


【解决方案1】:

在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

我已经成功了

【讨论】:

    【解决方案2】:

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

    frameworks\base\core\res\Manifest.xml
    

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

    【讨论】:

    • 你的意思是“框架”是“平台”吗?正如你所说,它为该特定权限建立了一个安全桥。
    • 作为单个应用程序的解决方法,没有必要削弱整个系统的安全性。这篇文章有更新的答案,解释了如何更改 Android.mk 以向预构建的 apk 授予必要的应用权限。
    【解决方案3】:

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

    将APK复制到/system/priv-app的示例sn-p代码:

    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

    【讨论】:

      猜你喜欢
      • 2020-06-14
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      相关资源
      最近更新 更多