2016-03-04 25 views
7

Tôi đang cố tạo trình duyệt tệp gốc, tuy nhiên, tôi gặp một số sự cố khi truy cập thư mục gốc. Khi tôi cố gắng truy cập/dữ liệu, thư mục trống.Truy cập root bằng java.io.file trên Android

Khi tôi làm điều này:

File file = new File("/data/"); 

Và sau đó yêu cầu cho các mục trong thư mục đó, nó trống rỗng. (Không có quyền truy cập root). Tôi biết làm thế nào để thực hiện các lệnh gốc đơn giản bằng cách sử dụng một Process, nhưng sau đó nó sẽ không hoạt động trên điện thoại mà không có gốc. Vì vậy, tôi cần một cái gì đó sẽ hoạt động trên tất cả các điện thoại.

Tôi đã nghĩ đến việc sử dụng File cho các thiết bị chưa được kiểm duyệt và lệnh ls cho các thiết bị gốc, nhưng không biết đó có phải là giải pháp tốt nhất hay không. Tôi cũng có thể chỉ sử dụng ls có hoặc không có gốc, nhưng tôi muốn sử dụng File.

Có cách nào để tạo trình duyệt tệp gốc, đồng thời vẫn giữ hỗ trợ cho điện thoại không có nguồn gốc không?

Cảm ơn

+0

Bạn nên kiểm tra https://github.com/Stericson/RootTools và https://github.com/Stericson/RootShell – Guillaume

+0

Tôi đã thử với phương thức 'File.listRoots()' và liệt kê các tệp thành công. và tại một thời điểm nó cho tôi thấy các thư mục hệ thống khi tôi sử dụng phương thức 'file.getParent()'. – ELITE

+0

@Guillaume Không phải chỉ dành cho các thiết bị gốc? Tôi muốn nó hoạt động trên tất cả các thiết bị. Ngoài ra tôi không thích sử dụng thư viện bên ngoài. –

Trả lời

1

Đề xuất của bạn là chính xác. Bạn không thể thực sự sử dụng File trên các thiết bị gốc để truy cập các thư mục không có sẵn mà không có gốc, vì vậy bạn chắc chắn sẽ phải dựa vào ls trong trường hợp đó. Về cơ bản bạn có một sự lựa chọn giữa việc sử dụng ls ở khắp mọi nơi và sử dụng một trừu tượng mà sẽ ẩn các chi tiết. Trong trường hợp sau, bạn sẽ có giao diện giống như File sẽ sử dụng File hoặc ls bên dưới.

Tôi nhớ đã làm việc trên cùng một vấn đề khi tôi thiết kế trình duyệt tệp của riêng mình và tôi đã chọn giải pháp thứ hai. Sử dụng File nhanh hơn, vì vậy giải pháp này có một số lợi thế về hiệu suất. Tôi cũng phải viết ls của riêng mình bởi vì tôi không muốn dựa vào hệ thống do hệ thống cung cấp vì không có sự đảm bảo nào về kết quả mà nó cung cấp.

Tôi cũng khuyên bạn nên đọc How-To SU, nó có rất nhiều chi tiết hữu ích về cách gọi đúng các lệnh.

+0

Vâng tôi đã nghĩ đến việc sử dụng cả hai phương pháp. Tôi chỉ không biết cách tốt nhất để thực hiện điều này. Làm thế nào bạn thực hiện điều này? –

+0

@SuperThomasLab Trong trường hợp của tôi, nó là một lớp 'FileItem' chứa các phương thức tương tự như' File'. Bên trong nó có hai trường, 'File' và' NativeFile'. Khi 'NativeFile' hiện diện, một số cuộc gọi được ủy quyền cho nó. 'NativeFile' chịu trách nhiệm gọi tất cả các lệnh cần thiết. – Malcolm

+0

Vì vậy, 'FileItem' là lớp tùy chỉnh của bạn thực thi các đoạn mã khác nhau cho điện thoại gốc và không được phát tán? Vì vậy, đối với các thiết bị bắt nguồn 'ls' với' su' và cho các thiết bị chưa được phát hành 'ls' với' sh'? –

Các vấn đề liên quan