LayoutCast


Source link: https://github.com/mmin18/LayoutCast

Android SDK sucks. It's so slow to build and run which waste me a lot of time every day.

Motivation

Facebook Buck http://github.com/facebook/buck build is fast. However, the biggest problem with Buck is, it requires you to change a lot of codes, and restructs your project in small modules. Indeed, it is troublesome to just make it work properly on the existing android project, especially if you have big project. I have tried using Buck build system instead of Gradle on my test project. However, it took me a week just to make it work.

What I needs is a build tool that is easy to setup, fast as Buck, and provide a Run button in Android Studio. So I created LayoutCast.

LayoutCast is a little tool to help with that, it will cast every changes in your Java source code or resources (including library project) to your phone or emulator within 5 sec, and does not restart your application.

???????????????????????????????????????????????????????

Youtube demo video: https://youtu.be/rc04LK2_suU

??: http://v.youku.com/v_show/id_XMTMwNTUzOTQ3Mg

Features

  • Fast cast code and resource changes, usually less than 5 sec.
  • Cast does not reset your application. The running activity stack will be kept.
  • Easy to setup, only add few lines of code.
  • Support both eclipse and AndroidStudio project.
  • Provide a AndroidStudio plugin to click and cast.

Limitations

  • LayoutCast only support Mac (for now)
  • Cast Java code only support ART runtime (Android 5.0)

Benchmarks

Here is how it compared to Gradle and Facebook Buck:

The test machine is a 2015 MBP with a 2014 MotoX.

The test project's apk is about 14.3MB, which contains 380k lines of java code and 86k lines of xml files.

Getting Started for Android Studio / Intellij

1. Install Plugin

If you have already done that, you can skip this step.

  1. Download Android Studio / Intellij plugin https://github.com/mmin18/LayoutCast/raw/master/ide/IDEAPlugin/IDEAPlugin.jar
  2. In Android Studio, go to Preferences > Plugins > Install plugin from disk...
  3. Choose the downloaded file from step #1 to install the plugin.

After restart, you should find a button at right of the run section:

2. Android Project & Build System Changes

First, you need to setup your project. Add below dependency in your build.gradle:

dependencies {
  compile 'com.github.mmin18.layoutcast:library:1.+@aar'  ... 
}
 

Second, add the following code in your main application class inside onCreate() method. And since LayoutCast only necessary when you develop, you should always check if BuildConfig.DEBUG == true.

public class MyApplication extends Application {
  @Override  public void onCreate() {

super.onCreate();

 if (BuildConfig.DEBUG) {

 LayoutCast.init(this);

}
  
}
 
}
 

Thrid, don't forget to check if your Application class is registered in AndroidManifest.xml:

<application
  android:name=".MyApplication"  ... 

Fourth, add special activity class (from LayoutCast library) called ResetActivity in your manifest, this activity will be used to restart and restore our application activity stack.

<activity android:name="com.github.mmin18.layoutcast.ResetActivity" /> 

And make sure you have the network permission in your AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" /> 

3. Run and cast

Run the application (in device or emulator), then try to make some changes for resources file or java file.

After that, click the LayoutCast button in toolbar (on the right of Run button) / go to menu Tools> Layout Cast.

It will show the result above status bar:

Getting started for Eclipse

1. Prepare the cast script

I haven't written the Eclipse plugin yet, so if you need to use it on a eclipse project, you can try to use the command line.

You can get the script here https://raw.githubusercontent.com/mmin18/LayoutCast/master/cast.py. Put the script in project root dir or anywhere you like. Since it is written in Python 2.7 (make sure you have installed the right version).

2. Android Project & Build System Changes

To get it work, we will need to download the LayoutCast library https://github.com/mmin18/LayoutCast/raw/master/libs/lcast.jar and put it to your /libs folder.

The project structure will remain the same.

3. Run and Cast

Run the application first, and open terminal and execute python cast.py under your project's folder:

cd <project path> python cast.py 

Or you can specify the path in args:

python cast.py <project path> 

How it Works

When LayoutCast.init(context); called, the application will start tiny http server in the background, and receive certain commands. Later on, the cast script running on your computer will communicate with your running app which is running through ADB TCP forward.

When the cast script runs, it will scan all possible ports on your phone to find the running LayoutCast server, and get the running application's resource list with its id, then compiled to public.xml. In which, it will be used later to keep resource id index consistent with the running application.

The cast script scans your project folder to find the /res folder, and all dependencies inside /res folder. You can run the aapt command to package all resources into res.zip, and then upload the zip file to the LayoutCast server to replace the resources of the running process. Then, it calls the Activity.recreate() to restart the visible activity.

Usually the activity will keep its running state in onSaveInstanceState() and restore after coming back later.

Troubleshootings

  • It can only find /src folder under <project>/src or <project>/src/main/java
  • It can only find /res folder under <project>/res or <project>/src/main/res
  • You can add or replace resources, but you can't delete or rename resources (for now)
  • If cast failed, clean your project, remove /bin and /build and rebuild again may solve the problem

Resources

Pretty print the result of Android lint tool. Would work great when you run lint as part of continuous integration flow.

This lib provides simple and fluent API for creating Android Spannable.

An android library containing most of the helper classes every android developer needs.

The Problem

Every Android developer faces few problems while developing Android Apps. Listing down some of them, which I have faced everytime I create a new android project.

  1. The problem of writing boilerplate code while creating Activities, Fragments is annoying.
  2. Need of readymade methods which can come handy such as showing a toast, or showing a progress dialog or launching a new activity.
  3. The problem of applying proper styles and themes to activities and handling those for pre-lollipop and post-lollipop.

What if we had a library which takes care of all these problems and let the developers concentrate on writing the actual business logic and create awesome functionalities.

The Solution

Using the Helper library developer can solve the above mentioned problems. Using this Helper library is pretty simple.

Ready to use one time password component.

A simple and easy to use information view for Android.

An Android wrapper for the Rome2Rio API.

Topics


2D Engines   3D Engines   9-Patch   Action Bars   Activities   ADB   Advertisements   Analytics   Animations   ANR   AOP   API   APK   APT   Architecture   Audio   Autocomplete   Background Processing   Backward Compatibility   Badges   Bar Codes   Benchmarking   Bitmaps   Bluetooth   Blur Effects   Bread Crumbs   BRMS   Browser Extensions   Build Systems   Bundles   Buttons   Caching   Camera   Canvas   Cards   Carousels   Changelog   Checkboxes   Cloud Storages   Color Analysis   Color Pickers   Colors   Comet/Push   Compass Sensors   Conferences   Content Providers   Continuous Integration   Crash Reports   Credit Cards   Credits   CSV   Curl/Flip   Data Binding   Data Generators   Data Structures   Database   Database Browsers   Date &   Debugging   Decompilers   Deep Links   Dependency Injections   Design   Design Patterns   Dex   Dialogs   Distributed Computing   Distribution Platforms   Download Managers   Drawables   Emoji   Emulators   EPUB   Equalizers &   Event Buses   Exception Handling   Face Recognition   Feedback &   File System   File/Directory   Fingerprint   Floating Action   Fonts   Forms   Fragments   FRP   FSM   Functional Programming   Gamepads   Games   Geocaching   Gestures   GIF   Glow Pad   Gradle Plugins   Graphics   Grid Views   Highlighting   HTML   HTTP Mocking   Icons   IDE   IDE Plugins   Image Croppers   Image Loaders   Image Pickers   Image Processing   Image Views   Instrumentation   Intents   Job Schedulers   JSON   Keyboard   Kotlin   Layouts   Library Demos   List View   List Views   Localization   Location   Lock Patterns   Logcat   Logging   Mails   Maps   Markdown   Mathematics   Maven Plugins   MBaaS   Media   Menus   Messaging   MIME   Mobile Web   Native Image   Navigation   NDK   Networking   NFC   NoSQL   Number Pickers   OAuth   Object Mocking   OCR Engines   OpenGL   ORM   Other Pickers   Parallax List   Parcelables   Particle Systems   Password Inputs   PDF   Permissions   Physics Engines   Platforms   Plugin Frameworks   Preferences   Progress Indicators   ProGuard   Properties   Protocol Buffer   Pull To   Purchases   Push/Pull   QR Codes   Quick Return   Radio Buttons   Range Bars   Ratings   Recycler Views   Resources   REST   Ripple Effects   RSS   Screenshots   Scripting   Scroll Views   SDK   Search Inputs   Security   Sensors   Services   Showcase Views   Signatures   Sliding Panels   Snackbars   SOAP   Social Networks   Spannable   Spinners   Splash Screens   SSH   Static Analysis   Status Bars   Styling   SVG   System   Tags   Task Managers   TDD &   Template Engines   Testing   Testing Tools   Text Formatting   Text Views   Text Watchers   Text-to   Toasts   Toolkits For   Tools   Tooltips   Trainings   TV   Twitter   Updaters   USB   User Stories   Utils   Validation   Video   View Adapters   View Pagers   Views   Watch Face   Wearable Data   Wearables   Weather   Web Tools   Web Views   WebRTC   WebSockets   Wheel Widgets   Wi-Fi   Widgets   Windows   Wizards   XML   XMPP   YAML   ZIP Codes