2017-02-21 85 views
0

我目前能够使用SuperSU在根设备上的应用程序中获得root访问权限。当我的应用程序请求超级用户访问权限时,会显示一个用户点击“授予”以允许权限的SuperSu对话框。如何在没有SuperSU的情况下授予root访问权限

我想能够绕过这一步,让我的应用程序获得root权限programmaticaly,而不必点击SuperSu对话框上的“授予”按钮。

我该如何解决这个问题?

+0

嗡嗡声,是不是因为一个非常具体的原因,用户应明确授予该权限? – lelloman

+0

是的,理想情况下,用户应该授予该权限。在这种情况下,我想要自动授予权限,因为SuperSU可以做到这一点,那么我的应用程序也应该能够做到这一点? – kev

+0

我的意思是,如果用户需要明确授予他的权限,自动获得该权限可能被视为恶意移动,这是因为他应该知道您的应用程序需要root权限。或者我只是太可疑... – lelloman

回答

4

我希望能够绕过这一步,让我的应用程序以编程方式获得root权限,而无需点击SuperSu对话框上的“授予”按钮。

你不行。用户必须授予您的应用程序根权限。除非您构建自己的SU管理应用程序,否则无法绕过此初始权限请求。

我提供了一个设备的应用程序,然后用户使用该设备(我自己)。只是为了提供更多的上下文,当我释放设备时,它已经拥有该应用程序,并且它已经被SuperSu授予root访问权限。所以我试图避免的情况是,应用程序可能会失去许可权,然后在外面的应用程序中再次请求。用户不懂技术,他们不会知道SuperSu对话框是什么或者如何处理它。

如果您拥有该设备,则可以在SuperSu设置中将“默认访问”更改为“授予”。您还可以根据每个应用程序更改此设置。

您在评论中提到您的应用将拥有超级用户权限。您拥有root访问权限,因此您可以更改SuperSu的共享偏好设置,以便始终授予您应用的访问权限。同样,您暗示您拥有该设备,因此您不需要以编程方式修改SuperSu参数。

如果你真的需要修改SuperSu的喜好,然后将下面的代码应该改变应用程序的访问权限设置为始终允许和禁用通知(使用android-shell):

@WorkerThread 
public static boolean tryChangingSuperSuDefaultAccess(Context context) throws Exception { 
    String packageName = context.getPackageName(); 
    PackageManager pm = context.getPackageManager(); 

    // Get the preferences for SuperSu 
    Context packageContext = context.createPackageContext("eu.chainfire.supersu", 0); 
    SharedPreferences superSuPrefs = PreferenceManager.getDefaultSharedPreferences(packageContext); 
    File superSuPrefsFile = getSharedPreferencesFile(superSuPrefs); 

    // Copy SuperSu preferences to our app's shared_prefs directory 
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); 
    File directory = getSharedPreferencesFile(preferences).getParentFile(); 
    File destination = new File(directory, "eu.chainfire.supersu.xml"); 
    int uid = pm.getApplicationInfo(context.getPackageName(), 0).uid; 
    destination.getParentFile().mkdirs(); 
    Shell.SU.run("cp \"" + superSuPrefsFile + "\" \"" + destination + "\""); 
    Shell.SU.run("chmod 0660 \"" + destination + "\""); 
    Shell.SU.run("chown " + uid + " " + uid + " \"" + destination + "\""); 

    // Now we can edit the shared preferences 
    superSuPrefs = context.getSharedPreferences("eu.chainfire.supersu", Context.MODE_PRIVATE); 

    SharedPreferences.Editor editor = superSuPrefs.edit(); 
    editor.putString(String.format("config_%s_notify", packageName), "no"); // disable SuperSu notifications 
    editor.putString(String.format("config_%s_access", packageName), "grant"); // Set access to grant for this app 
    // noinspection all 
    editor.commit(); 

    // Copy the edited shared preferences back 
    return Shell.SU.run("cp \"" + destination + "\" \"" + superSuPrefsFile + "\"").isSuccessful(); 
} 

private static File getSharedPreferencesFile(SharedPreferences preferences) 
    throws NoSuchFieldException, IllegalAccessException { 
    Field field = preferences.getClass().getDeclaredField("mFile"); 
    if (!field.isAccessible()) field.setAccessible(true); 
    return (File) field.get(preferences); 
} 

我不建议使用上面的代码。你应该透明并教育你的用户。如果您拥有该设备,就像您声称的那样,您可以使用该应用自行更改这些设置。

相关问题