{"id":22591941,"url":"https://github.com/borisf/classyshark-user-guide","last_synced_at":"2025-04-15T09:14:31.679Z","repository":{"id":97658446,"uuid":"60973775","full_name":"borisf/classyshark-user-guide","owner":"borisf","description":"Everything you want to know how to use ClassyShark","archived":false,"fork":false,"pushed_at":"2019-08-16T11:31:46.000Z","size":1852,"stargazers_count":216,"open_issues_count":0,"forks_count":27,"subscribers_count":19,"default_branch":"master","last_synced_at":"2025-04-15T09:14:14.182Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://www.classyshark.com","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/borisf.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-06-12T15:15:18.000Z","updated_at":"2025-03-09T17:31:55.000Z","dependencies_parsed_at":null,"dependency_job_id":"c2a87ee0-441d-4261-b601-0ca833ad1785","html_url":"https://github.com/borisf/classyshark-user-guide","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/borisf%2Fclassyshark-user-guide","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/borisf%2Fclassyshark-user-guide/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/borisf%2Fclassyshark-user-guide/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/borisf%2Fclassyshark-user-guide/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/borisf","download_url":"https://codeload.github.com/borisf/classyshark-user-guide/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249040142,"owners_count":21202826,"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","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-12-08T09:14:41.068Z","updated_at":"2025-04-15T09:14:31.672Z","avatar_url":"https://github.com/borisf.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Classyshark User Guide\n\n[ClassyShark](https://github.com/google/android-classyshark) is under current and heavy development, so remember to check this page frequently :snowflake:.\n\n## About ClassyShark\n\nWe developed this software because we needed something lighting fast and incredibly lightweight for browsing Android `APK`s, so that we could check right away if everything we wanted was right inside the final executable. And this is where the story begins - be sure to checkout the blogpost [Intro to ClassyShark](https://medium.com/@BorisFarber/welcome-classyshark-b632ae8488b4#.4zcdc3kwd) to understand the problem it solves.\n\n## Open an archive\nBefore we can start browsing anything, we need to open it. And this is pretty straight forward: you can do it by clicking on the\nfolder icon in the top bar, as in this screenshot.\n\n![alt text](https://github.com/borisf/classyshark-user-guide/blob/master/images/1%20Open%20File.png)\n\nRemember that **ClassyShark** does not stop to Android `APK`, but you actually see the content of `.dex` files, as well as `.class`, `.jar` and `.aar`s.\n\n## Browse components\nRight after **ClassyShark** loads your executable, you will see, in the left panel, the list of the root components of the archive.\nIn the example, we are using the Google IO Android app, and you can notice right away that we see the `AndroidManifest.xml` file and the `classes` and `res` folders\nat the very top of the tree, as we just opened the `APK` file.\n\n![alt text](https://github.com/borisf/classyshark-user-guide/blob/master/images/2%20Browse%20components)\n\nBy clicking on the folders, we will see the tree expand and, when we reach a leaf (that would be a Java file, in this case), by clicking on it, we would see its content\non the right pane, where the **ClassyShark** logo is. Easy!\n\nNow, what if we find, for instance, a class that extends `Activity` and we want to see what's in there? Well, we are just a double click away from knowing it!\nIn fact, by clicking twice on a type, **ClassyShark** will bring on the source for that type, so that you can browse the code freely. How cool is that?\n\n## Inspect package method counts (multidex)\nRaise your hand if you found yourself in the situation of counting the number of methods in your APK. We found ourselves in that critical situation while we tried to\nreduce the size of the project we were working on and that is why we built a method counter interface inside **ClassyShark**.\n\nSee the method count, that your runtime sees\n\n![alt text](https://github.com/borisf/classyshark-user-guide/blob/master/images/5%20ClassesDexData.png)\n\nYou can activate the view by simply clicking on the *Methods count* tab on top of the navigation tree. In a blink of an eye, you will have a browsable chart of the methods used by everything in you APK, with the possibility of navigate even further by using the same mechanisms we saw in the previous paragraph.\n\n![alt text](https://github.com/borisf/classyshark-user-guide/blob/master/images/3%20Browse%20Method%20count)\n\n## Incremental Search\n*Why do I have to click all the navigation to my class?* Well, you **do not have to**!\n**ClassyShark** ships with a handy search field, that you can use to filter the classes by writing a matching query, that will be automagically applied to the content of the archive and the AndroidManifest.\n\n![alt text](https://github.com/borisf/classyshark-user-guide/blob/master/images/4%20Search.png)\n\nYou can also use the arrows on top to navigate back and forth the history of the app!\n\n## Native Code\nWith the release of the new Android Nougat, new [code stability restrictions](http://android-developers.blogspot.co.uk/2016/06/improving-stability-with-private-cc.html) have been introduced, and **ClassyShark** is ready to welcome them!\n\n![alt text](https://github.com/borisf/classyshark-user-guide/blob/master/images/6%20Native%20Suggestions.png)\n\n**ClassyShark** currently inspects the archive and shows this additional data:\n\n- Dynamic Symbol Errors (*missing SONAME* errors and text relocations in binary files)\n- Native libraries and dependencies (list of the *.so* native libraries linked in your APK)\n\n## Export\nThe *export* button, that will give you a report with all the relevant information about the archive and, on its side, you will find the *history* one, that will help you restoring previously loaded archives (they will persist upon application closing).\n\n## Scenarios\n1. Obfuscation\n2. Dependencies\n3. Dex Numbers\n4. Native Code\n\n## Command line\n* [Command line reference](https://github.com/google/android-classyshark/blob/master/CommandLine.pdf)\n\n## Learn more\n* [APK Dashboard in ClassyShark](https://medium.com/@BorisFarber/apk-dashboard-in-classyshark-9346318bf5c6#.tv22uvr6n)\n* [Dealing with 65K method limit](http://bytes.schibsted.com/dealing-65k-methods-limit-android/?utm_source=Android+Weekly\u0026utm_campaign=30733096d0-Android_Weekly_224\u0026utm_medium=email\u0026utm_term=0_4eb677ad19-30733096d0-337257757)\n* [Android Tools - Chinese](http://geek.csdn.net/news/detail/86457)\n* [Android Digest 17 - Russian](https://dou.ua/lenta/digests/android-digest-17/)\n* [App Diets are not a Fad](http://blog.nimbledroid.com/2016/06/15/app-diets-not-a-fad.html)\n* [ClassyShark verrät, was sich im APK versteckt - German](http://www.heise.de/developer/artikel/ClassyShark-verraet-was-sich-im-APK-versteckt-3217655.html)\n* [Tim Melor's multidex](https://github.com/tmelz/multidex_notes)\n* [Droidcon IT 2016 recap](http://jeroenmols.com/blog/2016/04/08/droidconit/)\n* [To infinity and 65K](https://speakerdeck.com/dextor/to-65k-and-beyond)\n* [Smaller APKs with ClassyShark](http://blog.jimbaca.com/2016/04/04/smaller-apks-with-classy-shark/)\n* [Jianshu - Chinese](http://www.jianshu.com/p/8e8b88ea2197)\n* [Shrinking your build with no rules](https://medium.com/@_tiwiz/shrinking-your-build-with-no-rules-8d9fb88281ac#.fiiqi3v3a)\n* [Native code browsing with ClassyShark](https://medium.com/@BorisFarber/classyshark-supports-native-code-browsing-a4985e7126b1#.kkw2lt4wz)\n* [Inspecting multidex APK with ClassyShark](https://medium.com/@BorisFarber/inspecting-your-apk-f53fb90136da#.d4os6nqdp)\n* [Intro to ClassyShark](https://medium.com/@BorisFarber/welcome-classyshark-b632ae8488b4#.4zcdc3kwd)\n\n## Future development\nWe are constantly looking for new features to make **ClassyShark** a better product, if you think we should add something, open an issue on the **ClassyShark** repo and we'll be happy to discuss about it!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fborisf%2Fclassyshark-user-guide","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fborisf%2Fclassyshark-user-guide","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fborisf%2Fclassyshark-user-guide/lists"}