DroidScript also formerly known as AndroidScript, is a javascript framework (more of a bridge between native android api’s and jacvascript using V8 normally*.
That means you can create interfaces natively, no mimicking using HTML or using another rendering engine.
That also means the hundreds of lines of Java or Kotlin (XML or Using Jetpack Compose) you have to write can be reduced to 1 to 10 for every Api and component.
Everything is as clear as daytime.
Please note i am not affiliate with DroidScript, i am not an employee, and i just build plugins for use by other developers for free.
That comes down to timing, just like Haxe its initial release never gained it traction, even though both are good.
But that doesn’t mean its not being used widely.
Also its path has been a rocky one, the following trials and tribulations have contributed:
DroidScript is an offline ide that allows access to Api’s like file exposure and given this state, it means bad actors could do illegal activities and could be tired to the application using its package name
Because of this DroidScript has been outed for AdMob Misuse, which could have came from bad actors running unbuilt projects on the IDE, which exploit AdMob. Therefore after the 2020 Incident, Almost banning it, its not supported anymore.
I’ve tried to summarize the AdMob Misuse Issue, its very controversial debate. Hacker News Thread
DroidScript code is available to view fully, the java Implementation, js Bridge (app.js) and Documentation can all be found on GitHub, however its a paid platform.
I’m a for free and open things guy, but i have a special case here, given maintenance of the project since 2014 and supporting alot of the messy javascript ecosystem.
To Me 0.49$ is great, remember you can use it even without paying, only payment required for building projects.
This code block, creates a layout and adds a progress bar.
DroidScript
/* Use J2V8 Instead Of V8 */
cfg.Fast
/* Import Material 2 */
cfg.MUI /* Import Material 3 Plugin, Built By Me */ app.LoadPlugin('Material3') function OnStart(){ app.CreateMaterial3(); lay = ui.createLayout('Linear','FillXY') progressLoader = ui.addProgressBar('linear',0.85,lay) progressLoader.SetMargins(null,0.4) progressLoader.SetValue(79) app.AddLayout(lay)
}
Java
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ProgressBar;
import android.widget.RelativeLayout; public class MainActivity extends AppCompatActivity { private RelativeLayout mainLayout; private ProgressBar progressLoader; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mainLayout = findViewById(R.id.main_layout); progressLoader = findViewById(R.id.progressLoader); progressLoader.setPadding(0, 0, 0, 0); // Adjust padding if needed }
}
And :
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp"> <ProgressBar android:id="@+id/progressLoader" style="@android:style/Widget.ProgressBar.Horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:progress="79" android:layout_marginTop="160dp" /> </RelativeLayout>
On a large project i.e Reddit, it would be easier to do this on DroidScript, less time swapping between XML and Java, just statements.
Another Example Using Camera :
DroidScript
function OnStart()
{ lay = app.CreateLayout( "Linear", "VCenter,FillXY" ); cam = app.CreateCameraView( 0.8, 0.4 ); cam.SetOnReady( cam_OnReady ); lay.AddChild( cam ); app.AddLayout( lay );
} function cam_OnReady() {
cam.StartPreview();
}
Java
- Android Manifest
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" android:required="true"/>
import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView; import java.io.IOException; public class CameraActivity extends Activity implements SurfaceHolder.Callback { private Camera mCamera; private SurfaceView mSurfaceView; private SurfaceHolder mSurfaceHolder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_camera); mSurfaceView = findViewById(R.id.surfaceView); mSurfaceHolder = mSurfaceView.getHolder(); mSurfaceHolder.addCallback(this); } @Override public void surfaceCreated(SurfaceHolder holder) { mCamera = Camera.open(); try { mCamera.setPreviewDisplay(holder); mCamera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // No need to handle this for simplicity } @Override public void surfaceDestroyed(SurfaceHolder holder) { mCamera.stopPreview(); mCamera.release(); }
}
- Layout XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <SurfaceView android:id="@+id/surfaceView" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>
Quick OverView
- DroidScript detects what you need and takes care of permissions
- DroidScript supports native android development and in the future a WORA viewpoint, except backend lol ðŸ˜ðŸ˜ðŸ˜.
I will do a much better explained part 2 if this does well
or i can squeeze whatever motivation i have.
Sorry For Mentioning Expo, You Wouldn’t Read ðŸ«
Ill cover it on the next so you better follow, or else you will break a database and have your code sql injected and fired. ðŸ«