代码之家  ›  专栏  ›  技术社区  ›  Dr.jacky Mateusz Kaflowski

如何向AOSP中的预构建应用程序(无源代码)添加额外权限

  •  3
  • Dr.jacky Mateusz Kaflowski  · 技术社区  · 9 年前

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

    1. 我没有它的源代码。
    2. 我正在做一个AOSP。

    我预先构建了这样的应用程序:

    1. /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))

    它工作得很好,而且我的应用程序是预先构建到操作系统的。

    现在,我想添加特定的android权限( android.permission.CHANGE_CONFIGURATION

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


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

    1. 加入APK
    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中启动时将此shell脚本作为服务调用。rc文件,如:
      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,就可以了。
    附笔: 如果不允许调用脚本,可以通过在 /system/core/include/private/android_filesystem_config.h :

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

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

    3 回复  |  直到 9 年前
        1
  •  2
  •   Nguyen    8 年前

    在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
  •  1
  •   Nir Duan    9 年前

    您可以修改 主要的 框架清单在:

    frameworks\base\core\res\Manifest.xml
    

    并更改权限 protectionLevel: 重视 "normal" 那样的话 priv-app (即使不是使用框架密钥构建的)您应该自动授予所有正常权限,但请记住,您为该特定权限建立了安全桥。

        3
  •  1
  •   Dr.jacky Mateusz Kaflowski    7 年前

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

    要将APK复制到的示例代码段 /系统/私人应用程序 :

    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应用程序目录,只有APK位于该目录中的应用程序才允许在不共享平台证书的情况下使用签名或系统权限。这将减少系统捆绑应用程序可能利用的表面积,以尝试访问权限保护操作。

    应用程序信息。FLAG_SYSTEM FLAG继续表示文档中的意思:它表示应用程序APK捆绑在/SYSTEM分区上。引入了一个新的隐藏标志flag_PRIVILEGED,它反映了访问这些权限的实际权限。

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

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