{"id":13515876,"url":"https://github.com/kaiinui/android-awesome-libraries","last_synced_at":"2025-12-18T07:53:51.739Z","repository":{"id":19548424,"uuid":"22796876","full_name":"kaiinui/android-awesome-libraries","owner":"kaiinui","description":"There are many libraries which helps your android development!","archived":false,"fork":false,"pushed_at":"2016-02-15T04:07:28.000Z","size":420,"stargazers_count":115,"open_issues_count":1,"forks_count":17,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-12-14T23:19:59.902Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kaiinui.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-08-09T22:52:21.000Z","updated_at":"2025-12-11T01:58:01.000Z","dependencies_parsed_at":"2022-08-20T22:50:15.757Z","dependency_job_id":null,"html_url":"https://github.com/kaiinui/android-awesome-libraries","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/kaiinui/android-awesome-libraries","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaiinui%2Fandroid-awesome-libraries","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaiinui%2Fandroid-awesome-libraries/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaiinui%2Fandroid-awesome-libraries/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaiinui%2Fandroid-awesome-libraries/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kaiinui","download_url":"https://codeload.github.com/kaiinui/android-awesome-libraries/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaiinui%2Fandroid-awesome-libraries/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":27793475,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-18T02:00:09.725Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-01T05:01:16.903Z","updated_at":"2025-12-18T07:53:51.722Z","avatar_url":"https://github.com/kaiinui.png","language":null,"funding_links":[],"categories":["Technical","Other Lists","Others"],"sub_categories":["ramanihiteshc@gmail.com","TeX Lists"],"readme":"android-awesome-libraries\n=========================\n\nIndex\n---\n\n- [Support](https://github.com/kaiinui/android-awesome-libraries#support)\n- [Network](https://github.com/kaiinui/android-awesome-libraries#network)\n- [Rest Client](https://github.com/kaiinui/android-awesome-libraries#rest-client)\n- [Object Serialization](https://github.com/kaiinui/android-awesome-libraries#object-serialization)\n- [Database](https://github.com/kaiinui/android-awesome-libraries#database)\n- [Network Image Handling](https://github.com/kaiinui/android-awesome-libraries#network-image-handling)\n- [Event Pub/Sub](https://github.com/kaiinui/android-awesome-libraries#event-pubsub)\n- [Gesture](https://github.com/kaiinui/android-awesome-libraries#gesture)\n- [Utility](https://github.com/kaiinui/android-awesome-libraries#utility)\n- [Cloud Handling](https://github.com/kaiinui/android-awesome-libraries#cloud-handling)\n- [Social Network Handling](https://github.com/kaiinui/android-awesome-libraries#social-network-handling)\n- [DI](https://github.com/kaiinui/android-awesome-libraries#di)\n- [View Model Binding](https://github.com/kaiinui/android-awesome-libraries#view-model-binding)\n- [UI](https://github.com/kaiinui/android-awesome-libraries#ui)\n- [Album Handling](https://github.com/kaiinui/android-awesome-libraries#album-handling)\n- [Rx](https://github.com/kaiinui/android-awesome-libraries#rx)\n- [Promise](https://github.com/kaiinui/android-awesome-libraries#promise)\n- [Security](https://github.com/kaiinui/android-awesome-libraries#security)\n- [Debug Utilitiy](https://github.com/kaiinui/android-awesome-libraries#debug-utility)\n- [Gradle Plugin](https://github.com/kaiinui/android-awesome-libraries#gradle-plugin)\n- [Testing](https://github.com/kaiinui/android-awesome-libraries#testing)\n\nSupport\n---\n\n- [TransitionsBackport](guerwan/TransitionsBackport : https://github.com/guerwan/TransitionsBackport)\n\n- [Android Device Compatibility](https://github.com/mixi-inc/Android-Device-Compatibility) - Compatibility package project for android device difference.\n\n- Android Support Annotations\n\n```java\nprivate void displayName(@NonNull String name) {\n  // name can not be null\n}\n```\n\n```java\nprivate void receiveDrawableRes(@DrawableRes int resId) {\n  // resId must be Drawable Resource ID\n}\n```\n\n- [gradle-retrolabmda](https://github.com/evant/gradle-retrolambda) - lambda suppor for android!\n\n```java\nmButton.setOnClickListener((View v) -\u003e {\n    // do something here\n});\n```\n\n- [icepick](https://github.com/frankiesardo/icepick) - Android Instance State made easy\n\n```java\n@Icicle String username; // This will be automatically saved and restored\n\n@Override public void onCreate(Bundle savedInstanceState) {\n  super.onCreate(savedInstanceState);\n  Icepick.restoreInstanceState(this, savedInstanceState);\n}\n\n@Override public void onSaveInstanceState(Bundle outState) {\n  super.onSaveInstanceState(outState);\n  Icepick.saveInstanceState(this, outState);\n}\n```\n\n- [Michelangelo](https://github.com/RomainPiel/Michelangelo) - Layout inflation library for Android based on annotations\n\n```java\n@InflateLayout(R.layout.custom_view)\npublic class MyCustomView extends FrameLayout {\n\n    public MyCustomView(Context context) {\n        super(context);\n    }\n\n    @AfterInflate\n    public void updateTextView() {\n        ((TextView) findViewById(R.id.my_text_view)).setText(\"hey!\");\n    }\n}\n```\n\n- [AndroidAnnotations](http://androidannotations.org/)\n\n```java\n@Background\nvoid someBackgroundWork(String aParam, long anotherParam) {\n    [...]\n}\n```\n\n```java\n@UiThread\nvoid doInUiThread(String aParam, long anotherParam) {\n    [...]\n}\n```\n\n- [HeaderGridView](https://github.com/maurycyw/HeaderGridView) - Header view support for GridView!\n\n```java\ngridView.addHeaderView(View v);\n```\n\n- [HeaderFooterGridView](https://github.com/recruit-mp/android-HeaderFooterGridView) - HeaderFooterGridView supports adding header rows and footer rows to GridView\n\n```java\nfinal HeaderFooterGridView headerFooterGridView = (HeaderFooterGridView) findViewById(R.id.HeaderFooterGridView);\n \nHeaderView headerView = new HeaderView(context);\nheaderFooterGridView.addHeaderView(headerView);\n \nFooterView footerView = new FooterView(context);\nheaderFooterGridView.addFooterView(footerView);\n\nmAdapter = new HeaderFooterGridViewAdapter(this);\nheaderFooterGridView.setAdapter(mAdapter);\n```\n\nNetwork\n---\n\n- [Volley](https://android.googlesource.com/platform/frameworks/volley)\n\n```java\nRequestQueue queue = Volley.newRequestQueue(this);\nString url = \"SOMEURL\";\n\nJsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener\u003cJSONObject\u003e() {\n  @Override\n  public void onResponse(JSONObject response) {\n    // TODO\n  }\n}, new Response.ErrorListener() {\n  @Override\n  public void onErrorResponse(VolleyError error) {\n    // TODO\n  }\n});\n\nqueue.add(jsObjRequest);\n```\n\n- [ion](https://github.com/koush/ion)\n\n```java\nIon.with(context)\n.load(\"http://example.com/thing.json\")\n.asJsonObject()\n.setCallback(new FutureCallback\u003cJsonObject\u003e() {\n   @Override\n    public void onCompleted(Exception e, JsonObject result) {\n        // do stuff with the result or error\n    }\n});\n```\n\n- [okhttp](https://github.com/square/okhttp) - An **HTTP+SPDY** client for Android and Java applications\n\n```java\nOkHttpClient client = new OkHttpClient();\n\nString run(String url) throws IOException {\n  Request request = new Request.Builder()\n      .url(url)\n      .build();\n\n  Response response = client.newCall(request).execute();\n  return response.body().string();\n}\n```\n\nREST Client\n---\n\n- [Retrofit](http://square.github.io/retrofit/)\n\n```java\npublic interface GitHubService {\n  @GET(\"/users/{user}/repos\")\n  List\u003cRepo\u003e listRepos(@Path(\"user\") String user);\n}\n```\n\nObject Serialization\n---\n\n- [Gson](https://code.google.com/p/google-gson/)\n\n```java\nBagOfPrimitives obj = new BagOfPrimitives();\nGson gson = new Gson();\nString json = gson.toJson(obj);  \n```\n\nDatabase\n---\n\n- [ActiveAndroid](https://github.com/pardom/ActiveAndroid)\n\n```java\nCategory restaurants = new Category();\nrestaurants.name = \"Restaurants\";\nrestaurants.save();\n```\n\n- [GreenDAO](https://github.com/greenrobot/greenDAO)\n\n```java\nList joes = userDao.queryBuilder()\n  .where(Properties.FirstName.eq(\"Joe\"))\n  .orderAsc(Properties.LastName)\n  .list();\n```\n\nNetwork Image Handling\n---\n\n- [Picasso](http://square.github.io/picasso/)\n\n```java\nPicasso.with(context).load(\"http://i.imgur.com/DvpvklR.png\").into(imageView);\n```\n\n- [Universal Image Loader](https://github.com/nostra13/Android-Universal-Image-Loader)\n\n```java\n// Load image, decode it to Bitmap and display Bitmap in ImageView (or any other view \n//  which implements ImageAware interface)\nimageLoader.displayImage(imageUri, imageView);\n```\n\n##### really configurable!\n\n```java\n// DON'T COPY THIS CODE TO YOUR PROJECT! This is just example of ALL options using.\n// See the sample project how to use ImageLoader correctly.\nDisplayImageOptions options = new DisplayImageOptions.Builder()\n        .showImageOnLoading(R.drawable.ic_stub) // resource or drawable\n        .showImageForEmptyUri(R.drawable.ic_empty) // resource or drawable\n        .showImageOnFail(R.drawable.ic_error) // resource or drawable\n        .resetViewBeforeLoading(false)  // default\n        .delayBeforeLoading(1000)\n        .cacheInMemory(false) // default\n        .cacheOnDisk(false) // default\n        .preProcessor(...)\n        .postProcessor(...)\n        .extraForDownloader(...)\n        .considerExifParams(false) // default\n        .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default\n        .bitmapConfig(Bitmap.Config.ARGB_8888) // default\n        .decodingOptions(...)\n        .displayer(new SimpleBitmapDisplayer()) // default\n        .handler(new Handler()) // default\n        .build();\n```\n\n[Glide](https://github.com/bumptech/glide) - An image loading and caching library for Android focused on smooth scrolling\n\n```java\nGlide.with(this).load(\"http://goo.gl/h8qOq7\").into(imageView);\n```\n\nEvent Pub/Sub\n---\n\n- [EventBus](https://github.com/greenrobot/EventBus)\n\n```java\neventBus.post(event);\n```\n\n```java\neventBus.register(this);\npublic void onEvent(AnyEventType event) {\n    // TODO: React to the event!\n}\n```\n\n- [Otto](http://square.github.io/otto/)\n\n```java\nbus.post(new AnswerAvailableEvent(42));\n```\n\n```java\n@Subscribe public void answerAvailable(AnswerAvailableEvent event) {\n    // TODO: React to the event somehow!\n}\n```\n\nGesture\n---\n\n- [android-gesture-detectors](https://github.com/Almeros/android-gesture-detectors)\n\nUtility\n---\n\n- [Bolts](https://github.com/BoltsFramework/Bolts-Android) - a collection of low-level libraries designed to make developing mobile apps easier\n\n```java\nfinal ParseQuery\u003cParseObject\u003e query = ParseQuery.getQuery(\"Student\");\nquery.orderByDescending(\"gpa\");\nfindAsync(query).onSuccessTask(new Continuation\u003cList\u003cParseObject\u003e, Task\u003cParseObject\u003e\u003e() {\n  public Task\u003cParseObject\u003e then(Task\u003cList\u003cParseObject\u003e\u003e task) throws Exception {\n    List\u003cParseObject\u003e students = task.getResult();\n    students.get(0).put(\"valedictorian\", true);\n    return saveAsync(students.get(0));\n  }\n}).onSuccessTask(new Continuation\u003cParseObject, Task\u003cList\u003cParseObject\u003e\u003e\u003e() {\n  public Task\u003cList\u003cParseObject\u003e\u003e then(Task\u003cParseObject\u003e task) throws Exception{\n    ParseObject valedictorian = task.getResult();\n    return findAsync(query);\n  }\n}).onSuccessTask(new Continuation\u003cList\u003cParseObject\u003e, Task\u003cParseObject\u003e\u003e() {\n  public Task\u003cParseObject\u003e then(Task\u003cList\u003cParseObject\u003e\u003e task) throws Exception {\n    List\u003cParseObject\u003e students = task.getResult();\n    students.get(1).put(\"salutatorian\", true);\n    return saveAsync(students.get(1));\n  }\n}).onSuccess(new Continuation\u003cParseObject, Void\u003e() {\n  public Void then(Task\u003cParseObject\u003e task) throws Exception {\n    // Everything is done!\n    return null;\n  }\n});\n```\n\n- [routable-android](https://github.com/usepropeller/routable-android) - routes.rb for Android\n\n```java\nRouter.sharedRouter().map(\"users/:id\", UserActivity.class);\nRouter.sharedRouter().map(\"users/new/:name/:zip\", NewUserActivity.class);\n```\n\n```java\nRouter.sharedRouter().open(\"users/16\");\nRouter.sharedRouter().open(\"users/new/Clay/94303\");\n```\n\n- [android-intents](https://github.com/d-tarasov/android-intents) - A collection of well-known Android intents for most common actions\n\n```java\nIntent intent = IntentUtils.sendEmail(to, subject, body);\nstartActivity(Intent.createChooser(intent, \"TEST\"));\n```\n\n- [GAlette](https://github.com/uPhyca/GAlette) - Tracking events with Google Analytics by annotations\n\n```java\n@SendEvent(category = \"HelloWorld\", action = \"sayHello\", label=\"%1$s\")\nString sayHello (String name) {\n  return format(\"Hello, %s.\", name);\n}\n```\n\n- [Paraphrase](https://github.com/JakeWharton/paraphrase) - compile-safe format string builders.\n\n```xml\n\u003cstring name=\"greeting\"\u003eHello, {other_name}! My name is {my_name}.\u003c/string\u003e\n```\n\n```java\nCharSequence greeting = Phrase.greeting()\n    .other_name(\"GitHub user\")\n    .my_name(\"Jake Wharton\")\n    .build(this);\n```\n\n- [esperandro](https://github.com/dkunzler/esperandro) - Easy SharedPreference Engine foR ANDROid\n\n```java\nString superFancyPreference = preferences.superFancyPreferenceKey()\npreferences.superFancyPreferenceKey(superFancyPreference)\n```\n\n- [Android Priority Job Queue](https://github.com/path/android-priority-jobqueue)\n\n```java\npublic void onSendClick() {\n    final String status = editText.getText().toString();\n    if(status.trim().length() \u003e 0) {\n      jobManager.addJobInBackground(new PostTweetJob(status));\n      editText.setText(\"\");\n    }\n}\n```\n\n- [Android Saripaar](https://github.com/ragunathjawahar/android-saripaar) - UI Validation Library\n\n```java\n@Required(order = 1)\n@Email(order = 2)\nprivate EditText emailEditText;\n\n@Password(order = 3)\n@TextRule(order = 4, minLength = 6, message = \"Enter at least 6 characters.\")\nprivate EditText passwordEditText;\n\n@ConfirmPassword(order = 5)\nprivate EditText confirmPasswordEditText;\n\n@Checked(order = 6, message = \"You must agree to the terms.\")\nprivate CheckBox iAgreeCheckBox;\n```\n\n- [ObjectCache](https://github.com/iainconnor/ObjectCache)\n\n```java\nMyObject myObject = new MyObject(\"foo\");\ncacheManager.put(\"myKey\", myObject);\n```\n\n- [GPUImage for Android](https://github.com/CyberAgent/android-gpuimage#gpuimage-for-android)\n\n```java\nmGPUImage = new GPUImage(this);\nmGPUImage.setGLSurfaceView((GLSurfaceView) findViewById(R.id.surfaceView));\nmGPUImage.setImage(imageUri); // this loads image on the current thread, should be run in a thread\nmGPUImage.setFilter(new GPUImageSepiaFilter());\n```\n\n- [Amalgam](https://github.com/nohana/Amalgam) - Common codes for Android\n\n```java\nToastUtils.showOnUiThread(activity, \"SOMESTRING\", Toast.LENGTH_SHORT);\n```\n\n```java\nisMainThread() // Check if current thread is the main thread.\n```\n\n- [Android Checkout](https://github.com/serso/android-checkout) - Android In-App Billing made easy.\n\n```java\ncheckout.start();\n// you only need this if this activity starts purchase process\ncheckout.createPurchaseFlow(new PurchaseListener());\n// you only need this if this activity needs information about purchases/SKUs\ninventory = checkout.loadInventory();\ninventory.whenLoaded(new InventoryLoadedListener())\n```\n\n- [AsyncJobLibrary](https://github.com/Arasthel/AsyncJobLibrary)\n\n```java\nnew AsyncJob.AsyncJobBuilder\u003cBoolean\u003e()\n        .doInBackground(new AsyncJob.AsyncAction\u003cBoolean\u003e() {\n            @Override\n            public Boolean doAsync() {\n                // Do some background work\n                try {\n                    Thread.sleep(1000);\n                } catch (InterruptedException e) {\n                    e.printStackTrace();\n                }\n                return true;\n            }\n        })\n        .doWhenFinished(new AsyncJob.AsyncResultAction\u003cBoolean\u003e() {\n            @Override\n            public void onResult(Boolean result) {\n                Toast.makeText(context, \"Result was: \" + result, Toast.LENGTH_SHORT).show();\n        }\n}).create().start();\n```\n\nCloud Handling\n---\n\n- [Driven](https://github.com/bingzer/driven) - A unified API calls for different cloud storage providers\n\n```java\nStorageProvider provider = new Dropbox();\nprovider.authenticate(credentials);\n\n// list all files in the root\nprovider.listAsync(new Task\u003cList\u003cDrivenFile\u003e\u003e(){\n  public void onComplete(List\u003cDrivenFile\u003e files){\n    ...\n  }\n});\n```\n\nSocial Network Handling\n---\n\n- [AndroidSocialNetworks](https://github.com/antonkrasov/AndroidSocialNetworks) - easy work with Facebook, Twitter, LinkedIn and Google\n\n```java\nmSocialNetworkManager = (SocialNetworkManager) getFragmentManager().findFragmentByTag(SOCIAL_NETWORK_TAG);\n\nif (mSocialNetworkManager == null) {\n    mSocialNetworkManager = SocialNetworkManager.Builder.from(getActivity())\n            .twitter(\u003c\u003c TWITTER  API TOKEN  \u003e\u003e, \u003c\u003c TWITTER  API SECRET  \u003e\u003e)\n            .linkedIn(\u003c\u003c LINKED_IN  API TOKEN  \u003e\u003e, \u003c\u003c LINKED_IN API TOKEN  \u003e\u003e, \"r_basicprofile+rw_nus+r_network+w_messages\")\n            .facebook()\n            .googlePlus()\n            .build();\n    getFragmentManager().beginTransaction().add(mSocialNetworkManager, SOCIAL_NETWORK_TAG).commit();\n}\n```\n\nDI\n---\n\n- [ButterKnife](https://github.com/JakeWharton/butterknife)\n\n```java\n@InjectView(R.id.user) EditText username;\n@InjectView(R.id.pass) EditText password;\n\n@OnClick(R.id.submit) void submit() {\n  // TODO call server...\n}\n```\n\n- [Dagger](http://square.github.io/dagger/)\n\n```java\n@Inject\nThermosiphon(Heater heater) {\n  this.heater = heater;\n}\n```\n\nView Model Binding\n---\n\n- [android-binding](https://github.com/gueei/AndroidBinding) - MVVM for Android\n\n```java\npublic StringObservable message = new StringObservable();\n...\nmessage.set(\"Hello MVVM!\"); // will change the model and view\n```\n\nUI\n--\n\n- [AboutLibraries](https://github.com/mikepenz/AboutLibraries)\n\n![](https://raw.githubusercontent.com/mikepenz/AboutLibraries/master/DEV/screenshots/screenshot2_small.png)\n\n- [SuperToasts](https://github.com/JohnPersano/SuperToasts)\n\n![](https://camo.githubusercontent.com/b52711b589229453cde3c15cebc921285f01d9b8/687474703a2f2f69313031362e70686f746f6275636b65742e636f6d2f616c62756d732f61663238342f547572626f70776e65642f7375706572746f617374735f67726f75705f73637265656e73686f745f74776f2e706e67)\n\n- [PhotoView](https://github.com/chrisbanes/PhotoView) - ImageView for Android that supports zooming, by various touch gestures.\n\n![](https://camo.githubusercontent.com/cf5bfb6d896604aa9156e3e1beee89e0754de7db/68747470733a2f2f7261772e6769746875622e636f6d2f636872697362616e65732f50686f746f566965772f6d61737465722f6865616465725f677261706869632e706e67)\n\n- [Fading Action Bar](https://github.com/ManuelPeinado/FadingActionBar)\n\n![](https://camo.githubusercontent.com/4fb0e40bdb047be104b2cefddee62923b8a2da37/68747470733a2f2f7261772e6769746875622e636f6d2f4d616e75656c5065696e61646f2f466164696e67416374696f6e4261722f6d61737465722f6172742f726561646d655f7069632e706e67)\n\n- [BlurEffectForAndroidDesign](https://github.com/PomepuyN/BlurEffectForAndroidDesign)\n\n![](https://camo.githubusercontent.com/6da6607aaa573be1c11fdbda1727c129bc9396a8/68747470733a2f2f6c68362e67677068742e636f6d2f497055533039333954794557634c664238724c7141534c78714776587333564432336b6f6b77686138305167733261644c754f6335686257356250397a4834693641)\n\n- [SlidingMenu](https://github.com/jfeinstein10/SlidingMenu)\n\n![](https://lh4.ggpht.com/MSBdACpt_6MmrSiGA5f2GrBfmHVCQP4j3n1TUNdN8gKjOfsOqyEe6ELnLXmJi4gRMA=h900-rw)\n\n- [cardslib](https://github.com/gabrielemariotti/cardslib)\n\n![](https://github.com/gabrielemariotti/cardslib/raw/master/demo/images/screen.png)\n\n- [CardsUI for Android](https://github.com/Androguide/cardsui-for-android)\n\n![](https://camo.githubusercontent.com/2c232fa27583ffa8e6cdf34c31509d1f0bbae3b4/687474703a2f2f696d616765736861636b2e75732f612f696d673833372f313336352f636172647367656e312e706e67)\n\n- [ColorArt](https://github.com/MichaelEvans/ColorArt)\n\n![](https://github.com/MichaelEvans/ColorArt/raw/master/img/ping_pong_orchestra.png)\n\n- [Android-Rate](https://github.com/hotchemi/Android-Rate)\n\n![](https://camo.githubusercontent.com/39978e2edcf111ea1fa024ed66558da961926694/687474703a2f2f6769667a6f2e6e65742f4249356532714d4a5669302e676966)\n\n- [GlassActionBar](https://github.com/ManuelPeinado/GlassActionBar)\n\n![](https://camo.githubusercontent.com/01c80fb941f2ba07f6d9d26d80dd4792a79127d4/68747470733a2f2f7261772e6769746875622e636f6d2f4d616e75656c5065696e61646f2f476c617373416374696f6e4261722f6d61737465722f6172742f726561646d655f7069632e706e67)\n\n- [emojicon](https://github.com/rockerhieu/emojicon)\n\n![](https://github.com/rockerhieu/emojicon/raw/master/images/sample.jpg)\n\n- [IonIconView](https://github.com/MarsVard/IonIconView)\n\n![](https://camo.githubusercontent.com/b34ffde14cb738fb283300fe5694e800e22ac783/68747470733a2f2f7261772e6769746875622e636f6d2f4d617273566172642f496f6e49636f6e566965772f6d61737465722f66616e637961642e706e67)\n\n- [ExtendedCalendarView](https://github.com/tyczj/ExtendedCalendarView)\n\n![](https://raw.githubusercontent.com/tyczj/ExtendedCalendarView/master/ExtendedCalendarView/Screenshot_2014-04-04-18-11-16.png)\n\n- [StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders)\n\n![](https://github.com/emilsjolander/StickyListHeaders/raw/master/demo.gif)\n\n- [StickyGridHeaders](https://github.com/TonicArtos/StickyGridHeaders)\n\n![](https://camo.githubusercontent.com/90b57e9383704c400706545225d439e057c6fcc0/687474703a2f2f342e62702e626c6f6773706f742e636f6d2f2d535f4262685758367754592f55517057306377554745492f41414141414141414776552f7a7a4a586a2d50635662592f73313630302f73637265656e2d6c616e6473636170652d736d616c6c65722e706e67)\n\n- [Android Staggered Grid](https://github.com/etsy/AndroidStaggeredGrid)\n\n![](https://camo.githubusercontent.com/a243ad5c2788730c40fc1d348e5ed85adb59c484/687474703a2f2f662e636c2e6c792f6974656d732f327a31423059304d3047304f326b316c334a30332f5472656e64696e672e706e67)\n\n- [JazzyViewPager](https://github.com/jfeinstein10/JazzyViewPager)\n\n- [Android ViewPagerIndicator](https://github.com/JakeWharton/Android-ViewPagerIndicator)\n\n![](https://camo.githubusercontent.com/240ee2f3ebda5f20f73a5750c192a28743227816/68747470733a2f2f7261772e6769746875622e636f6d2f4a616b6557686172746f6e2f416e64726f69642d566965775061676572496e64696361746f722f6d61737465722f73616d706c652f73637265656e732e706e67)\n\n- [RoudedImageView](https://github.com/vinc3m1/RoundedImageView)\n\n![](https://camo.githubusercontent.com/ed1e075be6ed97fa9091d3702e9b96d3e85b7a35/68747470733a2f2f7261772e6769746875622e636f6d2f6d616b6572616d656e2f526f756e646564496d616765566965772f6d61737465722f73637265656e73686f742e706e67)\n\n- [Enhanced ListView](https://github.com/timroes/EnhancedListView)\n\n![](https://lh4.ggpht.com/0XgESm3N-SktOxUhmv4z_hxqkYqBWJJsiVVMS56XSDjmyZVUeXNr9Qe9c8KNF18iIfo=h310-rw)\n\n- [Android Sliding Up Panel](https://github.com/umano/AndroidSlidingUpPanel)\n\n![](https://camo.githubusercontent.com/834cfd81ce764457db69dc023e1bd0adf0a8d00d/68747470733a2f2f7261772e6769746875622e636f6d2f756d616e6f2f416e64726f6964536c6964696e67557050616e656c44656d6f2f6d61737465722f736c6964696e67757070616e656c2e706e67)\n\n- [CWAC TouchListView](https://github.com/commonsguy/cwac-touchlist) - A Drag-and-Drop Capable ListView\n\n- [AdapterViewAnimator](https://github.com/SimonVT/adapterviewanimator)\n\n```java\nAdapterViewAnimator animator = new AdapterViewAnimator(adapterView);\ndata.add(item);\nadapter.notifyDataSetChanged();\nanimator.animate();\n```\n\n- [MPAndroidChart](https://github.com/PhilJay/MPAndroidChart)\n\n![](https://camo.githubusercontent.com/8d9d4fac26ce95d5abf63d59c81b5a7edd8fc71d/68747470733a2f2f7261772e6769746875622e636f6d2f5068696c4a61792f4d5043686172742f6d61737465722f73637265656e73686f74732f626172636861727432645f6d756c74695f646174617365745f64617465312e706e67)\n\n![](https://camo.githubusercontent.com/60bd0d71462ad577df775b956944b191e939728a/68747470733a2f2f7261772e6769746875622e636f6d2f5068696c4a61792f4d50416e64726f696443686172742f6d61737465722f73637265656e73686f74732f70696563686172745f686f6c657261646975735f73706163652e706e67)\n\n- [ListViewAnimations](https://github.com/nhaarman/ListViewAnimations) - allows developers to easily add animations to ListView items\n\n![](https://raw.githubusercontent.com/nhaarman/ListViewAnimations/gh-pages/images/dynamiclistview.gif)\n\nAlbum handling\n---\n\n- [DeviceAlbums](https://github.com/nohana/DeviceAlbums) (Compatibility library for dealing with various device photo albums.) \n- [Laevatein](https://github.com/nohana/Laevatein)\n\n![](https://raw.githubusercontent.com/nohana/Laevatein/master/documents/ss-1.png)\n\n- RoboGuice\n\nRx\n---\n\n- [RxJava](https://github.com/Netflix/RxJava)\n\n```java\nSubscription sub = Observable.from(1, 2, 3, 4, 5)\n    .subscribeOn(Schedulers.newThread())\n    .observeOn(AndroidSchedulers.mainThread())\n    .subscribe(observer);\n```\n\nPromise\n---\n\n- [JDefferred](https://github.com/jdeferred/jdeferred)\n\n```java\nDeferred deferred = new DeferredObject();\nPromise promise = deferred.promise();\npromise.done(new DoneCallback() {\n  public void onDone(Object result) {\n    ...\n  }\n}).fail(new FailCallback() {\n  public void onFail(Object rejection) {\n    ...\n  }\n}).progress(new ProgressCallback() {\n  public void onProgress(Object progress) {\n    ...\n  }\n}).always(new AlwaysCallback() {\n  public void onAlways(State state, Object result, Object rejection) {\n    ...\n  }\n});\n```\n\nSecurity\n---\n\n- [Conceal](http://facebook.github.io/conceal/) - Fast cryptographic operations for Android by Facebook\n\nDebug Utility\n---\n\n- [Hugo](https://github.com/JakeWharton/hugo)\n\n```java\n@DebugLog\npublic String getName(String first, String last) {\n  SystemClock.sleep(15); // Don't ever really do this!\n  return first + \" \" + last;\n}\n```\n\n- [Timber](https://github.com/JakeWharton/timber) - A logger.\n\n- [scalpel](https://github.com/JakeWharton/scalpel)\n\n![](https://github.com/JakeWharton/scalpel/raw/master/images/sample.gif)\n\n- [dspec](https://github.com/lucasr/dspec) - An easy way to draw UI specs on top of your Android UI\n\n![](https://github.com/lucasr/dspec/raw/master/images/sample.png)\n\nGradle Plugin\n---\n\n- [Gradle Android AspectJ Plugin](https://github.com/uPhyca/gradle-android-aspectj-plugin)\n- [gradle-android-appiconoverlay](https://github.com/splatte/gradle-android-appiconoverlay)\n- [License Gradle Plugin](https://github.com/hierynomus/license-gradle-plugin)\n\nTesting\n---\n\n### Unit\n\n- JUnit\n- [Robospock](http://robospock.org/)\n\n```groovy\ndef \"should display hello text\"() {\n    given:\n    def textView = new TextView(Robolectric.application)\n\n    and:\n    def hello = \"Hello\"\n\n    when:\n    textView.setText(hello)\n\n    then:\n    textView.getText() == hello\n}\n        \n```\n\n### Assert\n\n- [AssertJ-Android](https://github.com/square/assertj-android)\n\n```java\nassertThat(frodo.getName()).isEqualTo(\"Frodo\");\nassertThat(frodo).isNotEqualTo(sauron)\n                 .isIn(fellowshipOfTheRing);\nassertThat(sauron).isNotIn(fellowshipOfTheRing);\n```\n\n### Fixture\n\n- [RobotGirl](https://github.com/rejasupotaro/RobotGirl)\n\n```java\nFactory.define(\n        // This will guess the User class\n        new Definition(User.class) {\n            @Override\n            public Bundle set(Bundle attrs) {\n                attrs.putString(\"name\", \"John\");\n                attrs.putBoolean(\"admin\", false);\n                return attrs;\n            }\n        // This will use the User class (Adming would have been guessed)\n        }, new Definition(User.class, \"admin\") {\n            @Override\n            public Bundle set(Bundle attrs) {\n                attrs.putString(\"name\", \"Admin\");\n                attrs.putBoolean(\"admin\", true);\n                return attrs;\n            }\n        });\n```\n\n### Mock\n\n- [Mockito](https://code.google.com/p/mockito/)\n\n```java\nLinkedList mockedList = mock(LinkedList.class);\nwhen(mockedList.get(0)).thenReturn(\"first\");\nwhen(mockedList.get(1)).thenThrow(new RuntimeException());\n```\n\n### UI Test\n\n- [Appium](http://appium.io/)\n\n- [Espresso](https://code.google.com/p/android-test-kit/wiki/Espresso)\n\n```java\npublic void testSayHello() {\n  onView(withId(R.id.name_field))\n    .perform(typeText(\"Steve\"));\n  onView(withId(R.id.greet_button))\n    .perform(click());\n  onView(withText(\"Hello Steve!\"))\n    .check(matches(isDisplayed()));\n}\n```\n\nOthers\n---\n\n[buck](http://facebook.github.io/buck/) - A high-performance Android \u0026 Java build tool\n\nDocumentation\n---\n\n[doclava](https://code.google.com/p/doclava/)\n\n![](http://cdn-ak.f.st-hatena.com/images/fotolife/m/mallowlabs/20120312/20120312213344.png)\n\nContribution\n===\n\nJust fork \u0026 edit \u0026 send pull-request on GitHub!\n\n####Policy\n\n1. Official Website over GitHub Repository for links.\n2. Should put codes which reflects the library.\n3. For UI libraries, put demonstorations (AniGIF, PNG, Movies).\n\nAnd I am considering to ...\n\n1. Put reference links for each libraries.\n2. Separate pages for each categories.\n3. Separate UI categories.\n\n####Maintainer\n\nkaiinui (https://github.com/kaiinui)\n\n####and...\n\nI am building a website to browse awesome libraries! https://github.com/kaiinui/droidgems\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkaiinui%2Fandroid-awesome-libraries","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkaiinui%2Fandroid-awesome-libraries","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkaiinui%2Fandroid-awesome-libraries/lists"}