【发布时间】:2016-11-03 09:04:57
【问题描述】:
我的应用程序没有特定的 android 权限(例如 android.permission.CHANGE_CONFIGURATION)。
- 我没有它的源代码。
- 我正在开发 AOSP。
我像这样预构建了这个应用程序:
- 将APK放入
/device/model/apps/HERE - 在 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.
我阅读了this、this 和许多其他文档,但我不知道该XML 文件的内容用于应用程序;还是有可能?!
(这些链接是否有助于引导我正确了解 XML 文件的内容?this 和 this)
我尝试了另一种方法,但没有用(预安装应用程序并通过 shell 脚本添加权限:
注意:首先,我应该说它以前在另一个自定义 AOSP 上有效,但没有在这个上工作!
- 将APK放入
/device/model/apps/HERE - 在 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)
- preinstall.sh 的内容:
#!/system/bin/shMARK=/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."
fibusybox 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
但似乎不是调用。
-
即使 init.rc 文件中的这些 sn-p 代码也不起作用:
service installapk /system/preinstall/preinstall.sh class main oneshoton boot exec /system/preinstall/preinstall.shbusybox /system/preinstall/preinstall.shpm 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