如何在AOSP中为预构建的应用程序(没有源代码)添加额外的权限



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

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

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

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

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预构建到OS。

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

我读了这个,这个和许多其他文档,但我不知道这个应用程序的XML文件的内容;或者这有可能吗?
(这些链接对我正确了解XML文件的内容有帮助吗?This and This)


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

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

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)

  • 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;

  • 在init中启动时调用这个shell脚本作为服务。Rc文件,如:
    on boot start preinstallByMe
  • service preinstallByMe /system/bin/sh /system/preinstall/preinstall.sh class main user root group root disabled oneshot

    但似乎不叫。

  • 即使这些片段代码在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,它是工作的。
    P。S:如果你不允许调用你的脚本,你可以通过在/system/core/include/private/android_filesystem_config.h:

    中添加这样的东西来添加权限。

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

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

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

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

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

    和init。在启动完成后执行shell:

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

    我已经成功了

    你可以修改框架清单:

    frameworksbasecoreresManifest.xml
    

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

    要获得系统权限,您应该将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/private -app目录,只有apk在该目录下的应用程序才被允许使用signatureOrSystem权限而不共享平台证书。这将减少系统捆绑应用程序试图获得权限保护操作的潜在漏洞。

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

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

    更新:
    介绍:https://github.com/Drjacky/Install-Google-Play-Manually

    最新更新