{"id":25216343,"url":"https://github.com/starburst997/android-code-sign","last_synced_at":"2025-04-05T09:15:18.650Z","repository":{"id":276078648,"uuid":"927895434","full_name":"starburst997/android-code-sign","owner":"starburst997","description":"Code Signing for Android via Github Actions","archived":false,"fork":false,"pushed_at":"2025-02-20T16:23:16.000Z","size":219,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-20T17:32:34.422Z","etag":null,"topics":["android","code-sign","code-signing","codesign","codesigning","playstore","tutorial"],"latest_commit_sha":null,"homepage":"https://jd.boiv.in/post/2025/02/05/android-publish.html","language":"Kotlin","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/starburst997.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-05T18:08:55.000Z","updated_at":"2025-02-20T16:23:21.000Z","dependencies_parsed_at":null,"dependency_job_id":"4935358c-ca40-4929-b348-b43eee02b1ff","html_url":"https://github.com/starburst997/android-code-sign","commit_stats":null,"previous_names":["starburst997/android-code-sign"],"tags_count":3,"template":true,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/starburst997%2Fandroid-code-sign","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/starburst997%2Fandroid-code-sign/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/starburst997%2Fandroid-code-sign/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/starburst997%2Fandroid-code-sign/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/starburst997","download_url":"https://codeload.github.com/starburst997/android-code-sign/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247312078,"owners_count":20918344,"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":["android","code-sign","code-signing","codesign","codesigning","playstore","tutorial"],"created_at":"2025-02-10T19:17:48.812Z","updated_at":"2025-04-05T09:15:18.641Z","avatar_url":"https://github.com/starburst997.png","language":"Kotlin","readme":"# android-code-sign\n\nSample project to code-sign and publish an Android App to the Play Store.\n\nThe following text is a copy of my blog post: [**Code Signing for Android via Github Action**](https://jd.boiv.in/post/2025/02/05/android-publish.html).\n\n**TL;DR**: By using [fastlane supply](https://docs.fastlane.tools/actions/supply/) and [Github Action](https://github.com/features/actions) we can compile and publish a code-signed Android app on the Play Store.\n\n*(Part three of my series on code-signing / distributing apps, check [Part 2 on Apple](https://github.com/starburst997/apple-code-sign))*\n\n\u003cbr/\u003e\n\n## Create Github Repository\n\nCreate a Github Repository for your project. Feel free to use [this repository](https://github.com/starburst997/android-code-sign) as a template since it already contains all the workflows files.\n\n\u003cbr/\u003e\n\n## Installing fastlane\n\nWe need to install [fastlane](https://fastlane.tools/) locally on our machine, first makes sure you have [ruby](https://www.ruby-lang.org/en/documentation/installation/#rubyinstaller) installed (personally I prefer via [WSL2](https://learn.microsoft.com/en-us/windows/wsl/install)).\n\nAlso you need to makes sure [Bundler](https://bundler.io/) is installed:\n\n```console\ngem install bundler\n```\n\nNow create a file called `Gemfile` in the root:\n\n```ruby\nsource \"https://rubygems.org\"\ngem \"fastlane\"\ngem 'fastlane-plugin-github_action', git: \"https://github.com/starburst997/fastlane-plugin-github_action\"\n```\n\nNotice that we're using my fork of [joshdholtz/fastlane-plugin-github_action](https://github.com/starburst997/fastlane-plugin-github_action), this is because the published gem is out of date.\n\nNow run:\n\n```console\nbundle install\n```\n\n\u003cbr/\u003e\n\n## Create a Google Play Console Account\n\n[Sign up](https://play.google.com/console/signup) for a **Google Play Console** account, you'll need to pay a one-time fee of $25 and verify your identity. \n\nYou can follow the [instructions here](https://support.google.com/googleplay/android-developer/answer/6112435) but it's pretty straight-forward.\n\n\u003cbr/\u003e\n\n## Create a Google Service Account\n\nTo programmatically access the [Google Play Console](https://play.google.com/console/?hl=en), you will need a dedicated **Google Service** account with API access.\n\nThe [fastlane documentation](https://docs.fastlane.tools/actions/supply/) highlight the steps but here's a summary:\n\n\u003ctable align=\"center\"\u003e\u003ctr\u003e\u003ctd\u003e\n\u003ca href=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/google-service-01.png\" target=\"_blank\"\u003e\u003cimg src=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/small/google-service-01.png\" alt=\"Create Google Project\" title=\"Create Google Project\"/\u003e\u003c/a\u003e\u003cp align=\"center\"\u003e1\u003c/p\u003e\n\u003c/td\u003e\u003ctd\u003e\n\u003ca href=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/google-service-02.png\" target=\"_blank\"\u003e\u003cimg src=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/small/google-service-02.png\" alt=\"Enable Google Play Developer API\" title=\"Enable Google Play Developer API\"/\u003e\u003c/a\u003e\u003cp align=\"center\"\u003e2\u003c/p\u003e\n\u003c/td\u003e\u003ctd\u003e\n\u003ca href=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/google-service-03.png\" target=\"_blank\"\u003e\u003cimg src=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/small/google-service-03.png\" alt=\"Select your project\" title=\"Select your project\" /\u003e\u003c/a\u003e\u003cp align=\"center\"\u003e3\u003c/p\u003e\n\u003c/td\u003e\u003ctd\u003e\n\u003ca href=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/google-service-04.png\" target=\"_blank\"\u003e\u003cimg src=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/small/google-service-04.png\" alt=\"Create a new Service Account\" title=\"Create a new Service Account\" /\u003e\u003c/a\u003e\u003cp align=\"center\"\u003e4\u003c/p\u003e\n\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\n1. Create a [Google Cloud Project](https://console.cloud.google.com/projectcreate) (or use an existing one). Give it a name and click create ([more info](https://cloud.google.com/resource-manager/docs/creating-managing-projects)).\n\n2. Enable the [Google Play Developer API](https://console.developers.google.com/apis/api/androidpublisher.googleapis.com/?hl=en) by clicking the **Enable API** button for your newly created project.\n\n3. Open [Service Accounts](https://console.cloud.google.com/iam-admin/serviceaccounts?hl=en) on Google Cloud and select your project.\n\n4. Create a new **Service Account** by clicking the create button.\n\n\u003ctable align=\"center\"\u003e\u003ctr\u003e\u003ctd\u003e\n\u003ca href=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/google-service-05.png\" target=\"_blank\"\u003e\u003cimg src=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/small/google-service-05.png\" alt=\"Fill form, copy email\" title=\"Fill form, copy email\"/\u003e\u003c/a\u003e\u003cp align=\"center\"\u003e5\u003c/p\u003e\n\u003c/td\u003e\u003ctd\u003e\n\u003ca href=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/google-service-06.png\" target=\"_blank\"\u003e\u003cimg src=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/small/google-service-06.png\" alt=\"Select Managed Key\" title=\"Select Managed Key\"/\u003e\u003c/a\u003e\u003cp align=\"center\"\u003e6\u003c/p\u003e\n\u003c/td\u003e\u003ctd\u003e\n\u003ca href=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/google-service-07.png\" target=\"_blank\"\u003e\u003cimg src=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/small/google-service-07.png\" alt=\"Create new key\" title=\"Create new key\" /\u003e\u003c/a\u003e\u003cp align=\"center\"\u003e7\u003c/p\u003e\n\u003c/td\u003e\u003ctd\u003e\n\u003ca href=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/google-service-08.png\" target=\"_blank\"\u003e\u003cimg src=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/small/google-service-08.png\" alt=\"Save JSON key\" title=\"Save JSON key\" /\u003e\u003c/a\u003e\u003cp align=\"center\"\u003e8\u003c/p\u003e\n\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\n5. Give it a name and ID, copy the resulting **Email address** (we will need it later). Click on **Done**, *NOT* ~Create and Continue~.\n\n6. Click on the vertical **three-dot icon** (under **Actions**) of your newly created account, and select **Manage keys**.\n\n7. Click on **Add key** and select **Create new key**.\n\n8. Make sure to select **JSON**, click **Create** and save the file on your computer.\n\n\u003cbr/\u003e\n\n## Invite Service Account to Google Play Console\n\n\u003ctable align=\"center\"\u003e\u003ctr\u003e\u003ctd\u003e\n\u003ca href=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/invite-service-01.png\" target=\"_blank\"\u003e\u003cimg src=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/small/invite-service-01.png\" alt=\"Invite new user\" title=\"Invite new user\"/\u003e\u003c/a\u003e\u003cp align=\"center\"\u003e1\u003c/p\u003e\n\u003c/td\u003e\u003ctd\u003e\n\u003ca href=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/invite-service-02.png\" target=\"_blank\"\u003e\u003cimg src=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/small/invite-service-02.png\" alt=\"Paste email address\" title=\"Paste email address\"/\u003e\u003c/a\u003e\u003cp align=\"center\"\u003e2\u003c/p\u003e\n\u003c/td\u003e\u003ctd\u003e\n\u003ca href=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/invite-service-03.png\" target=\"_blank\"\u003e\u003cimg src=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/small/invite-service-03.png\" alt=\"Choose permissions\" title=\"Choose permissions\" /\u003e\u003c/a\u003e\u003cp align=\"center\"\u003e3\u003c/p\u003e\n\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\n1. Open the [Google Play Console](https://play.google.com/console/?hl=en) and select **Users and Permissions**. Click **Invite new users**.\n\n2. Paste the **email address** of the **Service Account** you saved for later (`xxxx@yyyy.iam.gserviceaccount.com`).\n\n3. Choose the permissions: **Admin (all permissions)**. Click on **Invite User**.\n\n\u003cbr/\u003e\n\n## Test your JSON file\n\nWe can now test that the connection is valid using your **JSON file** by running this command:\n\n```sh\nbundle exec fastlane run validate_play_store_json_key json_key:/path/to/your/downloaded/file.json\n```\n\nLook for `Successfully established connection to Google Play Store`.\n\n\u003cbr/\u003e\n\n## Generate a Personal Access Token (PAT)\n\n\u003ctable align=\"center\"\u003e\u003ctr\u003e\u003ctd\u003e\n\u003ca href=\"https://jd.boiv.in/assets/posts/2025-02-02-code-signing-apple/pat_01.png\" target=\"_blank\"\u003e\u003cimg src=\"https://jd.boiv.in/assets/posts/2025-02-02-code-signing-apple/small/pat_01.png\" alt=\"Generate New Token (Classic)\" title=\"Generate New Token (Classic)\" /\u003e\u003c/a\u003e\u003cp align=\"center\"\u003e1\u003c/p\u003e\n\u003c/td\u003e\u003ctd\u003e\n\u003ca href=\"https://jd.boiv.in/assets/posts/2025-02-02-code-signing-apple/pat_02.png\" target=\"_blank\"\u003e\u003cimg src=\"https://jd.boiv.in/assets/posts/2025-02-02-code-signing-apple/small/pat_02.png\" alt=\"Use repo score\" title=\"Use repo score\"/\u003e\u003c/a\u003e\u003cp align=\"center\"\u003e2\u003c/p\u003e\n\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\nWe also need to generate a **Personal Access Token** for Github. \n\nThis will enables us to increment a build number after each build.\n\n1. Visit your [settings page](https://github.com/settings/tokens) and click on **Generate new token** and select **Generate new token (classic)**.\n\n2. We need all the **repo** scope enabled. Set **no expiration**. Click **Generate token** and save the value.\n\n### Save secrets\n\nSave this secret in the github repository for your project:\n\n- `GH_PAT`: The value of your newly generated token\n\n\u003cbr/\u003e\n\n## Generate an upload key and keystore\n\nYou can generate your key using [Android Studio](https://developer.android.com/studio/publish/app-signing#generate-key), but here's how you can do it on the command line using [keytool](https://docs.oracle.com/javase/7/docs/technotes/tools/solaris/keytool.html) (available in your JDK's bin folder):\n\n```sh\nkeytool -genkey -v -keystore .keystore -keyalg RSA -keysize 2048 -validity 10000\n```\n\nYou'll be prompt to add some information, keep notes of the **password** (use the same for both) and the **alias**.\n\nFor ease of use afterward, we'll save the keystore as **base64** and save it as a secret in our repository.\n\n```sh\nbase64 .keystore\n```\n\nI've also created a [Github Action](https://github.com/starburst997/keystore-gh-actions) that you can run in this repository called: **Generate .keystore** ([.yml](https://github.com/starburst997/android-code-sign/blob/main/.github/workflows/keystore.yml)). You need to set the secrets: `ANDROID_KEYSTORE_PASS` and `ANDROID_KEYALIAS_PASS` first since there is no way to input password string in Github Action yet. Makes sure you added the `GH_PAT` secret as well.\n\nThe action will add the `ANDROID_KEYALIAS_NAME` and `ANDROID_KEYSTORE_BASE64` secrets once done.\n\nEither the PKCS12 or JKS variant will works.\n\n\u003cbr/\u003e\n\n## Save secrets\n\nWe can now add all the necessary secrets to our repository:\n\n- `GOOGLE_PLAY_KEY_FILE`: The **JSON** file content from the **Service Account**.\n- `ANDROID_KEYALIAS_NAME`: The **alias** used for the **.keystore**.\n- `ANDROID_KEYSTORE_PASS`: The **password** used for the **.keystore**.\n- `ANDROID_KEYALIAS_PASS`: The **password** used for the **.keystore** (same as above).\n- `ANDROID_KEYSTORE_BASE64`: The **base64** value of the **.keystore** file.\n- `ANDROID_PACKAGE_NAME`: The package name of your app.\n\n*(Save those variables inside a Password Manager for re-use in future projects, except for the package name, they won't change)*\n\n\u003cbr/\u003e\n\n## Build .aab\n\nBefore you can upload your app via [fastlane](https://docs.fastlane.tools/actions/supply/), you need to manually submit your app once (see [fastlane/fastlane#14686](https://github.com/fastlane/fastlane/issues/14686)).\n\nThe [android folder](https://github.com/starburst997/android-code-sign/tree/main/android) contains a simple \"Hello World\" project.\n\n\u003ctable align=\"center\"\u003e\u003ctr\u003e\u003ctd\u003e\n\u003ca href=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/action-01.png\" target=\"_blank\"\u003e\u003cimg src=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/small/action-01.png\" alt=\"Run Build action\" title=\"Run Build action\" /\u003e\u003c/a\u003e\u003cp align=\"center\"\u003e1\u003c/p\u003e\n\u003c/td\u003e\u003ctd\u003e\n\u003ca href=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/action-02.png\" target=\"_blank\"\u003e\u003cimg src=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/small/action-02.png\" alt=\"Download artifact\" title=\"Download artifact\"/\u003e\u003c/a\u003e\u003cp align=\"center\"\u003e2\u003c/p\u003e\n\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\n1. **Build** your app using the Github Action (**Build Android**). Go to the **Actions** tab and click **Run Workflow**.\n2. **Download** the artifact once the action is done.\n\n\u003cbr/\u003e\n\n## Create app in Google Play Console\n\n\u003ctable align=\"center\"\u003e\u003ctr\u003e\u003ctd\u003e\n\u003ca href=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/create-app-01.png\" target=\"_blank\"\u003e\u003cimg src=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/small/create-app-01.png\" alt=\"Create App\" title=\"Create App\"/\u003e\u003c/a\u003e\u003cp align=\"center\"\u003e1\u003c/p\u003e\n\u003c/td\u003e\u003ctd\u003e\n\u003ca href=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/create-app-02.png\" target=\"_blank\"\u003e\u003cimg src=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/small/create-app-02.png\" alt=\"Fill form\" title=\"Fill form\"/\u003e\u003c/a\u003e\u003cp align=\"center\"\u003e2\u003c/p\u003e\n\u003c/td\u003e\u003ctd\u003e\n\u003ca href=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/create-app-03.png\" target=\"_blank\"\u003e\u003cimg src=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/small/create-app-03.png\" alt=\"Create new release\" title=\"Create new release\" /\u003e\u003c/a\u003e\u003cp align=\"center\"\u003e3\u003c/p\u003e\n\u003c/td\u003e\u003ctd\u003e\n\u003ca href=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/create-app-04.png\" target=\"_blank\"\u003e\u003cimg src=\"https://jd.boiv.in/assets/posts/2025-02-05-android-publish/small/create-app-04.png\" alt=\"Upload .aab\" title=\"Upload .aab\" /\u003e\u003c/a\u003e\u003cp align=\"center\"\u003e4\u003c/p\u003e\n\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\n1. Open the [Google Play Console](https://play.google.com/console/?hl=en) and click **Create app**.\n\n2. Fill out the form and click **Create app**.\n\n3. In the **Test and release** section, select **testing** and then **Internal testing**.Click **Create new release**.\n\n4. Drag and drop your **.aab**, enter release name and notes. Click **Save and publish**\n\n\u003cbr/\u003e\n\n## Create Fastfiles\n\n#### fastlane/Appfile\n```ruby\nfor_platform :android do\n  package_name(ENV[\"ANDROID_PACKAGE_NAME\"])\n  json_key_file(ENV[\"GOOGLE_PLAY_KEY_FILE_PATH\"])\nend\n```\n\n#### fastlane/Fastfile\n```ruby\norg, repo = (ENV[\"GITHUB_REPOSITORY\"]||\"\").split(\"/\")\nmatch_org, match_repo = (ENV[\"MATCH_REPOSITORY\"]||\"\").split(\"/\")\n\nplatform :android do\n  desc \"Upload a new Android version to the production Google Play Store\"\n  lane :production do\n    upload_to_play_store(track: 'production', release_status: 'completed', aab: \"#{ENV['ANDROID_BUILD_FILE_PATH']}\")\n  end\n\n  desc \"Upload a new Android internal version to Google Play\"\n  lane :internal do\n    upload_to_play_store(track: 'internal', release_status: 'completed', aab: \"#{ENV['ANDROID_BUILD_FILE_PATH']}\")\n  end\nend\n```\n\n\u003cbr/\u003e\n\n## Create workflows\n\nBy using `workflow_call` we can simplify the workflow file by referencing an external one, but feel free to copy the original instead to fit your pipeline better.\n\nSave those inside the `.github/workflows` directory of your repository.\n\n#### android.yml ([original](https://github.com/starburst997/android-code-sign/blob/v1/.github/workflows/android.yml))\n```yml\nname: Build Android\n\non: \n  workflow_dispatch:\n  workflow_call:\n\njobs:\n  build:\n    uses: starburst997/android-code-sign/.github/workflows/android.yml@v1\n    secrets: inherit\n    with:\n      path: 'android'\n      module: 'app'\n      version: '1.0'\n```\n\n#### publish_android.yml ([original](https://github.com/starburst997/android-code-sign/blob/v1/.github/workflows/publish_android.yml))\n```yml\nname: Publish Android\n\non: \n  workflow_dispatch:\n\njobs:\n  build:\n    uses: ./.github/workflows/android.yml\n    secrets: inherit\n\n  publish:\n    uses: starburst997/android-code-sign/.github/workflows/publish_android.yml@v1\n    needs: [build]\n    secrets: inherit\n    with:\n      lane: 'internal'\n```\n\nNotice that we need to specify the project's path, module and version.\n\n\u003cbr/\u003e\n\n## Publish an update\n\nNow you can call the **Publish Android** action and you should see a new build appears in your internal test lane.\n\nMakes sure your app has been **reviewed** by filling all the necessary steps in [Google Play Console](https://play.google.com/console/?hl=en), otherwise you'll get an error: `Only releases with status draft may be created on draft app.`\n\nThe workflow will also automatically increment the build number and save it as a variable in the repository.\n\nI've also included a [release workflow](https://github.com/starburst997/android-code-sign/blob/main/.github/workflows/release.yml) as an example.\n\n\u003cbr/\u003e\n\nCode-signing / distributing app series:\n- Part 1: [Code Signing for Windows as an Individual Developer](https://github.com/starburst997/windows-code-sign)\n- Part 2: [Code Signing for Apple without a mac](https://github.com/starburst997/apple-code-sign)\n- Part 3: [Code Signing for Android via Github Actions](https://github.com/starburst997/android-code-sign)\n- Part 4: [Build and publish your Unity Game using Github Actions](https://github.com/starburst997/windows-code-sign)\n\n\u003cbr/\u003e","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstarburst997%2Fandroid-code-sign","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstarburst997%2Fandroid-code-sign","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstarburst997%2Fandroid-code-sign/lists"}