我需要在root设备上运行一些需要更高权限的命令。例如,我们可以说chmod 777
或访问权限为--w-------
的文件(如果权限为--w-----w-
则表示app正在运行为其他组,则会有效)。
一些额外的细节:
1)使用java中的su
:
从this帖子开始,我尝试在java中使用su
,如下所示:
Process su = null;
try {
su = Runtime.getRuntime().exec("su");
su.getOutputStream().write("chmod 777 file\n".getBytes());
su.getOutputStream().write("exit\n".getBytes());
su.waitFor();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (su != null) {
su.destroy();
}
}
不会抛出任何错误,但这不会做任何事情。
2)使用java中的setWritable()
:
boolean ret = file.setWritable(true, false);
此处,ret = false
表示失败。
3)使用RootTools库:
Command cmd=new Command(0,"chmod 202 /sys/class/gpio/export");
try {
RootShell.getShell(true).add(cmd);
}catch(Exception e){
Log.d(TAG,e.getMessage());
}
运行此操作会给我:Error! Permission denied
4)使用this回答
使用课程ExecuteAsRootBase
我得到:Can't get root access or denied by user
。
5)将应用置于/system/app
由于某种原因,仍然在u0_a38
下运行!为了实现这一点,我必须手动将库.so
放在/system/libs
下。我还必须chmod 644
我的.apk
才能运行它。我真的不明白为什么我没有在root下运行,因为我在ls -l
apk
/system/app
使用了-rw-r--r-- root root 1270817 2000-01-01 01:42 com.my.app.apk
它给了我:
/system/app
6)将应用程序签名为系统应用程序(不在ps
中)
这是我尝试的最后一件事。
按照these的说明,我可以签名并安装该应用。我从adb shell
调用u0_a38
来检查它是否以root身份运行,但发现它在android:sharedUserId="android.uid.shared"
下运行。
注意:即使在签名后作为系统应用安装,我也无法使用Failure [INSTALL_FAILED_SHARED_USER_INCOMPATIBLE]
安装应用,因为它给了我:/system/app
。因此,作为系统应用程序签名的应用程序会从清单中省略此行。
7)在ls -l
与 5 中的完全相同。
当我在/system/app
输入-rw------- root root 1303459 2000-01-01 01:02 com.my.app.apk
时,我得到了:
"id"
然而,在应用中运行uid=10038(u0_a38) gid=10038(u0_a38) groups=1015(sdcard_rw),1028(sdcard_r),50038(all_a38)
,我知道它实际上是以:
android:sharedUserId="android.uid.system"
8)无论错误如何设置adb install
所以即使我无法使用Failure [INSTALL_FAILED_SHARED_USER_INCOMPATIBLE]
进行此安装,因为错误:adb push
我仍然继续扣动扳机。我使用.apk
将/system/app
转换为/system/libs
,然后手动将本机库添加到W/PackageManager( 2652): Signature mismatch for shared user : SharedUserSetting{411d82d8 android.uid.system/1000}
D/PackageManager( 2652): No files in app dir /vendor/app
E/PackageManager( 2652): Package com.my.app has no signatures that match those in shared user android.uid.system; ignoring!
,重新启动设备以让系统将其卸载。然后我在启动时遇到了这个错误:
android.uid.*****
所以我假设制造商提供的密钥可能不是正确的。我找到了here,这是制造商网站的链接。
或
This可以追溯到一段时间,不确定它是否仍然相关。我对删除该部分文件犹豫不决,但我很可能很快就会尝试删除。我不知道如何从packages.xml
中移除$this->_defaultOrderBy = 'a.some_date';
$this->_defaultOrderWay = 'ASC';
不会影响已安装在系统上的应用。
除了使用新密钥重建之外还有什么可以做的吗?或者这几乎是一切吗?
答案 0 :(得分:0)
我无法发表评论,但我想知道您尝试执行此操作的设备/操作系统。一些4.4版本的Android在执行模式下有SELinux,这会阻止你似乎想做的一些操作。但是如果您的设备是root用户,听起来就是这样,您可以在命令行中运行su setenforce 0
,这将使SeLinux处于许可模式并希望解决您的问题。
答案 1 :(得分:0)
在运行Android 7.1.1的root设备上,在shell上运行{
"kind": "youtube#videoListResponse",
"etag": "\"...\"",
"pageInfo": {
"totalResults": 1,
"resultsPerPage": 1
},
"items": [
{
"kind": "youtube#video",
"etag": "\"...\"",
"id": "...",
"snippet": {
"publishedAt": "...",
"channelId": "...",
"title": "...",
"description": "...",
"thumbnails": { ... },
"channelTitle": "...",
"tags": [ ... ],
"categoryId": "...",
"liveBroadcastContent": "...",
"localized": {
"title": "...",
"description": "..."
},
"defaultAudioLanguage": "..."
}
}
]
}
允许我的应用执行提升的特权操作,例如重启。