SOFIA is a simulator for Arduino boards developed in Java for Android devices. It works executing assembly instructions from the board's microcontroller (read from the hexadecimal file generated by the compiler or assembler).
What does it do?
SOFIA can simulate Arduino UNO, but not all modules of Arduino UNO are supported. So far, you can simulate:
Timers 0, 1 and 2
ADC (Analog to Digital Converter)
USART (still limited)
New modules are being developed and new boards may be added in the future.
Who can use it?
For those who'd like to learn about Arduino programming, SOFIA may be a good starting point. With SOFIA you'll be able to run your codes with no need of any electronic component and with no fear of accidentally break anything. If you are using an Arduino IDE for Android (like ArduinoDroid), you can do all the work (code and simulation) using only your smartphone.
SOFIA is not exclusively designed for students, though. You can use some of SOFIA's tools to help you to debug a project, it feats memory visualization, frequency and duty cycle meter and memory usage display. Keep in mind that SOFIA is still experimental and it's not that fast like and Arduino.
What will I need to use it?
Basically, an Android device (with Android Lollipop, minimum) is all you need to run the simulator, but you will still need a manner to generate the hexadecimal file to be simulated.
As suggested, you can use ArduinoDroid to write and build your code, and then import the hexadecimal file to SOFIA.
Another option is to use the Arduino IDE to build your codes and then copy the hexadecimal file to your phone manually. If you are a Linux user, you can get a modified version of Arduino IDE that will do it automatically for you.
Also, you can always write assembly codes directly and then use an assembler (like AVRA) to generate your hexadecimal files.