{"id":15587673,"url":"https://github.com/icyleaf/app-info","last_synced_at":"2025-04-12T23:39:53.760Z","repository":{"id":10075446,"uuid":"64296212","full_name":"icyleaf/app-info","owner":"icyleaf","description":"Teardown parser tool for mac, windows and mobile app (ipa, apk and aab file) and dSYM.zip file, analysis metedata like version, name, icon etc.","archived":false,"fork":false,"pushed_at":"2024-11-27T05:57:34.000Z","size":91097,"stargazers_count":60,"open_issues_count":0,"forks_count":10,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-04-12T23:39:27.598Z","etag":null,"topics":["aab","analysis-metedata","android","apk","dsym","ipa","mobileprovision","teardown"],"latest_commit_sha":null,"homepage":"","language":"Ruby","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/icyleaf.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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-07-27T09:36:59.000Z","updated_at":"2025-03-23T12:53:29.000Z","dependencies_parsed_at":"2024-11-13T01:02:32.130Z","dependency_job_id":"851c076d-6bbe-42fb-b77a-571b54b09780","html_url":"https://github.com/icyleaf/app-info","commit_stats":{"total_commits":299,"total_committers":6,"mean_commits":"49.833333333333336","dds":0.08695652173913049,"last_synced_commit":"4e5257e69acdd3375fc4a11632714fcc09fd6eb3"},"previous_names":["icyleaf/app_info"],"tags_count":64,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/icyleaf%2Fapp-info","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/icyleaf%2Fapp-info/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/icyleaf%2Fapp-info/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/icyleaf%2Fapp-info/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/icyleaf","download_url":"https://codeload.github.com/icyleaf/app-info/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248647255,"owners_count":21139081,"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":["aab","analysis-metedata","android","apk","dsym","ipa","mobileprovision","teardown"],"created_at":"2024-10-02T22:02:50.622Z","updated_at":"2025-04-12T23:39:53.729Z","avatar_url":"https://github.com/icyleaf.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# app-info\n\n[![Language](https://img.shields.io/badge/ruby-3.1+-701516)](.github/workflows/ci.yml)\n[![Gem version](https://img.shields.io/gem/v/app-info?include_prereleases)](https://rubygems.org/gems/app-info)\n[![Build Status](https://img.shields.io/github/actions/workflow/status/icyleaf/app_info/ci.yml)](https://github.com/icyleaf/app_info/actions/workflows/ci.yml)\n[![License](https://img.shields.io/github/license/icyleaf/app-info)](LICENSE)\n\nTeardown tool for mobile app (iOS: ipa, Android: apk/aab, HarmonyOS: .hap/.app file), macOS app, dSYM.zip file and Windows PE file.\n\nAnalysis metedata like version, name, icon etc.\n\n## Support\n\n- Android file\n  - `.apk`\n  - `.aab` (Androld App Bundle)\n- iOS, Apple TV file\n  - `.ipa`\n  - `Info.plist` file\n  - `.mobileprovision`/`.provisionprofile` file\n- HarmonyOS file (basic)\n  - `.hap`\n  - `.app`\n- macOS App file (archived by starnd pkzip format)\n  - `.app.zip`\n- dSYMs file (archived by starnd pkzip format)\n  - `.dSYM.zip`\n- Windows PE file\n  - `.exe`\n  - `.zip` (binary in a zip file)\n\n\u003chr /\u003e\n\n![Zealot Showcase](https://github.com/tryzealot/docs/blob/main/static/img/showcase-light.png#gh-light-mode-only)\n![Zealot Showcase](https://github.com/tryzealot/docs/blob/main/static/img/showcase-dark.png#gh-dark-mode-only)\n\n[Zealot](https://zealot.ews.im/docs/user-guide/) is a self-hosted Beta App Distribution for Android, iOS and macOS apps. app_info it the core inside.\n\n\u003chr /\u003e\n\n## Installation\n\nAdd this line to your application's Gemfile:\n\n```ruby\ngem 'app-info'\n```\n\nAnd then execute:\n\n```bash\n$ bundle\n```\n\nOr install it yourself as:\n\n```bash\n$ gem install app-info\n```\n\n## Usage\n\n### Initialize\n\n```ruby\nrequire 'app-info'\n\n# Automatic detect file extsion and parse\nparser = AppInfo.parse('iphone.ipa')\nparser = AppInfo.parse('ipad.ipa')\nparser = AppInfo.parse('apple-tv.ipa')\nparser = AppInfo.parse('android.apk')\nparser = AppInfo.parse('android.aab')\nparser = AppInfo.parse('u-u-i-d.mobileprovision')\nparser = AppInfo.parse('macOS.App.zip')\nparser = AppInfo.parse('App.dSYm.zip')\nparser = AppInfo.parse('win.exe')\nparser = AppInfo.parse('win.zip')\n\n# If detect file type failed, you can parse in other way\nparser = AppInfo::IPA.new('iphone-ipad-unversal-appletv.ipa')\nparser = AppInfo::APK.new('android.apk')\nparser = AppInfo::AAB.new('android.aab')\nparser = AppInfo::InfoPlist.new('Info.plist')\nparser = AppInfo::MobileProvision.new('uuid.mobileprovision')\nparser = AppInfo::Macos.new('App.dSYm.zip')\nparser = AppInfo::DSYM.new('App.dSYm.zip')\nparser = AppInfo::PE.new('win.exe')\n```\n\n### iOS\n\nTeardown suport iPhone, iPad, Universal and Apple TV file.\n\n```ruby\nipa = AppInfo.parse('iphone-ipad-unversal-appletv.ipa')\n\n# get app file size\nipa.size\n# =\u003e 3093823\n\n# get app file size in human reable.\nipa.size(human_size: true)\n# =\u003e 29 MB\n\n# get app release version\nipa.release_version\n# =\u003e 1.0\n\n# get app bundle id\nipa.bundle_id\n# =\u003e com.icyleaf.AppInfoDemo\n\n# get app icons (uncrushed png by default)\nipa.icons\n# =\u003e [{:name=\u003e\"AppIcon29x29@2x~ipad.png\", :file=\u003e\"temp/dir/app/AppIcon29x29@2x~ipad.png\"}, :dimensions=\u003e[29, 29], :uncrushed_file=\u003e\"...\" ...]\n\n# get provisioning profile devices\nipa.devices\n# =\u003e ['18cf53cddee60c5af9c97b1521e7cbf8342628da']\n\n# detect app type\nipa.ipad?\nipa.iphone?\nipa.universal?\nipa.appletv?\n\n# detect app release type\nipa.release_type\n# =\u003e 'AdHoc'\n\n# detect architecture(s)\nipa.archs\n# =\u003e [:armv7, :arm64]\n\n# get built-in frameworks\nipa.frameworks\n# =\u003e [\u003cAppInfo::Framework:520 @name=Masonry.framework\u003e, \u003cAppInfo::Framework:520 @name=libswiftPhotos.dylib\u003e]\n\n# get built-in plugins\nipa.plugins\n# =\u003e [\u003cAppInfo::Plugin:1680 @name=NotificationService\u003e]\n\n# get url schemes\nipa.url_schemes\n# =\u003e [{:name=\u003e\"Web\", :role=\u003e\"Editor\", :schemes=\u003e[\"app-info\", \"app_info\"]}]\n\n# get query schemes\nipa.url_schemes\n# =\u003e [\"twitter\", \"instagram\", \"www-x-callback\"]\n\n# get background modes\nipa.background_modes\n# =\u003e [\"audio\", \"fetch\", \"remote-notification\"]\n\n# get more propety in Info.plist\nipa.info[:CFBundleDisplayName]\n# =\u003e 'AppInfoDemo'\n```\n\nMore to check [rspec test](spec/app_info).\n\n### Mobile Provision\n\nExtract from IPA parser, it could teardown any .mobileprovision file(Provisioning Profile).\nyou can download it from Apple Developer Portal.\n\n```ruby\nprofile = AppInfo.parse('~/Library/MobileDevice/Provisioning\\ Profiles/6e374bb8-a801-411f-ab28-96a4baa23814.mobileprovision')\n\n# get app release version\nprofile.team_id\n# =\u003e '3J9E73E9XS'\n\n# get app package name\nprofile.team_name\n# =\u003e 'Company/Team Name'\n\n# get UDID of devices\nprofile.devices\n# =\u003e ['18cf53cddee60c5af9c97b1521e7cbf8342628da']\n\n# detect type\nprofile.type\n# =\u003e :development/:adhoc/:appstore/:enterprise\n\n# get enabled capabilities\nprofile.enabled_capabilities\n# =\u003e ['Apple Pay', 'iCloud', 'Sign In with Apple', ...]\n```\n\n### Android\n\nAccept `.aab` and `.apk` Android file.\n\n```ruby\nandroid = AppInfo.parse('android.apk_or_aab')\n\n# get app file size\nandroid.size\n# =\u003e 3093823\n\n# get app file size in human reable.\nandroid.size(human_size: true)\n# =\u003e 29 MB\n\n# get app release version\nandroid.release_version\n# =\u003e 1.0\n\n# get app package name\nandroid.bundle_id\n# =\u003e com.icyleaf.AppInfoDemo\n\n# detect app type (It's difficult to detect phone or tablet)\nandroid.tv?\nandroid.wear?\nandroid.automotive?\n\n# get app icons\nandroid.icons\n# =\u003e [{:name=\u003e\"ic_launcher.png\", :file=\u003e \"/temp/dir/app/ic_launcher.png\", :dimensions=\u003e[48, 48]}, ...]\n\n# get app support min sdk version\nandroid.min_sdk_version\n# =\u003e 13\n\n# get use_permissions list\nandroid.use_permissions\n# =\u003e [...]\n\n# get activitiy list\nandroid.activities\n# =\u003e [...]\n\n# get service list\nandroid.services\n# =\u003e [...]\n\n# get deep links host\nandroid.deep_links\n# =\u003e ['a.com']\n\n# get schemes without http or https\nandroid.schemes\n# =\u003e ['appinfo']\n\n# get v1-v3 scheme singature information (included unverified certificate and more)\nandroid.signatures\n# =\u003e [...]\n```\n\n### HarmonyOS\n\nAccept `.hap` and `.app` HarmonyOS file. Only metabase, except resources mapping.\n\n```ruby\nhap = AppInfo.parse('app.hap')\n\n# get app file size\nandroid.size\n# =\u003e 2013213\n\n# get app file size in human reable.\nandroid.size(human_size: true)\n# =\u003e 21 MB\n\n# get app release version\nandroid.release_version\n# =\u003e 1.0\n\n# get app package name\nandroid.bundle_id\n# =\u003e com.icyleaf.AppInfoDemo\n```\n\n### macOS\n\nOnly accept zipped macOS file.\n\n```ruby\nmacos = AppInfo.parse('macos_app.zip')\n\n# get app file size\nmacos.size\n# =\u003e 3093823\n\n# get app file size in human reable.\nmacos.size(human_size: true)\n# =\u003e 29 MB\n\n# get app release version\nmacos.release_version\n# =\u003e 1.0\n\n# get app bundle id\nmacos.bundle_id\n# =\u003e com.icyleaf.AppInfoDemo\n\n# Get minimize os version\nmacos.min_os_version\n# =\u003e 11.3\n\n# get app icons(convertd icns to png icon sets by default)\nmacos.icons\n# =\u003e [{:name=\u003e\"AppIcon.icns\", :file=\u003e\"/temp/dir/app/AppIcon.icns\"}, :sets=\u003e[{:name=\u003e\"64x64_AppIcon.png\", :file=\u003e\"/temp/dir/app/64x64_AppIcon.png\", :dimensions=\u003e[64, 64]}, ...]\n\n# detect publish on mac app store\nmacos.stored?\n# =\u003e true/false\n\n# detect architecture(s)\nmacos.archs\n# =\u003e [:x86_64, :arm64]\n\n# get more propety in Info.plist\nmacos.info[:CFBundleDisplayName]\n# =\u003e 'AppInfoDemo'\n```\n\n### dSYM\n\n```ruby\ndsym = AppInfo.parse('ios.dSYM.zip')\n\n# get object name\ndsym.object\n# =\u003e iOS\n\n# get total count of macho\ndsym.machos.count\n# =\u003e 1 or 2\n\ndsym.machos.each do |macho|\n  # get cpu type\n  macho.cpu_type\n  # =\u003e :arm\n\n  # get cpu name\n  macho.cpu_name\n  # =\u003e armv7\n\n  # get UUID (debug id)\n  macho.uuid\n  # =\u003e 26dfc15d-bdce-351f-b5de-6ee9f5dd6d85\n\n  # get macho size\n  macho.size\n  # =\u003e 866526\n\n  # get macho size in human reable.\n  macho.size(human_size: true)\n  # =\u003e 862 KB\n\n  # dump data to Hash\n  macho.to_h\n  # =\u003e {uuid:\"26dfc15d-bdce-351f-b5de-6ee9f5dd6d85\", cpu_type: :arm, cpu_name: :armv7, ...}\nend\n```\n\n### Windows\n\nAccept any PE format file, such like `.exe` or `.exe` binary fin a zip file.\n\n```ruby\nwin = AppInfo.parse('win.exe')\n\n# get given file size\nwin.size\n# =\u003e 3093823\n\n# get given file size in human reable.\nwin.size(human_size: true)\n# =\u003e 29 MB\n\n# get given file size\nwin.binary_size\n# =\u003e 20940\n\n# get given file size in human reable.\nwin.size(human_size: true)\n# =\u003e 20 MB\n\n# get product name\nwin.name\n# =\u003e AppInfo\n\n# get app company name\nwin.company_name\n# =\u003e EWS Studio\n\n# get app product version (alias to release_version)\nwin.product_version\n# =\u003e 1.0.0\n\n# get app assembly version (alias to build_version)\nwin.assembly_version\n# =\u003e 1.0.0\n\n# detect architecture(s)\nwin.archs\n# =\u003e x64\n\n# get all imports files\nwin.imports\n# =\u003e [KERNEL32.dll, ...]\n\n# get app icons (bmp format image)\nwin.icons\n# =\u003e [{:name=\u003e\"ICON.bmp\", :file=\u003e\"{path}/ICON.bmp\"}, :dimensions=\u003e[64, 64]}, ...]\n```\n\n## CLI Shell (Interactive console)\n\nIt is possible to use this gem as a command line interface to parse mobile app:\n\n```\n\u003e app-info\n\napp-info (2.7.0)\u003e p = AppInfo.parse('/path/to/app')\n=\u003e #\u003cAppInfo::APK::......\u003e\napp-info (2.7.0)\u003e p.name\n=\u003e \"AppName\"\n```\n\n## Best Practice\n\n- [fastlane-plugin-app_info](https://github.com/icyleaf/fastlane-plugin-app_info): fastlane plugin\n- [zealot](https://github.com/tryzealot/zealot/): Over The Air Server for deployment of Android and iOS apps\n\n## Development\n\nAfter checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.\n\nTo install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).\n\n## Contributing\n\nBug reports and pull requests are welcome on GitHub at https://github.com/icyleaf/app-info. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.\n\n## License\n\nThe gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ficyleaf%2Fapp-info","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ficyleaf%2Fapp-info","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ficyleaf%2Fapp-info/lists"}