如何在 AOSP 中为预构建应用程序(无源代码)添加额外权限
How to add extra permission to a prebuilt application (no source code) in AOSP
我的应用程序没有特定的 android 权限(例如 android.permission.CHANGE_CONFIGURATION
)。
- 我没有它的源代码。
- 我正在研究 AOSP。
我像这样预构建了这个应用程序:
- 将 APK 放入
/device/model/apps/HERE
- 在 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 预构建为 OS。
现在我想将特定的 android 权限 (android.permission.CHANGE_CONFIGURATION
) 添加到我的应用程序。
我阅读了, this和许多其他文件,但我不知道这个XML申请文件的内容;甚至有可能吗?!
(这些链接是否有助于指导我了解 XML 文件内容的正确方向?this and this)
我尝试了另一种方法,但没有用(预安装应用程序并通过 shell 脚本添加权限:
注意:首先,我应该说它以前在另一个自定义 AOSP 上有效,但在这个上无效!
- 将 APK 放入
/device/model/apps/HERE
- 在 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)
- 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.rc 文件中将此 shell 脚本作为启动时的服务调用,例如:
on boot
start preinstallByMe
service preinstallByMe /system/bin/sh /system/preinstall/preinstall.sh
class main
user root
group root
disabled
oneshot
不过好像不是call
甚至 init.rc 文件中的这些片段代码也无法正常工作:
service installapk /system/preinstall/preinstall.sh
class main
oneshot
on boot
exec /system/preinstall/preinstall.sh
busybox /system/preinstall/preinstall.sh
pm grant com.example.myapp android.permission.CHANGE_CONFIGURATION;
注意: 如果我从 shell 手动调用预安装,就可以了。
P.S: 如果您不允许调用您的脚本,您可以通过在 /system/core/include/private/android_filesystem_config.h
中添加这样的内容来为其添加权限:
{ 00755, AID_ROOT, AID_ROOT, 0, "system/preinstall/preinstall.sh"},
因为第二种方式(通过 shell 预安装和添加权限),在这个自定义 AOSP 中不起作用,我将添加特定的 android从一开始就通过预构建获得我的应用程序的许可; 但是如果有人知道第二种解决方案有什么问题,我将不胜感激。
您可以在 :
中修改 main 框架清单
frameworks\base\core\res\Manifest.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)
更多信息:
Some system apps are more system than others
"signatureOrSystem" permissions are no longer available to all apps residing en the /system partition. Instead, there is a new /system/priv-app directory, and only apps whose APKs are in that directory are allowed to use signatureOrSystem permissions without sharing the platform cert. This will reduce the surface area for possible exploits of system- bundled applications to try to gain access to permission-guarded operations.
The ApplicationInfo.FLAG_SYSTEM flag continues to mean what it is said in the documentation: it indicates that the application APK was bundled on the /system partition. A new hidden flag FLAG_PRIVILEGED has been introduced that reflects the actual right to access these permissions.
[来源:]
更新:
演练:https://github.com/Drjacky/Install-Google-Play-Manually
在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
我已经成功了
我的应用程序没有特定的 android 权限(例如 android.permission.CHANGE_CONFIGURATION
)。
- 我没有它的源代码。
- 我正在研究 AOSP。
我像这样预构建了这个应用程序:
- 将 APK 放入
/device/model/apps/HERE
- 在 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 预构建为 OS。
现在我想将特定的 android 权限 (android.permission.CHANGE_CONFIGURATION
) 添加到我的应用程序。
我阅读了
(这些链接是否有助于指导我了解 XML 文件内容的正确方向?this and this)
我尝试了另一种方法,但没有用(预安装应用程序并通过 shell 脚本添加权限:
注意:首先,我应该说它以前在另一个自定义 AOSP 上有效,但在这个上无效!
- 将 APK 放入
/device/model/apps/HERE
- 在 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)
- 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.rc 文件中将此 shell 脚本作为启动时的服务调用,例如:
on boot start preinstallByMe
service preinstallByMe /system/bin/sh /system/preinstall/preinstall.sh
class main
user root
group root
disabled
oneshot
不过好像不是call
甚至 init.rc 文件中的这些片段代码也无法正常工作:
service installapk /system/preinstall/preinstall.sh class main oneshot
on boot exec /system/preinstall/preinstall.sh
busybox /system/preinstall/preinstall.sh
pm grant com.example.myapp android.permission.CHANGE_CONFIGURATION;
注意: 如果我从 shell 手动调用预安装,就可以了。
P.S: 如果您不允许调用您的脚本,您可以通过在 /system/core/include/private/android_filesystem_config.h
中添加这样的内容来为其添加权限:
{ 00755, AID_ROOT, AID_ROOT, 0, "system/preinstall/preinstall.sh"},
因为第二种方式(通过 shell 预安装和添加权限),在这个自定义 AOSP 中不起作用,我将添加特定的 android从一开始就通过预构建获得我的应用程序的许可; 但是如果有人知道第二种解决方案有什么问题,我将不胜感激。
您可以在 :
中修改 main 框架清单frameworks\base\core\res\Manifest.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)
更多信息:
Some system apps are more system than others "signatureOrSystem" permissions are no longer available to all apps residing en the /system partition. Instead, there is a new /system/priv-app directory, and only apps whose APKs are in that directory are allowed to use signatureOrSystem permissions without sharing the platform cert. This will reduce the surface area for possible exploits of system- bundled applications to try to gain access to permission-guarded operations.
The ApplicationInfo.FLAG_SYSTEM flag continues to mean what it is said in the documentation: it indicates that the application APK was bundled on the /system partition. A new hidden flag FLAG_PRIVILEGED has been introduced that reflects the actual right to access these permissions.
[来源:]
更新:
演练:https://github.com/Drjacky/Install-Google-Play-Manually
在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
我已经成功了