You've already forked revanced-patcher
							
							
				mirror of
				https://github.com/revanced/revanced-patcher
				synced 2025-10-29 18:30:51 +01:00 
			
		
		
		
	Compare commits
	
		
			226 Commits
		
	
	
		
			v15.0.0-de
			...
			feat/kmp
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | c2e0f57579 | ||
|   | 242e244b18 | ||
|   | f338ebff6c | ||
|   | 00e5950cf2 | ||
|   | 5a0e3841ff | ||
|   | cfb459b832 | ||
|   | 2096306107 | ||
|   | 92eaba8081 | ||
|   | 7be0cd8548 | ||
|   | ab624f04f6 | ||
|   | 21b5c079fb | ||
|   | 5024204046 | ||
|   | a44802ef4e | ||
|   | 4c1c34ad01 | ||
|   | b2aecb726d | ||
|   | 851f9c7885 | ||
|   | ea6fc70caa | ||
|   | a2875d1d64 | ||
|   | 2be6e97817 | ||
|   | 348d0070e7 | ||
|   | d53aacdad4 | ||
|   | f1615b7ab5 | ||
|   | ffb1d880d7 | ||
|   | e95f13ae3e | ||
|   | e1b984d601 | ||
|   | c2dc29e061 | ||
|   | 69f2f20fd9 | ||
|   | 525beda18e | ||
|   | 73d3cbf4ff | ||
|   | 70278dd79d | ||
|   | 5e98e9e30a | ||
|   | ac1aff5a1a | ||
|   | 5481d0c54c | ||
|   | 4604742d0f | ||
|   | 4beb907a61 | ||
|   | 7f44174d91 | ||
|   | d310246852 | ||
|   | dcc989243c | ||
|   | 5227e98abf | ||
|   | 8c4dd5b3a3 | ||
|   | 736b3eebbf | ||
|   | b41a542952 | ||
|   | d21128fe2e | ||
|   | cf4374b8cf | ||
|   | 8a30b0fa10 | ||
|   | 11a911dc67 | ||
|   | 6e3ba7419b | ||
|   | 50a66ccfed | ||
|   | 0be79840b1 | ||
|   | d8b4c60321 | ||
|   | f77e99e817 | ||
|   | ea26c486c0 | ||
|   | bebb734608 | ||
|   | d842f82d07 | ||
|   | 82bab58ac2 | ||
|   | 90b7631d9e | ||
|   | 26d449e6d9 | ||
|   | 49466060e3 | ||
|   | 620ea5b852 | ||
|   | 3e2168a2b2 | ||
|   | 13c77967b1 | ||
|   | f57e571a14 | ||
|   | fe616beb22 | ||
|   | 41257ee87e | ||
|   | 33ed5f0aa3 | ||
|   | d0a57ac00d | ||
|   | b0b2c10665 | ||
|   | cc183062ab | ||
|   | fe8ea9130d | ||
|   | f1c60093cf | ||
|   | 687b884dc4 | ||
|   | ceb6fd51c1 | ||
|   | 0b223bfe65 | ||
|   | 308e95cf62 | ||
|   | db8866212a | ||
|   | 608a05d9aa | ||
|   | 55746ed705 | ||
|   | e33026c538 | ||
|   | ff215620bb | ||
|   | fec31f45da | ||
|   | 7684b70324 | ||
|   | 55a5d3bd4e | ||
|   | 17a4675a8e | ||
|   | 98085d1d45 | ||
|   | bc5c16f112 | ||
|   | f1d7217495 | ||
|   | 64dd1526cd | ||
|   | c9a82608f7 | ||
|   | 9fc42e132c | ||
|   | efa98ece45 | ||
|   | 68e2acebba | ||
|   | 7a7a8fc353 | ||
|   | f8306ac43d | ||
|   | d03591b735 | ||
|   | 4a9184597b | ||
|   | 0a482f8c9a | ||
|   | e7dacfba8c | ||
|   | 2d7fffd4ec | ||
|   | f8baabbcec | ||
|   | 716825f232 | ||
|   | 58bd46750b | ||
|   | 288240f163 | ||
|   | ff02452cb8 | ||
|   | 462fbe2cad | ||
|   | 7aeae93f3d | ||
|   | f1de9b39ef | ||
|   | db5b0ed7be | ||
|   | 9f28a01c03 | ||
|   | 80407b6102 | ||
|   | 287841d806 | ||
|   | 10c3be1195 | ||
|   | 0c0e22013b | ||
|   | f35c8d4446 | ||
|   | 17418d4b9c | ||
|   | ec1fbdf2ae | ||
|   | 56e5a46fd5 | ||
|   | 32e86d44a3 | ||
|   | 7100606dfc | ||
|   | d7eb111460 | ||
|   | 27ea46653e | ||
|   | 12c43072cb | ||
|   | 671aa6d507 | ||
|   | b697bbad2b | ||
|   | f05a404e48 | ||
|   | a46e948b5a | ||
|   | dc09ea639f | ||
|   | 49ed096e85 | ||
|   | 167bd83f4e | ||
|   | aed1eac315 | ||
|   | 54a2f8f16f | ||
|   | 2ca543ffb9 | ||
|   | 58e7f815a5 | ||
|   | 15b38fc841 | ||
|   | e2ca50729d | ||
|   | 6192089b71 | ||
|   | a4212f6bf9 | ||
|   | 124a2e9d3e | ||
|   | f77624b3b9 | ||
|   | a76ac04214 | ||
|   | 0447fa9c28 | ||
|   | 54ac1394a9 | ||
|   | 0b04c73ac5 | ||
|   | 079de45238 | ||
|   | 56ce9ec2f9 | ||
|   | 1b52e4b0f9 | ||
|   | 098c2c1efa | ||
|   | 64343e5a7c | ||
|   | 0caf6caeb9 | ||
|   | 55f6c2a9fc | ||
|   | c6095bc38a | ||
|   | 09cd6aa568 | ||
|   | ebbaafb78e | ||
|   | e6de90d300 | ||
|   | c7922e90d0 | ||
|   | c1f4c0445a | ||
|   | caa634fac6 | ||
|   | f28bfe0dbd | ||
|   | 155e787ff4 | ||
|   | c38f0ef42a | ||
|   | 4456031459 | ||
|   | 5fb59a227f | ||
|   | d9fb241d57 | ||
|   | 642c4ea97e | ||
|   | 8c8a251626 | ||
|   | 5953d6cfb5 | ||
|   | a1962fe600 | ||
|   | 77dbee3d6a | ||
|   | cb5e39d73e | ||
|   | 38ef2f470a | ||
|   | 129d84e108 | ||
|   | affeba76b8 | ||
|   | 6059d3ca26 | ||
|   | 444dee5a16 | ||
|   | d314466ce2 | ||
|   | fdaf9c21c8 | ||
|   | 06c2b76f11 | ||
|   | 3896b30738 | ||
|   | 2c4b88e1a0 | ||
|   | dfc7e1596b | ||
|   | f590436399 | ||
|   | cbfb9ba02f | ||
|   | b4cfe80ad5 | ||
|   | b37906fa35 | ||
|   | 356f1f1553 | ||
|   | e882af74ee | ||
|   | 46875fb28e | ||
|   | 417c3e4234 | ||
|   | 6d2c28807b | ||
|   | 4d6e08a650 | ||
|   | 5cebc1fd30 | ||
|   | ac61731dc6 | ||
|   | 9e4ffabd5c | ||
|   | 3f410bd39f | ||
|   | d51bc32e37 | ||
|   | b7f6aa94cc | ||
|   | ff965e6953 | ||
|   | 468d5d7421 | ||
|   | fc95b28c49 | ||
|   | 69184187d9 | ||
|   | a802d0df46 | ||
|   | 8de30633ae | ||
|   | a1fbb7990f | ||
|   | aa71146b1b | ||
|   | 9fdb8f087f | ||
|   | 670f0153de | ||
|   | 1d7aeca696 | ||
|   | 4e7811ea07 | ||
|   | e11283744a | ||
|   | 91cdfd53ef | ||
|   | bc7d6b9941 | ||
|   | 6b1e0a1656 | ||
|   | 72c9eb2129 | ||
|   | 4bc4b0dc01 | ||
|   | 637d48746f | ||
|   | 9a109c129b | ||
|   | d49e4ee5ea | ||
|   | 30f0ea29a3 | ||
|   | 49930f6565 | ||
|   | 909d89fa8d | ||
|   | 81d1d7f544 | ||
|   | 67b7dff67a | ||
|   | 4b76d19596 | ||
|   | 080fbe9feb | ||
|   | d3721229bf | ||
|   | 86c1c9c772 | ||
|   | c299817193 | 
							
								
								
									
										3
									
								
								.editorconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.editorconfig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| [*.{kt,kts}] | ||||
| ktlint_code_style = intellij_idea | ||||
| ktlint_standard_no-wildcard-imports = disabled | ||||
							
								
								
									
										72
									
								
								.github/ISSUE_TEMPLATE/bug-issue.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										72
									
								
								.github/ISSUE_TEMPLATE/bug-issue.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,72 +0,0 @@ | ||||
| name: 🐞 Bug report | ||||
| description: Report a very clearly broken issue. | ||||
| title: 'bug: <title>' | ||||
| labels: [bug] | ||||
| body: | ||||
|   - type: markdown | ||||
|     attributes: | ||||
|       value: | | ||||
|         # ReVanced bug report | ||||
|  | ||||
|         Important to note that your issue may have already been reported before. Please check for existing issues [here](https://github.com/revanced/revanced-patcher/labels/bug). | ||||
|  | ||||
|   - type: dropdown | ||||
|     attributes: | ||||
|       label: Type | ||||
|       options: | ||||
|         - Crash | ||||
|         - Cosmetic | ||||
|         - Other | ||||
|     validations: | ||||
|       required: true | ||||
|   - type: textarea | ||||
|     attributes: | ||||
|       label: Bug description | ||||
|       description: How did you find the bug? Any additional details that might help? | ||||
|     validations: | ||||
|       required: true | ||||
|   - type: textarea | ||||
|     attributes: | ||||
|       label: Steps to reproduce | ||||
|       description: Add the steps to reproduce this bug including your environment. | ||||
|       placeholder: Step 1. Download some files. Step 2. ... | ||||
|     validations: | ||||
|       required: true | ||||
|   - type: textarea | ||||
|     attributes: | ||||
|       label: Relevant log output | ||||
|       description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. | ||||
|       render: shell | ||||
|     validations: | ||||
|       required: true | ||||
|   - type: textarea | ||||
|     attributes: | ||||
|       label: Screenshots or videos | ||||
|       description: Add screenshots or videos that show the bug here. | ||||
|       placeholder: Drag and drop the screenshots/videos into this box. | ||||
|     validations: | ||||
|       required: false | ||||
|   - type: textarea | ||||
|     attributes: | ||||
|       label: Solution | ||||
|       description: If applicable, add a possible solution. | ||||
|     validations: | ||||
|       required: false | ||||
|   - type: textarea | ||||
|     attributes: | ||||
|       label: Additional context | ||||
|       description: Add additional context here. | ||||
|     validations: | ||||
|       required: false | ||||
|   - type: checkboxes | ||||
|     id: acknowledgements | ||||
|     attributes: | ||||
|       label: Acknowledgements | ||||
|       description: Your issue will be closed if you haven't done these steps. | ||||
|       options: | ||||
|         - label: I have searched the existing issues and this is a new and no duplicate or related to another open issue. | ||||
|           required: true | ||||
|         - label: I have written a short but informative title. | ||||
|           required: true | ||||
|         - label: I filled out all of the requested information in this issue properly. | ||||
|           required: true | ||||
							
								
								
									
										109
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,109 @@ | ||||
| name: 🐞 Bug report | ||||
| description: Report a bug or an issue. | ||||
| title: "bug: " | ||||
| labels: ["Bug report"] | ||||
| body: | ||||
|   - type: markdown | ||||
|     attributes: | ||||
|       value: | | ||||
|         <p align="center"> | ||||
|           <picture> | ||||
|             <source | ||||
|               width="256px" | ||||
|               media="(prefers-color-scheme: dark)" | ||||
|               srcset="https://raw.githubusercontent.com/revanced/revanced-patcher/main/assets/revanced-headline/revanced-headline-vertical-dark.svg" | ||||
|             > | ||||
|             <img  | ||||
|               width="256px" | ||||
|               src="https://raw.githubusercontent.com/revanced/revanced-patcher/main/assets/revanced-headline/revanced-headline-vertical-light.svg" | ||||
|             > | ||||
|           </picture> | ||||
|           <br> | ||||
|           <a href="https://revanced.app/"> | ||||
|              <picture> | ||||
|                  <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/revanced/revanced-patcher/main/assets/revanced-logo/revanced-logo.svg" /> | ||||
|                  <img height="24px" src="https://raw.githubusercontent.com/revanced/revanced-patcher/main/assets/revanced-logo/revanced-logo.svg" /> | ||||
|              </picture> | ||||
|            </a>    | ||||
|            <a href="https://github.com/ReVanced"> | ||||
|                <picture> | ||||
|                    <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://i.ibb.co/dMMmCrW/Git-Hub-Mark.png" /> | ||||
|                    <img height="24px" src="https://i.ibb.co/9wV3HGF/Git-Hub-Mark-Light.png" /> | ||||
|                </picture> | ||||
|            </a>    | ||||
|            <a href="http://revanced.app/discord"> | ||||
|                <picture> | ||||
|                    <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" /> | ||||
|                    <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" /> | ||||
|                </picture> | ||||
|            </a>    | ||||
|            <a href="https://reddit.com/r/revancedapp"> | ||||
|                <picture> | ||||
|                    <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" /> | ||||
|                    <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" /> | ||||
|                </picture> | ||||
|            </a>    | ||||
|            <a href="https://t.me/app_revanced"> | ||||
|               <picture> | ||||
|                  <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" /> | ||||
|                  <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" /> | ||||
|               </picture> | ||||
|            </a>    | ||||
|            <a href="https://x.com/revancedapp"> | ||||
|               <picture> | ||||
|                  <source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/93124920/270180600-7c1b38bf-889b-4d68-bd5e-b9d86f91421a.png"> | ||||
|                  <img height="24px" src="https://user-images.githubusercontent.com/93124920/270108715-d80743fa-b330-4809-b1e6-79fbdc60d09c.png" /> | ||||
|               </picture> | ||||
|            </a>    | ||||
|            <a href="https://www.youtube.com/@ReVanced"> | ||||
|               <picture> | ||||
|                  <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" /> | ||||
|                  <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" /> | ||||
|              </picture> | ||||
|            </a> | ||||
|            <br> | ||||
|            <br> | ||||
|            Continuing the legacy of Vanced | ||||
|         </p> | ||||
|  | ||||
|         # ReVanced Patcher bug report | ||||
|  | ||||
|         Before creating a new bug report, please keep the following in mind: | ||||
|  | ||||
|         - **Do not submit a duplicate bug report**: Search for existing bug reports [here](https://github.com/ReVanced/revanced-patcher/issues?q=label%3A%22Bug+report%22). | ||||
|         - **Review the contribution guidelines**: Make sure your bug report adheres to it. You can find the guidelines [here](https://github.com/ReVanced/revanced-patcher/blob/main/CONTRIBUTING.md). | ||||
|         - **Do not use the issue page for support**: If you need help or have questions, check out other platforms on [revanced.app](https://revanced.app). | ||||
|   - type: textarea | ||||
|     attributes: | ||||
|       label: Bug description | ||||
|       description: | | ||||
|         - Describe your bug in detail | ||||
|         - Add steps to reproduce the bug if possible (Step 1. ... Step 2. ...) | ||||
|         - Add images and videos if possible | ||||
|     validations: | ||||
|       required: true | ||||
|   - type: textarea | ||||
|     attributes: | ||||
|       label: Error logs | ||||
|       description: Exceptions can be captured by running `logcat | grep AndroidRuntime` in a shell. | ||||
|       render: shell | ||||
|   - type: textarea | ||||
|     attributes: | ||||
|       label: Solution | ||||
|       description: If applicable, add a possible solution to the bug. | ||||
|   - type: textarea | ||||
|     attributes: | ||||
|       label: Additional context | ||||
|       description: Add additional context here. | ||||
|   - type: checkboxes | ||||
|     id: acknowledgements | ||||
|     attributes: | ||||
|       label: Acknowledgements | ||||
|       description: Your bug report will be closed if you don't follow the checklist below. | ||||
|       options: | ||||
|         - label: I have checked all open and closed bug reports and this is not a duplicate. | ||||
|           required: true | ||||
|         - label: I have chosen an appropriate title. | ||||
|           required: true | ||||
|         - label: All requested information has been provided properly. | ||||
|           required: true | ||||
							
								
								
									
										58
									
								
								.github/ISSUE_TEMPLATE/feature-issue.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										58
									
								
								.github/ISSUE_TEMPLATE/feature-issue.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,58 +0,0 @@ | ||||
| name: ⭐ Feature request | ||||
| description: Create a detailed feature request. | ||||
| title: 'feat: <title>' | ||||
| labels: [feature-request] | ||||
| body: | ||||
|   - type: markdown | ||||
|     attributes: | ||||
|       value: | | ||||
|         # ReVanced feature request | ||||
|          | ||||
|         Do not submit requests for patches here. Please submit them [here](https://github.com/orgs/revanced/discussions/categories/patches) instead. | ||||
|         Important to note that your feature request may have already been made before. Please check for existing feature requests [here](https://github.com/revanced/revanced-patcher/labels/feature-request). | ||||
|  | ||||
|   - type: dropdown | ||||
|     attributes: | ||||
|       label: Type | ||||
|       options: | ||||
|         - Functionality | ||||
|         - Cosmetic | ||||
|         - Other | ||||
|     validations: | ||||
|       required: true | ||||
|   - type: textarea | ||||
|     attributes: | ||||
|       label: Issue | ||||
|       description: What is the current problem. Why does it require a feature request? | ||||
|     validations: | ||||
|       required: true | ||||
|   - type: textarea | ||||
|     attributes: | ||||
|       label: Feature | ||||
|       description: Describe your feature in detail. How does it solve the issue? | ||||
|     validations: | ||||
|       required: true | ||||
|   - type: textarea | ||||
|     attributes: | ||||
|       label: Motivation | ||||
|       description: Why should your feature should be considered? | ||||
|     validations: | ||||
|       required: true | ||||
|   - type: textarea | ||||
|     attributes: | ||||
|       label: Additional context | ||||
|       description: Add additional context here. | ||||
|     validations: | ||||
|       required: false | ||||
|   - type: checkboxes | ||||
|     id: acknowledgements | ||||
|     attributes: | ||||
|       label: Acknowledgements | ||||
|       description: Your issue will be closed if you haven't done these steps. | ||||
|       options: | ||||
|         - label: I have searched the existing issues and this is a new and no duplicate or related to another open issue. | ||||
|           required: true | ||||
|         - label: I have written a short but informative title. | ||||
|           required: true | ||||
|         - label: I filled out all of the requested information in this issue properly. | ||||
|           required: true | ||||
							
								
								
									
										107
									
								
								.github/ISSUE_TEMPLATE/feature_request.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								.github/ISSUE_TEMPLATE/feature_request.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,107 @@ | ||||
| name: ⭐ Feature request | ||||
| description: Create a detailed request for a new feature. | ||||
| title: "feat: " | ||||
| labels: ["Feature request"] | ||||
| body: | ||||
|   - type: markdown | ||||
|     attributes: | ||||
|       value: | | ||||
|         <p align="center"> | ||||
|           <picture> | ||||
|             <source | ||||
|               width="256px" | ||||
|               media="(prefers-color-scheme: dark)" | ||||
|               srcset="https://raw.githubusercontent.com/revanced/revanced-patcher/main/assets/revanced-headline/revanced-headline-vertical-dark.svg" | ||||
|             > | ||||
|             <img  | ||||
|               width="256px" | ||||
|               src="https://raw.githubusercontent.com/revanced/revanced-patcher/main/assets/revanced-headline/revanced-headline-vertical-light.svg" | ||||
|             > | ||||
|           </picture> | ||||
|           <br> | ||||
|           <a href="https://revanced.app/"> | ||||
|              <picture> | ||||
|                  <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/revanced/revanced-patcher/main/assets/revanced-logo/revanced-logo.svg" /> | ||||
|                  <img height="24px" src="https://raw.githubusercontent.com/revanced/revanced-patcher/main/assets/revanced-logo/revanced-logo.svg" /> | ||||
|              </picture> | ||||
|            </a>    | ||||
|            <a href="https://github.com/ReVanced"> | ||||
|                <picture> | ||||
|                    <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://i.ibb.co/dMMmCrW/Git-Hub-Mark.png" /> | ||||
|                    <img height="24px" src="https://i.ibb.co/9wV3HGF/Git-Hub-Mark-Light.png" /> | ||||
|                </picture> | ||||
|            </a>    | ||||
|            <a href="http://revanced.app/discord"> | ||||
|                <picture> | ||||
|                    <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" /> | ||||
|                    <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" /> | ||||
|                </picture> | ||||
|            </a>    | ||||
|            <a href="https://reddit.com/r/revancedapp"> | ||||
|                <picture> | ||||
|                    <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" /> | ||||
|                    <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" /> | ||||
|                </picture> | ||||
|            </a>    | ||||
|            <a href="https://t.me/app_revanced"> | ||||
|               <picture> | ||||
|                  <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" /> | ||||
|                  <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" /> | ||||
|               </picture> | ||||
|            </a>    | ||||
|            <a href="https://x.com/revancedapp"> | ||||
|               <picture> | ||||
|                  <source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/93124920/270180600-7c1b38bf-889b-4d68-bd5e-b9d86f91421a.png"> | ||||
|                  <img height="24px" src="https://user-images.githubusercontent.com/93124920/270108715-d80743fa-b330-4809-b1e6-79fbdc60d09c.png" /> | ||||
|               </picture> | ||||
|            </a>    | ||||
|            <a href="https://www.youtube.com/@ReVanced"> | ||||
|               <picture> | ||||
|                  <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" /> | ||||
|                  <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" /> | ||||
|              </picture> | ||||
|            </a> | ||||
|            <br> | ||||
|            <br> | ||||
|            Continuing the legacy of Vanced | ||||
|         </p> | ||||
|  | ||||
|         # ReVanced Patcher feature request | ||||
|  | ||||
|         Before creating a new feature request, please keep the following in mind: | ||||
|  | ||||
|         - **Do not submit a duplicate feature request**: Search for existing feature requests [here](https://github.com/ReVanced/revanced-patcher/issues?q=label%3A%22Feature+request%22). | ||||
|         - **Review the contribution guidelines**: Make sure your feature request adheres to it. You can find the guidelines [here](https://github.com/ReVanced/revanced-patcher/blob/main/CONTRIBUTING.md). | ||||
|         - **Do not use the issue page for support**: If you need help or have questions, check out other platforms on [revanced.app](https://revanced.app). | ||||
|  | ||||
|   - type: textarea | ||||
|     attributes: | ||||
|       label: Feature description | ||||
|       description: | | ||||
|         - Describe your feature in detail | ||||
|         - Add images, videos, links, examples, references, etc. if possible | ||||
|         - Add the target application name in case you request a new patch | ||||
|   - type: textarea | ||||
|     attributes: | ||||
|       label: Motivation | ||||
|       description: | | ||||
|         A strong motivation is necessary for a feature request to be considered. | ||||
|  | ||||
|         - Why should this feature be implemented?  | ||||
|         - What is the explicit use case? | ||||
|         - What are the benefits? | ||||
|         - What makes this feature important? | ||||
|     validations: | ||||
|       required: true | ||||
|   - type: checkboxes | ||||
|     id: acknowledgements | ||||
|     attributes: | ||||
|       label: Acknowledgements | ||||
|       description: Your feature request will be closed if you don't follow the checklist below. | ||||
|       options: | ||||
|         - label: I have checked all open and closed feature requests and this is not a duplicate. | ||||
|           required: true | ||||
|         - label: I have chosen an appropriate title. | ||||
|           required: true | ||||
|         - label: All requested information has been provided properly. | ||||
|           required: true | ||||
							
								
								
									
										2
									
								
								.github/config.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/config.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,2 +1,2 @@ | ||||
| firstPRMergeComment: > | ||||
|   Thank you for contributing to ReVanced. Join us on [Discord](https://revanced.app/discord) if you want to receive a contributor role. | ||||
|   Thank you for contributing to ReVanced. Join us on [Discord](https://revanced.app/discord) to receive a role for your contribution. | ||||
|   | ||||
							
								
								
									
										22
									
								
								.github/dependabot.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								.github/dependabot.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| version: 2 | ||||
| updates: | ||||
|   - package-ecosystem: github-actions | ||||
|     labels: [] | ||||
|     directory: / | ||||
|     target-branch: dev | ||||
|     schedule: | ||||
|       interval: monthly | ||||
|  | ||||
|   - package-ecosystem: npm | ||||
|     labels: [] | ||||
|     directory: / | ||||
|     target-branch: dev | ||||
|     schedule: | ||||
|       interval: monthly | ||||
|  | ||||
|   - package-ecosystem: gradle | ||||
|     labels: [] | ||||
|     directory: / | ||||
|     target-branch: dev | ||||
|     schedule: | ||||
|       interval: monthly | ||||
							
								
								
									
										25
									
								
								.github/workflows/build_pull_request.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								.github/workflows/build_pull_request.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| name: Build pull request | ||||
|  | ||||
| on: | ||||
|   workflow_dispatch: | ||||
|   pull_request: | ||||
|     branches: | ||||
|       - dev | ||||
|  | ||||
| jobs: | ||||
|   release: | ||||
|     name: Build | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v4 | ||||
|         with: | ||||
|           fetch-depth: 0 | ||||
|  | ||||
|       - name: Cache Gradle | ||||
|         uses: burrunan/gradle-cache-action@v1 | ||||
|  | ||||
|       - name: Build | ||||
|         env: | ||||
|           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||
|         run: ./gradlew build --no-daemon | ||||
| @@ -1,4 +1,4 @@ | ||||
| name: PR to main | ||||
| name: Open a PR to main | ||||
|  | ||||
| on: | ||||
|   push: | ||||
| @@ -7,7 +7,7 @@ on: | ||||
|   workflow_dispatch: | ||||
|  | ||||
| env: | ||||
|   MESSAGE: merge branch `${{ github.head_ref || github.ref_name }}` to `main` | ||||
|   MESSAGE: Merge branch `${{ github.head_ref || github.ref_name }}` to `main` | ||||
|  | ||||
| jobs: | ||||
|   pull-request: | ||||
| @@ -15,7 +15,8 @@ jobs: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v3 | ||||
|         uses: actions/checkout@v4 | ||||
|  | ||||
|       - name: Open pull request | ||||
|         uses: repo-sync/pull-request@v2 | ||||
|         with: | ||||
							
								
								
									
										46
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										46
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							| @@ -6,40 +6,48 @@ on: | ||||
|     branches: | ||||
|       - main | ||||
|       - dev | ||||
|   pull_request: | ||||
|     branches: | ||||
|       - main | ||||
|       - dev | ||||
|  | ||||
| jobs: | ||||
|   release: | ||||
|     name: Release | ||||
|     permissions: | ||||
|       contents: write | ||||
|       packages: write | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v3 | ||||
|         uses: actions/checkout@v4 | ||||
|         with: | ||||
|           # Make sure the release step uses its own credentials: | ||||
|           # https://github.com/cycjimmy/semantic-release-action#private-packages | ||||
|           persist-credentials: false | ||||
|           fetch-depth: 0 | ||||
|       - name: Cache | ||||
|         uses: actions/cache@v3 | ||||
|         with: | ||||
|           path: | | ||||
|             ${{ runner.home }}/.gradle/caches | ||||
|             ${{ runner.home }}/.gradle/wrapper | ||||
|             .gradle | ||||
|             build | ||||
|             node_modules | ||||
|           key: ${{ runner.os }}-gradle-npm-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', 'package-lock.json') }} | ||||
|       - name: Build with Gradle | ||||
|  | ||||
|       - name: Cache Gradle | ||||
|         uses: burrunan/gradle-cache-action@v1 | ||||
|  | ||||
|       - name: Build | ||||
|         env: | ||||
|           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||
|         run: ./gradlew build clean --no-daemon | ||||
|       - name: Setup semantic-release | ||||
|         run: ./gradlew build clean | ||||
|  | ||||
|       - name: Setup Node.js | ||||
|         uses: actions/setup-node@v4 | ||||
|         with: | ||||
|           node-version: "lts/*" | ||||
|           cache: 'npm' | ||||
|  | ||||
|       - name: Install dependencies | ||||
|         run: npm install | ||||
|  | ||||
|       - name: Import GPG key | ||||
|         uses: crazy-max/ghaction-import-gpg@v6 | ||||
|         with: | ||||
|           gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }} | ||||
|           passphrase: ${{ secrets.GPG_PASSPHRASE }} | ||||
|           fingerprint: ${{ vars.GPG_FINGERPRINT }} | ||||
|  | ||||
|       - name: Release | ||||
|         env: | ||||
|           GITHUB_TOKEN: ${{ secrets.REPOSITORY_PUSH_ACCESS }} | ||||
|           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||
|         run: npm exec semantic-release | ||||
|   | ||||
							
								
								
									
										19
									
								
								.github/workflows/update_documentation.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								.github/workflows/update_documentation.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| name: Update documentation | ||||
|  | ||||
| on: | ||||
|   push: | ||||
|     paths: | ||||
|       - docs/** | ||||
|  | ||||
| jobs: | ||||
|   trigger: | ||||
|     runs-on: ubuntu-latest | ||||
|     name: Dispatch event to documentation repository | ||||
|     if: github.ref == 'refs/heads/main' | ||||
|     steps: | ||||
|       - uses: peter-evans/repository-dispatch@v3 | ||||
|         with: | ||||
|           token: ${{ secrets.DOCUMENTATION_REPO_ACCESS_TOKEN  }} | ||||
|           repository: revanced/revanced-documentation | ||||
|           event-type: update-documentation | ||||
|           client-payload: '{"repo": "${{ github.event.repository.name }}", "ref": "${{ github.ref }}"}' | ||||
| @@ -23,7 +23,8 @@ | ||||
|         "assets": [ | ||||
|           "CHANGELOG.md", | ||||
|           "gradle.properties" | ||||
|         ] | ||||
|         ], | ||||
|         "message": "chore: Release v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}" | ||||
|       } | ||||
|     ], | ||||
|     [ | ||||
|   | ||||
							
								
								
									
										577
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										577
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										99
									
								
								CONTRIBUTING.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								CONTRIBUTING.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,99 @@ | ||||
| <p align="center"> | ||||
|   <picture> | ||||
|     <source | ||||
|       width="256px" | ||||
|       media="(prefers-color-scheme: dark)" | ||||
|       srcset="assets/revanced-headline/revanced-headline-vertical-dark.svg" | ||||
|     > | ||||
|     <img  | ||||
|       width="256px" | ||||
|       src="assets/revanced-headline/revanced-headline-vertical-light.svg" | ||||
|     > | ||||
|   </picture> | ||||
|   <br> | ||||
|   <a href="https://revanced.app/"> | ||||
|      <picture> | ||||
|          <source height="24px" media="(prefers-color-scheme: dark)" srcset="assets/revanced-logo/revanced-logo.svg" /> | ||||
|          <img height="24px" src="assets/revanced-logo/revanced-logo.svg" /> | ||||
|      </picture> | ||||
|    </a>    | ||||
|    <a href="https://github.com/ReVanced"> | ||||
|        <picture> | ||||
|            <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://i.ibb.co/dMMmCrW/Git-Hub-Mark.png" /> | ||||
|            <img height="24px" src="https://i.ibb.co/9wV3HGF/Git-Hub-Mark-Light.png" /> | ||||
|        </picture> | ||||
|    </a>    | ||||
|    <a href="http://revanced.app/discord"> | ||||
|        <picture> | ||||
|            <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" /> | ||||
|            <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" /> | ||||
|        </picture> | ||||
|    </a>    | ||||
|    <a href="https://reddit.com/r/revancedapp"> | ||||
|        <picture> | ||||
|            <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" /> | ||||
|            <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" /> | ||||
|        </picture> | ||||
|    </a>    | ||||
|    <a href="https://t.me/app_revanced"> | ||||
|       <picture> | ||||
|          <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" /> | ||||
|          <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" /> | ||||
|       </picture> | ||||
|    </a>    | ||||
|    <a href="https://x.com/revancedapp"> | ||||
|       <picture> | ||||
|          <source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/93124920/270180600-7c1b38bf-889b-4d68-bd5e-b9d86f91421a.png"> | ||||
|          <img height="24px" src="https://user-images.githubusercontent.com/93124920/270108715-d80743fa-b330-4809-b1e6-79fbdc60d09c.png" /> | ||||
|       </picture> | ||||
|    </a>    | ||||
|    <a href="https://www.youtube.com/@ReVanced"> | ||||
|       <picture> | ||||
|          <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" /> | ||||
|          <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" /> | ||||
|      </picture> | ||||
|    </a> | ||||
|    <br> | ||||
|    <br> | ||||
|    Continuing the legacy of Vanced | ||||
| </p> | ||||
|  | ||||
| # 👋 Contribution guidelines | ||||
|  | ||||
| This document describes how to contribute to ReVanced Patcher. | ||||
|  | ||||
| ## 📖 Resources to help you get started | ||||
|  | ||||
| - The [documentation](https://github.com/ReVanced/revanced-patcher/tree/docs/docs) contains the fundamentals | ||||
|   of ReVanced Patcher and how to use ReVanced Patcher to create patches | ||||
| - [Our backlog](https://github.com/orgs/ReVanced/projects/12) is where we keep track of what we're working on | ||||
| - [Issues](https://github.com/ReVanced/revanced-patcher/issues) are where we keep track of bugs and feature requests | ||||
|  | ||||
| ## 🙏 Submitting a feature request | ||||
|  | ||||
| Features can be requested by opening an issue using the | ||||
| [Feature request issue template](https://github.com/ReVanced/revanced-patcher/issues/new?assignees=&labels=Feature+request&projects=&template=feature_request.yml&title=feat%3A+). | ||||
|  | ||||
| > **Note** | ||||
| > Requests can be accepted or rejected at the discretion of maintainers of ReVanced Patcher. | ||||
| > Good motivation has to be provided for a request to be accepted. | ||||
|  | ||||
| ## 🐞 Submitting a bug report | ||||
|  | ||||
| If you encounter a bug while using ReVanced Patcher, open an issue using the | ||||
| [Bug report issue template](https://github.com/ReVanced/revanced-patcher/issues/new?assignees=&labels=Bug+report&projects=&template=bug_report.yml&title=bug%3A+). | ||||
|  | ||||
| ## 📝 How to contribute | ||||
|  | ||||
| 1. Before contributing, it is recommended to open an issue to discuss your change | ||||
|    with the maintainers of ReVanced Patcher. This will help you determine whether your change is acceptable | ||||
|    and whether it is worth your time to implement it | ||||
| 2. Development happens on the `dev` branch. Fork the repository and create your branch from `dev` | ||||
| 3. Commit your changes | ||||
| 4. Submit a pull request to the `dev` branch of the repository and reference issues | ||||
|    that your pull request closes in the description of your pull request | ||||
| 5. Our team will review your pull request and provide feedback. Once your pull request is approved, | ||||
|    it will be merged into the `dev` branch and will be included in the next release of ReVanced Patcher | ||||
|  | ||||
| ❤️ Thank you for considering contributing to ReVanced Patcher,   | ||||
| ReVanced | ||||
							
								
								
									
										122
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										122
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,3 +1,125 @@ | ||||
| <p align="center"> | ||||
|   <picture> | ||||
|     <source | ||||
|       width="256px" | ||||
|       media="(prefers-color-scheme: dark)" | ||||
|       srcset="assets/revanced-headline/revanced-headline-vertical-dark.svg" | ||||
|     > | ||||
|     <img  | ||||
|       width="256px" | ||||
|       src="assets/revanced-headline/revanced-headline-vertical-light.svg" | ||||
|     > | ||||
|   </picture> | ||||
|   <br> | ||||
|   <a href="https://revanced.app/"> | ||||
|      <picture> | ||||
|          <source height="24px" media="(prefers-color-scheme: dark)" srcset="assets/revanced-logo/revanced-logo.svg" /> | ||||
|          <img height="24px" src="assets/revanced-logo/revanced-logo.svg" /> | ||||
|      </picture> | ||||
|    </a>    | ||||
|    <a href="https://github.com/ReVanced"> | ||||
|        <picture> | ||||
|            <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://i.ibb.co/dMMmCrW/Git-Hub-Mark.png" /> | ||||
|            <img height="24px" src="https://i.ibb.co/9wV3HGF/Git-Hub-Mark-Light.png" /> | ||||
|        </picture> | ||||
|    </a>    | ||||
|    <a href="http://revanced.app/discord"> | ||||
|        <picture> | ||||
|            <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" /> | ||||
|            <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" /> | ||||
|        </picture> | ||||
|    </a>    | ||||
|    <a href="https://reddit.com/r/revancedapp"> | ||||
|        <picture> | ||||
|            <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" /> | ||||
|            <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" /> | ||||
|        </picture> | ||||
|    </a>    | ||||
|    <a href="https://t.me/app_revanced"> | ||||
|       <picture> | ||||
|          <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" /> | ||||
|          <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" /> | ||||
|       </picture> | ||||
|    </a>    | ||||
|    <a href="https://x.com/revancedapp"> | ||||
|       <picture> | ||||
|          <source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/93124920/270180600-7c1b38bf-889b-4d68-bd5e-b9d86f91421a.png"> | ||||
|          <img height="24px" src="https://user-images.githubusercontent.com/93124920/270108715-d80743fa-b330-4809-b1e6-79fbdc60d09c.png" /> | ||||
|       </picture> | ||||
|    </a>    | ||||
|    <a href="https://www.youtube.com/@ReVanced"> | ||||
|       <picture> | ||||
|          <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" /> | ||||
|          <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" /> | ||||
|      </picture> | ||||
|    </a> | ||||
|    <br> | ||||
|    <br> | ||||
|    Continuing the legacy of Vanced | ||||
| </p> | ||||
|  | ||||
| # 💉 ReVanced Patcher | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ReVanced Patcher used to patch Android applications. | ||||
|  | ||||
| ## ❓ About | ||||
|  | ||||
| ReVanced Patcher is a library that is used to patch Android applications.   | ||||
| It powers [ReVanced Manager](https://github.com/ReVanced/revanced-manager), | ||||
| [ReVanced CLI](https://github.com/ReVanced/revanced-cli) | ||||
| and [ReVanced Library](https://github.com/ReVanced/revanced-library) and a rich set of patches have been developed | ||||
| using ReVanced Patcher in the [ReVanced Patches](https://github.com/ReVanced/revanced-patches) repository. | ||||
|  | ||||
| ## 💪 Features | ||||
|  | ||||
| Some of the features the ReVanced Patcher provides are: | ||||
|  | ||||
| - 🔧 **Patch Dalvik VM bytecode**: Disassemble and assemble Dalvik bytecode | ||||
| - 📦 **Patch APK resources**: Decode and build Android APK resources | ||||
| - 📂 **Patch arbitrary APK files**: Read and write arbitrary files directly from and to APK files | ||||
| - 🧩 **Write modular patches**: Extensive API to write modular patches that can patch Dalvik VM bytecode, | ||||
| APK resources and arbitrary APK files | ||||
|  | ||||
| ## 🚀 How to get started | ||||
|  | ||||
| To use ReVanced Patcher in your project, follow these steps: | ||||
|  | ||||
| 1. [Add the repository](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-gradle-registry#using-a-published-package) | ||||
| to your project | ||||
| 2. Add the dependency to your project: | ||||
|  | ||||
|    ```kt | ||||
|     dependencies { | ||||
|         implementation("app.revanced:revanced-patcher:{$version}") | ||||
|     } | ||||
|    ``` | ||||
|  | ||||
| For a minimal project configuration,  | ||||
| see [ReVanced Patches template](https://github.com/ReVanced/revanced-patches-template). | ||||
|  | ||||
| ## 📚 Everything else | ||||
|  | ||||
| ### 📙 Contributing | ||||
|  | ||||
| Thank you for considering contributing to ReVanced Patcher. | ||||
| You can find the contribution guidelines [here](CONTRIBUTING.md). | ||||
|  | ||||
| ### 🛠️ Building | ||||
|  | ||||
| To build ReVanced Patcher, | ||||
| you can follow the [ReVanced documentation](https://github.com/ReVanced/revanced-documentation). | ||||
|  | ||||
| ### 📃 Documentation | ||||
|  | ||||
| The documentation contains the fundamentals of ReVanced Patcher and how to use ReVanced Patcher to create patches. | ||||
| You can find it [here](https://github.com/ReVanced/revanced-patcher/tree/main/docs). | ||||
|  | ||||
| ## 📜 Licence | ||||
|  | ||||
| ReVanced Patcher is licensed under the GPLv3 license. Please see the [licence file](LICENSE) for more information. | ||||
| [tl;dr](https://www.tldrlegal.com/license/gnu-general-public-license-v3-gpl-3) you may copy, distribute and modify ReVanced Patcher as long as you track changes/dates in source files. | ||||
| Any modifications to ReVanced Patcher must also be made available under the GPL, | ||||
| along with build & install instructions. | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| After Width: | Height: | Size: 11 KiB | 
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| After Width: | Height: | Size: 11 KiB | 
							
								
								
									
										1
									
								
								assets/revanced-logo/revanced-logo.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								assets/revanced-logo/revanced-logo.svg
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| After Width: | Height: | Size: 2.8 KiB | 
							
								
								
									
										115
									
								
								build.gradle.kts
									
									
									
									
									
								
							
							
						
						
									
										115
									
								
								build.gradle.kts
									
									
									
									
									
								
							| @@ -1,4 +1,117 @@ | ||||
| import org.jetbrains.kotlin.gradle.dsl.JvmTarget | ||||
|  | ||||
| plugins { | ||||
|     kotlin("jvm") version "1.9.0" apply false | ||||
|     alias(libs.plugins.kotlin) | ||||
|     alias(libs.plugins.binary.compatibility.validator) | ||||
|     `maven-publish` | ||||
|     signing | ||||
| } | ||||
|  | ||||
| group = "app.revanced" | ||||
|  | ||||
| tasks { | ||||
|     processResources { | ||||
|         expand("projectVersion" to project.version) | ||||
|     } | ||||
|  | ||||
|     test { | ||||
|         useJUnitPlatform() | ||||
|         testLogging { | ||||
|             events("PASSED", "SKIPPED", "FAILED") | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| repositories { | ||||
|     mavenCentral() | ||||
|     google() | ||||
|     maven { | ||||
|         // A repository must be specified for some reason. "registry" is a dummy. | ||||
|         url = uri("https://maven.pkg.github.com/revanced/registry") | ||||
|         credentials { | ||||
|             username = project.findProperty("gpr.user") as String? ?: System.getenv("GITHUB_ACTOR") | ||||
|             password = project.findProperty("gpr.key") as String? ?: System.getenv("GITHUB_TOKEN") | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| dependencies { | ||||
|     // TODO: Convert project to KMP. | ||||
|     compileOnly(libs.android) { | ||||
|         // Exclude, otherwise the org.w3c.dom API breaks. | ||||
|         exclude(group = "xerces", module = "xmlParserAPIs") | ||||
|     } | ||||
|  | ||||
|     implementation(libs.apktool.lib) | ||||
|     implementation(libs.kotlin.reflect) | ||||
|     implementation(libs.kotlinx.coroutines.core) | ||||
|     implementation(libs.multidexlib2) | ||||
|     implementation(libs.smali) | ||||
|     implementation(libs.xpp3) | ||||
|  | ||||
|     testImplementation(libs.mockk) | ||||
|     testImplementation(libs.kotlin.test) | ||||
| } | ||||
|  | ||||
| kotlin { | ||||
|     compilerOptions { | ||||
|         jvmTarget.set(JvmTarget.JVM_11) | ||||
|     } | ||||
| } | ||||
|  | ||||
| java { | ||||
|     targetCompatibility = JavaVersion.VERSION_11 | ||||
|  | ||||
|     withSourcesJar() | ||||
| } | ||||
|  | ||||
| publishing { | ||||
|     repositories { | ||||
|         maven { | ||||
|             name = "GitHubPackages" | ||||
|             url = uri("https://maven.pkg.github.com/revanced/revanced-patcher") | ||||
|             credentials { | ||||
|                 username = System.getenv("GITHUB_ACTOR") | ||||
|                 password = System.getenv("GITHUB_TOKEN") | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     publications { | ||||
|         create<MavenPublication>("revanced-patcher-publication") { | ||||
|             from(components["java"]) | ||||
|  | ||||
|             version = project.version.toString() | ||||
|  | ||||
|             pom { | ||||
|                 name = "ReVanced Patcher" | ||||
|                 description = "Patcher used by ReVanced." | ||||
|                 url = "https://revanced.app" | ||||
|  | ||||
|                 licenses { | ||||
|                     license { | ||||
|                         name = "GNU General Public License v3.0" | ||||
|                         url = "https://www.gnu.org/licenses/gpl-3.0.en.html" | ||||
|                     } | ||||
|                 } | ||||
|                 developers { | ||||
|                     developer { | ||||
|                         id = "ReVanced" | ||||
|                         name = "ReVanced" | ||||
|                         email = "contact@revanced.app" | ||||
|                     } | ||||
|                 } | ||||
|                 scm { | ||||
|                     connection = "scm:git:git://github.com/revanced/revanced-patcher.git" | ||||
|                     developerConnection = "scm:git:git@github.com:revanced/revanced-patcher.git" | ||||
|                     url = "https://github.com/revanced/revanced-patcher" | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| signing { | ||||
|     useGpgCmd() | ||||
|     sign(publishing.publications["revanced-patcher-publication"]) | ||||
| } | ||||
|   | ||||
							
								
								
									
										111
									
								
								docs/1_patcher_intro.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								docs/1_patcher_intro.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,111 @@ | ||||
| <p align="center"> | ||||
|   <picture> | ||||
|     <source | ||||
|       width="256px" | ||||
|       media="(prefers-color-scheme: dark)" | ||||
|       srcset="../assets/revanced-headline/revanced-headline-vertical-dark.svg" | ||||
|     > | ||||
|     <img  | ||||
|       width="256px" | ||||
|       src="../assets/revanced-headline/revanced-headline-vertical-light.svg" | ||||
|     > | ||||
|   </picture> | ||||
|   <br> | ||||
|   <a href="https://revanced.app/"> | ||||
|      <picture> | ||||
|          <source height="24px" media="(prefers-color-scheme: dark)" srcset="../assets/revanced-logo/revanced-logo.svg" /> | ||||
|          <img height="24px" src="../assets/revanced-logo/revanced-logo.svg" /> | ||||
|      </picture> | ||||
|    </a>    | ||||
|    <a href="https://github.com/ReVanced"> | ||||
|        <picture> | ||||
|            <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://i.ibb.co/dMMmCrW/Git-Hub-Mark.png" /> | ||||
|            <img height="24px" src="https://i.ibb.co/9wV3HGF/Git-Hub-Mark-Light.png" /> | ||||
|        </picture> | ||||
|    </a>    | ||||
|    <a href="http://revanced.app/discord"> | ||||
|        <picture> | ||||
|            <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" /> | ||||
|            <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" /> | ||||
|        </picture> | ||||
|    </a>    | ||||
|    <a href="https://reddit.com/r/revancedapp"> | ||||
|        <picture> | ||||
|            <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" /> | ||||
|            <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" /> | ||||
|        </picture> | ||||
|    </a>    | ||||
|    <a href="https://t.me/app_revanced"> | ||||
|       <picture> | ||||
|          <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" /> | ||||
|          <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" /> | ||||
|       </picture> | ||||
|    </a>    | ||||
|    <a href="https://x.com/revancedapp"> | ||||
|       <picture> | ||||
|          <source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/93124920/270180600-7c1b38bf-889b-4d68-bd5e-b9d86f91421a.png"> | ||||
|          <img height="24px" src="https://user-images.githubusercontent.com/93124920/270108715-d80743fa-b330-4809-b1e6-79fbdc60d09c.png" /> | ||||
|       </picture> | ||||
|    </a>    | ||||
|    <a href="https://www.youtube.com/@ReVanced"> | ||||
|       <picture> | ||||
|          <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" /> | ||||
|          <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" /> | ||||
|      </picture> | ||||
|    </a> | ||||
|    <br> | ||||
|    <br> | ||||
|    Continuing the legacy of Vanced | ||||
| </p> | ||||
|  | ||||
| # 💉 Introduction to ReVanced Patcher | ||||
|  | ||||
| To create patches for Android apps, it is recommended to know the basic concept of ReVanced Patcher. | ||||
|  | ||||
| ## 📙 How it works | ||||
|  | ||||
| ReVanced Patcher is a library that allows modifying Android apps by applying patches. | ||||
| It is built on top of [Smali](https://github.com/google/smali) for bytecode manipulation and [Androlib (Apktool)](https://github.com/iBotPeaches/Apktool) | ||||
| for resource decoding and encoding. | ||||
|  | ||||
| ReVanced Patcher receives a list of patches and applies them to a given APK file. | ||||
| It then returns the modified components of the APK file, such as modified dex files and resources, | ||||
| that can be repackaged into a new APK file. | ||||
|  | ||||
| ReVanced Patcher has a simple API that allows you to load patches from RVP (JAR or DEX container) files | ||||
| and apply them to an APK file. Later on, you will learn how to create patches. | ||||
|  | ||||
| ```kt | ||||
| val patches = loadPatchesFromJar(setOf(File("revanced-patches.rvp"))) | ||||
|  | ||||
| val patcherResult = Patcher(PatcherConfig(apkFile = File("some.apk"))).use { patcher -> | ||||
|     // Here you can access metadata about the APK file through patcher.context.packageMetadata | ||||
|     // such as package name, version code, version name, etc. | ||||
|  | ||||
|     // Add patches. | ||||
|     patcher += patches | ||||
|  | ||||
|     // Execute the patches. | ||||
|     runBlocking { | ||||
|         patcher().collect { patchResult -> | ||||
|             if (patchResult.exception != null) | ||||
|                 logger.info("\"${patchResult.patch}\" failed:\n${patchResult.exception}") | ||||
|             else | ||||
|                 logger.info("\"${patchResult.patch}\" succeeded") | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Compile and save the patched APK file components. | ||||
|     patcher.get() | ||||
| } | ||||
|  | ||||
| // The result of the patcher contains the modified components of the APK file that can be repackaged into a new APK file. | ||||
| val dexFiles = patcherResult.dexFiles | ||||
| val resources = patcherResult.resources | ||||
| ``` | ||||
|  | ||||
| ## ⏭️ What's next | ||||
|  | ||||
| The next page teaches the fundamentals of ReVanced Patches. | ||||
|  | ||||
| Continue: [🧩 Introduction to ReVanced Patches](2_patches_intro.md) | ||||
							
								
								
									
										112
									
								
								docs/2_1_setup.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								docs/2_1_setup.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,112 @@ | ||||
| <p align="center"> | ||||
|   <picture> | ||||
|     <source | ||||
|       width="256px" | ||||
|       media="(prefers-color-scheme: dark)" | ||||
|       srcset="../assets/revanced-headline/revanced-headline-vertical-dark.svg" | ||||
|     > | ||||
|     <img  | ||||
|       width="256px" | ||||
|       src="../assets/revanced-headline/revanced-headline-vertical-light.svg" | ||||
|     > | ||||
|   </picture> | ||||
|   <br> | ||||
|   <a href="https://revanced.app/"> | ||||
|      <picture> | ||||
|          <source height="24px" media="(prefers-color-scheme: dark)" srcset="../assets/revanced-logo/revanced-logo.svg" /> | ||||
|          <img height="24px" src="../assets/revanced-logo/revanced-logo.svg" /> | ||||
|      </picture> | ||||
|    </a>    | ||||
|    <a href="https://github.com/ReVanced"> | ||||
|        <picture> | ||||
|            <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://i.ibb.co/dMMmCrW/Git-Hub-Mark.png" /> | ||||
|            <img height="24px" src="https://i.ibb.co/9wV3HGF/Git-Hub-Mark-Light.png" /> | ||||
|        </picture> | ||||
|    </a>    | ||||
|    <a href="http://revanced.app/discord"> | ||||
|        <picture> | ||||
|            <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" /> | ||||
|            <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" /> | ||||
|        </picture> | ||||
|    </a>    | ||||
|    <a href="https://reddit.com/r/revancedapp"> | ||||
|        <picture> | ||||
|            <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" /> | ||||
|            <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" /> | ||||
|        </picture> | ||||
|    </a>    | ||||
|    <a href="https://t.me/app_revanced"> | ||||
|       <picture> | ||||
|          <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" /> | ||||
|          <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" /> | ||||
|       </picture> | ||||
|    </a>    | ||||
|    <a href="https://x.com/revancedapp"> | ||||
|       <picture> | ||||
|          <source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/93124920/270180600-7c1b38bf-889b-4d68-bd5e-b9d86f91421a.png"> | ||||
|          <img height="24px" src="https://user-images.githubusercontent.com/93124920/270108715-d80743fa-b330-4809-b1e6-79fbdc60d09c.png" /> | ||||
|       </picture> | ||||
|    </a>    | ||||
|    <a href="https://www.youtube.com/@ReVanced"> | ||||
|       <picture> | ||||
|          <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" /> | ||||
|          <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" /> | ||||
|      </picture> | ||||
|    </a> | ||||
|    <br> | ||||
|    <br> | ||||
|    Continuing the legacy of Vanced | ||||
| </p> | ||||
|  | ||||
| # 👶 Setting up a development environment | ||||
|  | ||||
| To start developing patches with ReVanced Patcher, you must prepare a development environment. | ||||
|  | ||||
| ## 📝 Prerequisites | ||||
|  | ||||
| - A Java IDE with Kotlin support, such as [IntelliJ IDEA](https://www.jetbrains.com/idea/) | ||||
| - Knowledge of Java, [Kotlin](https://kotlinlang.org), and [Dalvik bytecode](https://source.android.com/docs/core/runtime/dalvik-bytecode) | ||||
| - Android reverse engineering skills and tools such as [jadx](https://github.com/skylot/jadx) | ||||
|  | ||||
| ## 🏃 Prepare the environment | ||||
|  | ||||
| Throughout the documentation, [ReVanced Patches](https://github.com/revanced/revanced-patches) will be used as an example project. | ||||
|  | ||||
| > [!NOTE] | ||||
| > To start a fresh project,  | ||||
| > you can use the [ReVanced Patches template](https://github.com/revanced/revanced-patches-template). | ||||
|  | ||||
| 1. Clone the repository | ||||
|  | ||||
|    ```bash | ||||
|    git clone https://github.com/revanced/revanced-patches && cd revanced-patches | ||||
|    ``` | ||||
|  | ||||
| 2. Build the project | ||||
|  | ||||
|    ```bash | ||||
|    ./gradlew build | ||||
|    ``` | ||||
|  | ||||
| > [!NOTE] | ||||
| > If the build fails due to authentication, you may need to authenticate to GitHub Packages. | ||||
| > Create a PAT with the scope `read:packages` [here](https://github.com/settings/tokens/new?scopes=read:packages&description=ReVanced) and add your token to ~/.gradle/gradle.properties. | ||||
| > | ||||
| > Example `gradle.properties` file: | ||||
| > | ||||
| > ```properties | ||||
| > gpr.user = user | ||||
| > gpr.key = key | ||||
| > ``` | ||||
|  | ||||
| 3. Open the project in your IDE | ||||
|  | ||||
| > [!TIP] | ||||
| > It is a good idea to set up a complete development environment for ReVanced, so that you can also test your patches | ||||
| > by following the [ReVanced documentation](https://github.com/ReVanced/revanced-documentation). | ||||
|  | ||||
| ## ⏭️ What's next | ||||
|  | ||||
| The next page will go into details about a ReVanced patch. | ||||
|  | ||||
| Continue: [🧩 Anatomy of a patch](2_2_patch_anatomy.md) | ||||
							
								
								
									
										293
									
								
								docs/2_2_1_fingerprinting.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										293
									
								
								docs/2_2_1_fingerprinting.md
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										262
									
								
								docs/2_2_patch_anatomy.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										262
									
								
								docs/2_2_patch_anatomy.md
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										126
									
								
								docs/2_patches_intro.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								docs/2_patches_intro.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,126 @@ | ||||
| <p align="center"> | ||||
|   <picture> | ||||
|     <source | ||||
|       width="256px" | ||||
|       media="(prefers-color-scheme: dark)" | ||||
|       srcset="../assets/revanced-headline/revanced-headline-vertical-dark.svg" | ||||
|     > | ||||
|     <img  | ||||
|       width="256px" | ||||
|       src="../assets/revanced-headline/revanced-headline-vertical-light.svg" | ||||
|     > | ||||
|   </picture> | ||||
|   <br> | ||||
|   <a href="https://revanced.app/"> | ||||
|      <picture> | ||||
|          <source height="24px" media="(prefers-color-scheme: dark)" srcset="../assets/revanced-logo/revanced-logo.svg" /> | ||||
|          <img height="24px" src="../assets/revanced-logo/revanced-logo.svg" /> | ||||
|      </picture> | ||||
|    </a>    | ||||
|    <a href="https://github.com/ReVanced"> | ||||
|        <picture> | ||||
|            <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://i.ibb.co/dMMmCrW/Git-Hub-Mark.png" /> | ||||
|            <img height="24px" src="https://i.ibb.co/9wV3HGF/Git-Hub-Mark-Light.png" /> | ||||
|        </picture> | ||||
|    </a>    | ||||
|    <a href="http://revanced.app/discord"> | ||||
|        <picture> | ||||
|            <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" /> | ||||
|            <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" /> | ||||
|        </picture> | ||||
|    </a>    | ||||
|    <a href="https://reddit.com/r/revancedapp"> | ||||
|        <picture> | ||||
|            <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" /> | ||||
|            <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" /> | ||||
|        </picture> | ||||
|    </a>    | ||||
|    <a href="https://t.me/app_revanced"> | ||||
|       <picture> | ||||
|          <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" /> | ||||
|          <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" /> | ||||
|       </picture> | ||||
|    </a>    | ||||
|    <a href="https://x.com/revancedapp"> | ||||
|       <picture> | ||||
|          <source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/93124920/270180600-7c1b38bf-889b-4d68-bd5e-b9d86f91421a.png"> | ||||
|          <img height="24px" src="https://user-images.githubusercontent.com/93124920/270108715-d80743fa-b330-4809-b1e6-79fbdc60d09c.png" /> | ||||
|       </picture> | ||||
|    </a>    | ||||
|    <a href="https://www.youtube.com/@ReVanced"> | ||||
|       <picture> | ||||
|          <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" /> | ||||
|          <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" /> | ||||
|      </picture> | ||||
|    </a> | ||||
|    <br> | ||||
|    <br> | ||||
|    Continuing the legacy of Vanced | ||||
| </p> | ||||
|  | ||||
| # 🧩 Introduction to ReVanced Patches | ||||
|  | ||||
| Learn the basic concepts of ReVanced Patcher and how to create patches. | ||||
|  | ||||
| ## 📙 Fundamentals | ||||
|  | ||||
| A patch is a piece of code that modifies an Android application.   | ||||
| There are multiple types of patches. Each type can modify a different part of the APK, such as the Dalvik VM bytecode,  | ||||
| the APK resources, or arbitrary files in the APK: | ||||
|  | ||||
| - A `BytecodePatch` modifies the Dalvik VM bytecode | ||||
| - A `ResourcePatch` modifies (decoded) resources | ||||
| - A `RawResourcePatch` modifies arbitrary files | ||||
|  | ||||
| Each patch can declare a set of dependencies on other patches. ReVanced Patcher will first execute dependencies | ||||
| before executing the patch itself. This way, multiple patches can work together for abstract purposes in a modular way. | ||||
|  | ||||
| The `execute` function is the entry point for a patch. It is called by ReVanced Patcher when the patch is executed. | ||||
| The `execute` function receives an instance of a context object that provides access to the APK. | ||||
| The patch can use this context to modify the APK. | ||||
|  | ||||
| Each type of context provides different APIs to modify the APK. For example, the `BytecodePatchContext` provides APIs | ||||
| to modify the Dalvik VM bytecode, while the `ResourcePatchContext` provides APIs to modify resources. | ||||
|  | ||||
| The difference between `ResourcePatch` and `RawResourcePatch` is that ReVanced Patcher will decode the resources | ||||
| if it is supplied a `ResourcePatch` for execution or if any patch depends on a `ResourcePatch` | ||||
| and will not decode the resources before executing `RawResourcePatch`. | ||||
| Both, `ResourcePatch` and `RawResourcePatch` can modify arbitrary files in the APK, | ||||
| whereas only `ResourcePatch` can modify decoded resources. The choice of which type to use depends on the use case. | ||||
| Decoding and building resources is a time- and resource-consuming, | ||||
| so if the patch does not need to modify decoded resources, it is better to use `RawResourcePatch` or `BytecodePatch`. | ||||
|  | ||||
| Example of patches: | ||||
|  | ||||
| ```kt | ||||
| @Surpress("unused") | ||||
| val bytecodePatch = bytecodePatch { | ||||
|     execute {  | ||||
|         // More about this on the next page of the documentation. | ||||
|     } | ||||
| } | ||||
|  | ||||
| @Surpress("unused") | ||||
| val rawResourcePatch = rawResourcePatch { | ||||
|     execute { | ||||
|         // More about this on the next page of the documentation. | ||||
|     } | ||||
| } | ||||
|  | ||||
| @Surpress("unused") | ||||
| val resourcePatch = resourcePatch { | ||||
|     execute { | ||||
|         // More about this on the next page of the documentation. | ||||
|     } | ||||
| } | ||||
| ``` | ||||
|  | ||||
| > [!TIP] | ||||
| > To see real-world examples of patches, | ||||
| > check out the repository for [ReVanced Patches](https://github.com/revanced/revanced-patches). | ||||
|  | ||||
| ## ⏭️ Whats next | ||||
|  | ||||
| The next page will guide you through creating a development environment for creating patches. | ||||
|  | ||||
| Continue: [👶 Setting up a development environment](2_1_setup.md) | ||||
							
								
								
									
										105
									
								
								docs/3_structure_and_conventions.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								docs/3_structure_and_conventions.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| <p align="center"> | ||||
|   <picture> | ||||
|     <source | ||||
|       width="256px" | ||||
|       media="(prefers-color-scheme: dark)" | ||||
|       srcset="../assets/revanced-headline/revanced-headline-vertical-dark.svg" | ||||
|     > | ||||
|     <img  | ||||
|       width="256px" | ||||
|       src="../assets/revanced-headline/revanced-headline-vertical-light.svg" | ||||
|     > | ||||
|   </picture> | ||||
|   <br> | ||||
|   <a href="https://revanced.app/"> | ||||
|      <picture> | ||||
|          <source height="24px" media="(prefers-color-scheme: dark)" srcset="../assets/revanced-logo/revanced-logo.svg" /> | ||||
|          <img height="24px" src="../assets/revanced-logo/revanced-logo.svg" /> | ||||
|      </picture> | ||||
|    </a>    | ||||
|    <a href="https://github.com/ReVanced"> | ||||
|        <picture> | ||||
|            <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://i.ibb.co/dMMmCrW/Git-Hub-Mark.png" /> | ||||
|            <img height="24px" src="https://i.ibb.co/9wV3HGF/Git-Hub-Mark-Light.png" /> | ||||
|        </picture> | ||||
|    </a>    | ||||
|    <a href="http://revanced.app/discord"> | ||||
|        <picture> | ||||
|            <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" /> | ||||
|            <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" /> | ||||
|        </picture> | ||||
|    </a>    | ||||
|    <a href="https://reddit.com/r/revancedapp"> | ||||
|        <picture> | ||||
|            <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" /> | ||||
|            <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" /> | ||||
|        </picture> | ||||
|    </a>    | ||||
|    <a href="https://t.me/app_revanced"> | ||||
|       <picture> | ||||
|          <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" /> | ||||
|          <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" /> | ||||
|       </picture> | ||||
|    </a>    | ||||
|    <a href="https://x.com/revancedapp"> | ||||
|       <picture> | ||||
|          <source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/93124920/270180600-7c1b38bf-889b-4d68-bd5e-b9d86f91421a.png"> | ||||
|          <img height="24px" src="https://user-images.githubusercontent.com/93124920/270108715-d80743fa-b330-4809-b1e6-79fbdc60d09c.png" /> | ||||
|       </picture> | ||||
|    </a>    | ||||
|    <a href="https://www.youtube.com/@ReVanced"> | ||||
|       <picture> | ||||
|          <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" /> | ||||
|          <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" /> | ||||
|      </picture> | ||||
|    </a> | ||||
|    <br> | ||||
|    <br> | ||||
|    Continuing the legacy of Vanced | ||||
| </p> | ||||
|  | ||||
| # 📜 Project structure and conventions | ||||
|  | ||||
| Over time, a specific project structure and conventions have been established. | ||||
|  | ||||
| ## 📁 File structure | ||||
|  | ||||
| Patches are organized in a specific way. The file structure looks as follows: | ||||
|  | ||||
| ```text | ||||
| 📦your.patches.app.category | ||||
|  ├ 🔍Fingerprints.kt | ||||
|  └ 🧩SomePatch.kt | ||||
| ``` | ||||
|  | ||||
| > [!NOTE] | ||||
| > Moving fingerprints to a separate file isn't strictly necessary, but it helps the organization when a patch uses multiple fingerprints. | ||||
|  | ||||
| ## 📙 Conventions | ||||
|  | ||||
| - 🔥 Name a patch after what it does. For example, if a patch removes ads, name it `Remove ads`. | ||||
|   If a patch changes the color of a button, name it `Change button color` | ||||
| - 🔥 Write the patch description in the third person, present tense, and end it with a period. | ||||
|   If a patch removes ads, the description can be omitted because of redundancy, | ||||
|   but if a patch changes the color of a button, the description can be _Changes the color of the resume button to red._ | ||||
| - 🔥 Write patches with modularity and reusability in mind. Patches can depend on each other, | ||||
|   so it is important to write patches in a way that can be used in different contexts. | ||||
| - 🔥🔥 Keep patches as minimal as possible. This reduces the risk of failing patches. | ||||
|   Instead of involving many abstract changes in one patch or writing entire methods or classes in a patch, | ||||
|   you can write code in extensions. An extension is a precompiled DEX file that is merged into the patched app  | ||||
|   before this patch is executed. | ||||
|   Patches can then reference methods and classes from extensions. | ||||
|   A real-world example of extensions can be found in the [ReVanced Patches](https://github.com/ReVanced/revanced-patches) repository | ||||
| - 🔥🔥🔥 Do not overload a fingerprint with information about a method that's likely to change. | ||||
|   In the example of an obfuscated method, it's better to fingerprint the method by its return type | ||||
|   and parameters rather than its name because the name is likely to change. An intelligent selection | ||||
|   of an opcode pattern or strings in a method can result in a strong fingerprint dynamic to app updates. | ||||
| - 🔥🔥🔥 Document your patches. Patches are abstract, so it is important to document parts of the code | ||||
|   that are not self-explanatory. For example, explain why and how a certain method is patched or large blocks | ||||
|   of instructions that are modified or added to a method | ||||
|  | ||||
| ## ⏭️ What's next | ||||
|  | ||||
| The next page discusses useful APIs for patch development. | ||||
|  | ||||
| Continue: [💪 Advanced APIs](4_apis.md) | ||||
							
								
								
									
										116
									
								
								docs/4_apis.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								docs/4_apis.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,116 @@ | ||||
| # 💪 Advanced APIs | ||||
|  | ||||
| A handful of APIs are available to make patch development easier and more efficient. | ||||
|  | ||||
| ## 📙 Overview | ||||
|  | ||||
| 1. 👹 Create mutable replacements of classes with `proxy(ClassDef)` | ||||
| 2. 🔍 Find and create mutable replaces with `classBy(Predicate)` | ||||
| 3. 🏃 Navigate method calls recursively by index with `navigate(Method)` | ||||
| 4. 💾 Read and write resource files with `get(String, Boolean)` and `delete(String)` | ||||
| 5. 📃 Read and write DOM files using `document(String)` and  `document(InputStream)` | ||||
|  | ||||
| ### 🧰 APIs | ||||
|  | ||||
| #### 👹 `proxy(ClassDef)` | ||||
|  | ||||
| By default, the classes are immutable, meaning they cannot be modified. | ||||
| To make a class mutable, use the `proxy(ClassDef)` function. | ||||
| This function creates a lazy mutable copy of the class definition. | ||||
| Accessing the property will replace the original class definition with the mutable copy, | ||||
| thus allowing you to make changes to the class. Subsequent accesses will return the same mutable copy. | ||||
|  | ||||
| ```kt | ||||
| execute { | ||||
|     val mutableClass = proxy(classDef) | ||||
|     mutableClass.methods.add(Method()) | ||||
| } | ||||
| ``` | ||||
|  | ||||
| #### 🔍 `classBy(Predicate)` | ||||
|  | ||||
| The `classBy(Predicate)` function is an alternative to finding and creating mutable classes by a predicate. | ||||
| It automatically proxies the class definition, making it mutable. | ||||
|  | ||||
| ```kt | ||||
| execute { | ||||
|     // Alternative to proxy(classes.find { it.name == "Lcom/example/MyClass;" })?.classDef | ||||
|     val classDef = classBy { it.name == "Lcom/example/MyClass;" }?.classDef | ||||
| } | ||||
| ``` | ||||
|  | ||||
| #### 🏃 `navigate(Method).at(index)` | ||||
|  | ||||
| The `navigate(Method)` function allows you to navigate method calls recursively by index. | ||||
|  | ||||
| ```kt | ||||
| execute { | ||||
|     // Sequentially navigate to the instructions at index 1 within 'someMethod'. | ||||
|     val method = navigate(someMethod).at(1).original() // original() returns the original immutable method. | ||||
|      | ||||
|     // Further navigate to the second occurrence where the instruction's opcode is 'INVOKEVIRTUAL'. | ||||
|     // stop() returns the mutable copy of the method. | ||||
|     val method = navigate(someMethod).at(2) { instruction -> instruction.opcode == Opcode.INVOKEVIRTUAL }.stop() | ||||
|      | ||||
|     // Alternatively, to stop(), you can delegate the method to a variable. | ||||
|     val method by navigate(someMethod).at(1) | ||||
|      | ||||
|     // You can chain multiple calls to at() to navigate deeper into the method. | ||||
|     val method by navigate(someMethod).at(1).at(2, 3, 4).at(5) | ||||
| } | ||||
| ``` | ||||
|  | ||||
| #### 💾 `get(String, Boolean)` and `delete(String)` | ||||
|  | ||||
| The `get(String, Boolean)` function returns a `File` object that can be used to read and write resource files. | ||||
|  | ||||
| ```kt | ||||
| execute { | ||||
|     val file = get("res/values/strings.xml") | ||||
|     val content = file.readText() | ||||
|     file.writeText(content) | ||||
| } | ||||
| ``` | ||||
|  | ||||
| The `delete` function can mark files for deletion when the APK is rebuilt. | ||||
|  | ||||
| ```kt | ||||
| execute { | ||||
|     delete("res/values/strings.xml") | ||||
| } | ||||
| ``` | ||||
|  | ||||
| #### 📃 `document(String)`  and  `document(InputStream)` | ||||
|  | ||||
| The `document` function is used to read and write DOM files. | ||||
|  | ||||
| ```kt | ||||
| execute {  | ||||
|     document("res/values/strings.xml").use { document -> | ||||
|         val element = doc.createElement("string").apply { | ||||
|             textContent = "Hello, World!" | ||||
|         } | ||||
|         document.documentElement.appendChild(element) | ||||
|     } | ||||
| } | ||||
| ``` | ||||
|  | ||||
| You can also read documents from an `InputStream`: | ||||
|  | ||||
| ```kt | ||||
| execute { | ||||
|     val inputStream = classLoader.getResourceAsStream("some.xml") | ||||
|     document(inputStream).use { document -> | ||||
|         // ... | ||||
|     } | ||||
| } | ||||
| ``` | ||||
|  | ||||
| ## 🎉 Afterword | ||||
|  | ||||
| ReVanced Patcher is a powerful library to patch Android applications, offering a rich set of APIs to develop patches | ||||
| that outlive app updates. Patches make up ReVanced; without you, the community of patch developers, | ||||
| ReVanced would not be what it is today. We hope that this documentation has been helpful to you | ||||
| and are excited to see what you will create with ReVanced Patcher. If you have any questions or need help, | ||||
| talk to us on one of our platforms linked on [revanced.app](https://revanced.app) or open an issue in case of a bug or feature request,   | ||||
| ReVanced | ||||
							
								
								
									
										73
									
								
								docs/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								docs/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| <p align="center"> | ||||
|   <picture> | ||||
|     <source | ||||
|       width="256px" | ||||
|       media="(prefers-color-scheme: dark)" | ||||
|       srcset="../assets/revanced-headline/revanced-headline-vertical-dark.svg" | ||||
|     > | ||||
|     <img  | ||||
|       width="256px" | ||||
|       src="../assets/revanced-headline/revanced-headline-vertical-light.svg" | ||||
|     > | ||||
|   </picture> | ||||
|   <br> | ||||
|   <a href="https://revanced.app/"> | ||||
|      <picture> | ||||
|          <source height="24px" media="(prefers-color-scheme: dark)" srcset="../assets/revanced-logo/revanced-logo.svg" /> | ||||
|          <img height="24px" src="../assets/revanced-logo/revanced-logo.svg" /> | ||||
|      </picture> | ||||
|    </a>    | ||||
|    <a href="https://github.com/ReVanced"> | ||||
|        <picture> | ||||
|            <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://i.ibb.co/dMMmCrW/Git-Hub-Mark.png" /> | ||||
|            <img height="24px" src="https://i.ibb.co/9wV3HGF/Git-Hub-Mark-Light.png" /> | ||||
|        </picture> | ||||
|    </a>    | ||||
|    <a href="http://revanced.app/discord"> | ||||
|        <picture> | ||||
|            <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" /> | ||||
|            <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" /> | ||||
|        </picture> | ||||
|    </a>    | ||||
|    <a href="https://reddit.com/r/revancedapp"> | ||||
|        <picture> | ||||
|            <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" /> | ||||
|            <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" /> | ||||
|        </picture> | ||||
|    </a>    | ||||
|    <a href="https://t.me/app_revanced"> | ||||
|       <picture> | ||||
|          <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" /> | ||||
|          <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" /> | ||||
|       </picture> | ||||
|    </a>    | ||||
|    <a href="https://x.com/revancedapp"> | ||||
|       <picture> | ||||
|          <source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/93124920/270180600-7c1b38bf-889b-4d68-bd5e-b9d86f91421a.png"> | ||||
|          <img height="24px" src="https://user-images.githubusercontent.com/93124920/270108715-d80743fa-b330-4809-b1e6-79fbdc60d09c.png" /> | ||||
|       </picture> | ||||
|    </a>    | ||||
|    <a href="https://www.youtube.com/@ReVanced"> | ||||
|       <picture> | ||||
|          <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" /> | ||||
|          <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" /> | ||||
|      </picture> | ||||
|    </a> | ||||
|    <br> | ||||
|    <br> | ||||
|    Continuing the legacy of Vanced | ||||
| </p> | ||||
|  | ||||
| # 💉 Documentation of ReVanced Patcher | ||||
|  | ||||
| This documentation contains the fundamentals of ReVanced Patcher and how to use ReVanced Patcher to create patches | ||||
|  | ||||
| ## 📖 Table of content | ||||
|  | ||||
| 1. [💉 Introduction to ReVanced Patcher](1_patcher_intro.md) | ||||
| 2. [🧩 Introduction to ReVanced Patches](2_patches_intro.md) | ||||
|    1. [👶 Setting up a development environment](2_1_setup.md) | ||||
|    2. [🧩 Anatomy of a ReVanced patch](2_2_patch_anatomy.md) | ||||
|       1. [🔎 Fingerprinting](2_2_1_fingerprinting.md) | ||||
|    3. [📜 Project structure and conventions](3_structure_and_conventions.md) | ||||
|    4. [💪 Advanced APIs](4_apis.md) | ||||
| @@ -1,4 +1,3 @@ | ||||
| org.gradle.parallel = true | ||||
| org.gradle.caching = true | ||||
| kotlin.code.style = official | ||||
| version = 15.0.0-dev.1 | ||||
| version = 20.0.2 | ||||
|   | ||||
| @@ -1,31 +1,27 @@ | ||||
| [versions] | ||||
| android = "4.1.1.4" | ||||
| kotlin-reflect = "1.9.0" | ||||
| apktool-lib = "2.8.2-6" | ||||
| kotlin-test = "1.8.20-RC" | ||||
| kotlinx-coroutines-core = "1.7.1" | ||||
| multidexlib2 = "3.0.3.r2" | ||||
| smali = "3.0.3" | ||||
| symbol-processing-api = "1.9.0-1.0.11" | ||||
| apktool-lib = "2.9.3" | ||||
| binary-compatibility-validator = "0.15.1" | ||||
| kotlin = "2.0.0" | ||||
| kotlinx-coroutines-core = "1.8.1" | ||||
| mockk = "1.13.10" | ||||
| multidexlib2 = "3.0.3.r3" | ||||
| # Tracking https://github.com/google/smali/issues/64. | ||||
| #noinspection GradleDependency | ||||
| smali = "3.0.5" | ||||
| xpp3 = "1.1.4c" | ||||
| binary-compatibility-validator = "0.13.2" | ||||
| kotlin-compile-testing-ksp = "1.5.0" | ||||
| kotlinpoet-ksp = "1.14.2" | ||||
| ksp = "1.9.0-1.0.11" | ||||
|  | ||||
| [libraries] | ||||
| android = { module = "com.google.android:android", version.ref = "android" } | ||||
| kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin-reflect" } | ||||
| apktool-lib = { module = "app.revanced:apktool-lib", version.ref = "apktool-lib" } | ||||
| kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin-test" } | ||||
| kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" } | ||||
| kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx-coroutines-core" } | ||||
| kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } | ||||
| mockk = { module = "io.mockk:mockk", version.ref = "mockk" } | ||||
| multidexlib2 = { module = "app.revanced:multidexlib2", version.ref = "multidexlib2" } | ||||
| smali = { module = "com.android.tools.smali:smali", version.ref = "smali" } | ||||
| symbol-processing-api = { module = "com.google.devtools.ksp:symbol-processing-api", version.ref = "symbol-processing-api" } | ||||
| xpp3 = { module = "xpp3:xpp3", version.ref = "xpp3" } | ||||
| kotlin-compile-testing = { module = "com.github.tschuchortdev:kotlin-compile-testing-ksp", version.ref = "kotlin-compile-testing-ksp" } | ||||
| kotlinpoet-ksp = { module = "com.squareup:kotlinpoet-ksp", version.ref = "kotlinpoet-ksp" } | ||||
|  | ||||
| [plugins] | ||||
| binary-compatibility-validator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version.ref = "binary-compatibility-validator" } | ||||
| ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } | ||||
| kotlin = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										3
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							| @@ -1,6 +1,7 @@ | ||||
| distributionBase=GRADLE_USER_HOME | ||||
| distributionPath=wrapper/dists | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip | ||||
| distributionSha256Sum=d725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip | ||||
| networkTimeout=10000 | ||||
| validateDistributionUrl=true | ||||
| zipStoreBase=GRADLE_USER_HOME | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user