2013-07-09 27 views
9

Tôi đã thử sử dụng mọi thứ trên Janino trên Android và đã kết luận rằng chúng chỉ đơn giản là không hoạt động trong máy ảo Dalvik.Soạn chuỗi dưới dạng mã trong khi chạy trên Android

Vì vậy, Im chỉ cần đặt một câu hỏi đơn giản: Trên Android, Có thể biên dịch chuỗi chứa mã trong khi chạy để sử dụng trong ứng dụng hay không. Nếu có, có thư viện nào cho phép tôi làm như vậy và/hoặc bạn có thể chia sẻ một ví dụ về cách thực hiện nó không?

Đối (rất đơn giản) Ví dụ, Nếu tôi có một đối tượng String chứa sau:

public class Adder{ 

    int x; 
    int y; 

    public Adder(int x,int y) { 
    this.x = x; 
    this.y = y; 
    } 

    public int add() { return x+y;} 

} 

Là một trong những dòng khổng lồ của chuỗi. Có cách nào tôi có thể xử lý nó để tạo ra một thể hiện của một đối tượng Adder vì vậy tôi có thể gọi phương thức add(), thông qua API phản ánh?

Chỉnh sửa Tôi đã cố gắng giải thích beanshell nhưng nó đã được chứng minh là quá chậm. Im tìm kiếm một cái gì đó nhanh hơn một chút, giống như Janino

Trả lời

7

ImagePlayground là một ứng dụng Android nguồn mở thực hiện việc này bằng cách sử dụng Dexmaker và ngôn ngữ lập trình tùy chỉnh.

5

Bạn có thể có một cái nhìn tại dexmaker: https://github.com/crittercism/dexmaker

Nó có vẻ là một trận giao hữu tương đương Android để ASM hoặc cglib; nó tạo ra các tệp .dex thay vì tệp .class.

+1

Ive xem qua tài liệu của nó nhưng không có đầu mối làm thế nào tôi có thể sử dụng nó để biên dịch một chuỗi mã như mã. Từ những gì nó có vẻ (ít nhất là trong ví dụ thế giới hello), tôi sẽ không thể sử dụng nó để thực sự biên dịch Strings. Tôi nhấn mạnh phần chuỗi bởi vì người dùng cần tạo một biểu thức toán học cần được biên dịch và đánh giá thành một đôi. – sourdesi

+2

Yikes, tự động biên dịch dữ liệu người dùng nhập vào có vẻ giống như một hạt khó khăn để crack. Bạn sẽ phải phân tích chuỗi đó cho các phần để xây dựng và phương trình "phương trình" bằng cách sử dụng dexmaker. tức là "2 * 4/6" Bạn chắc chắn có thể sử dụng dexmaker để tự động xây dựng một phương pháp và sau đó chạy nó, nhưng nó muốn được khá lỗi dễ bị thử và phân tích trên bay như thế. Nếu bạn có quyền truy cập vào một Java-> JS bridge, bạn có thể sử dụng một cái gì đó như mathjs (http://mathjs.org/) nhưng thậm chí nó chỉ sẽ đánh giá những gì được đưa vào nó, không phân tích nó. – Durandal

+0

Đúng, nó đã làm tôi thất vọng trong một tuần nay. Tôi đã được thông qua tất cả mọi thứ từ trình biên dịch để đánh giá biểu hiện cho ngôn ngữ kịch bản và tất cả mọi thứ hoặc là quá chậm hoặc không làm việc. Tuy nhiên, tôi vẫn chưa mất hy vọng, Ill đã tìm ra cách – sourdesi

2

Về cơ bản bạn muốn trình biên dịch Java/Dalvik mà bạn có thể gọi chương trình, tương tự như của Java javax.tools. Câu trả lời ngắn gọn là nó không thể hiện tại.

+1

Tại sao bạn nói điều đó là không thể? – danfuzz

+0

Dường như tôi sai. Nhưng không phải khả năng tạo và chạy mã trong thời gian chạy có tác động bảo mật nghiêm trọng không?Sẽ rất quan tâm đến việc biết Android làm gì để giảm thiểu bất kỳ vấn đề tiềm ẩn nào. – Kai

+1

Mô hình bảo mật của Android dựa trên các quy trình như đơn vị tin cậy và cách ly. Như vậy, không quan trọng là một quá trình có thể tải mã mới, mỗi lần. Đây là lý do tại sao mã ứng dụng gốc (không phải VM) trên Android không thay đổi các thuộc tính bảo mật của hệ thống. Nguy cơ bảo mật là nếu bạn có thể lừa một quy trình hệ thống (có nghĩa là, một quy trình đặc quyền) vào việc chạy mã xấu. Tuy nhiên, điều đó không liên quan gì đến máy ảo (vì mã xấu có thể là mã gốc). – danfuzz

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