我正在尝试编写一个Android SYSTEM应用程序,它从请求者配置文件(/data/misc/wifi/wpa_supplicant.conf)中提取Wifi密码。
使用具有root权限的adb,我可以毫无问题地阅读该文件,并以纯文本格式查看密码。
但是,当我尝试以编程方式打开文件时,我收到EACCES(Permission denied)错误。即使我的应用程序以“系统”用户身份运行(我在清单中定义了android:sharedUserId =“android.uid.system”),该应用程序也会使用系统私钥进行签名并推送到/ system / app。
我知道它可以使用系统权限来完成,因为在Android的源代码中,在frameworks / base / wifi / java / android / net / wifi / WifiConfigStore.java中有一个代码可以读取此文件。此代码在'system_server'进程下运行,该进程使用'system'用户,就像我的应用程序一样。
我的代码打开失败的文件:
reader = new BufferedReader(new FileReader(SUPPLICANT_CONFIG_FILE));
如果两个应用程序都使用'system'用户运行并具有系统权限,那么system_server如何读取此文件并且我的应用程序失败?我错过了什么?
请不要建议依赖root访问权限的解决方案,因为它与我的情况无关。我需要一个仅基于系统权限的解决方案,而不是root。
答案 0 :(得分:2)
您需要平台签名,在清单部分添加android:sharedUserId =“android.uid.system”属性,并在应用程序部分添加android:process =“system”属性。