├── assets ├── fav.png └── js │ └── scale.fix.js ├── _config.yml ├── .well-known └── brave-rewards-verification.txt ├── pages ├── contacts.md ├── disclaimer.md ├── support.md ├── downloads.md ├── apk-signing.md └── general.md ├── _layouts └── default.html ├── _includes └── nav.html ├── index.md └── _sass └── jekyll-theme-hacker.scss /assets/fav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apk-editor/apk-editor.github.io/HEAD/assets/fav.png -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | title: APK Explorer & Editor (AEE) 2 | description: The homepage of AEE 3 | show_downloads: false 4 | theme: jekyll-theme-hacker 5 | include: [".well-known"] 6 | -------------------------------------------------------------------------------- /.well-known/brave-rewards-verification.txt: -------------------------------------------------------------------------------- 1 | This is a Brave Rewards publisher verification file. 2 | 3 | Domain: apk-editor.github.io 4 | Token: 5b72b2739af327f3383ece000524e23ad8047e6a9b693205f2604313e27326bb 5 | -------------------------------------------------------------------------------- /assets/js/scale.fix.js: -------------------------------------------------------------------------------- 1 | function mMenu() { 2 | var x = document.getElementById("mTopnav"); 3 | if (x.className === "topnav") { 4 | x.className += " responsive"; 5 | } else { 6 | x.className = "topnav"; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /pages/contacts.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Contacts 4 | permalink: /contacts/ 5 | --- 6 | 7 | 10 | 11 | ## Contacts 12 | 13 |

For general support feel free to join AEE Telegram group.

14 | 15 |

16 | 17 | ### Contact developer 18 | 19 |

If you have any questions about AEE, please don't hesitate to contact the developer at apkeditor@protonmail.com.

20 | -------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | {% seo %} 11 | 12 | 13 | 14 | 15 |
16 |
17 | {% include nav.html %} 18 |
19 |
20 | 21 |
22 |
23 | {{ content }} 24 |
25 |
26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /_includes/nav.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | Home 6 | 15 | Downloads 16 | Source Code 17 | Support AEE 18 | Translations 19 | Disclaimer 20 | Contacts 21 |
22 |

23 | -------------------------------------------------------------------------------- /pages/disclaimer.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Disclaimer 4 | permalink: /disclaimer/ 5 | --- 6 | 7 | 10 | 11 | ## Disclaimer 12 | 13 |

AEE is free and open-source: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

14 | 15 |

However, please be noted that AEE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License (http://www.gnu.org/licenses/) for more details.

16 | 17 |

Moreover, AEE is made with a good intention to check out what’s inside installed APK files on an Android device, and not at all designed for any kind of illegal activities.

18 | -------------------------------------------------------------------------------- /pages/support.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Support AEE 4 | permalink: /support/ 5 | --- 6 | 7 | 10 | 11 | ## Support the development of AEE 12 | 13 |

If you like to appreciate the efforts of developer to provide AEE free (always available in GitHub release page), non-intrusive and without Ads, please consider supporting the development in some way. Maintaining this project take a lot of time. So, each and every support from the android community will be hugely appreciated.

14 | 15 |

16 | 17 |

Liberapay Donation url: https://liberapay.com/sunilpaulmathew/donate
PayPal Donation url: https://www.paypal.me/menacherry

18 | 19 | Some other ways to support the development includes, but not limited to 20 |
    21 |
  1. Buy AEE from Google Play. It's very cheap, but still capable to support the development.
  2. 22 |
  3. If you already purchased the AEE, please consider rating or/and reviewing the same in Google Play.
  4. 23 |
  5. Help to translate AEE into your local language (or improve existing translations).
  6. 24 |
  7. Share good words about AEE with others (family, friends, and other enthusiastic android users).
  8. 25 |
26 | -------------------------------------------------------------------------------- /pages/downloads.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Downloads 4 | permalink: /downloads/ 5 | --- 6 | 7 | 10 | 11 | ## Downloads 12 | 13 |

AEE offers two different versions of APK's with slightly different capabilities for those who interested, and are

14 | 15 | ### Google Play 16 | 17 |

Google Play version is named as APK Explorer, which itself describes its purpose and limitations clearly. In order to avoid Google's policy violations, this version doesn't offer APK signing and related features. As a result, this version only offers to view and export/save the contents of an installed APK file. Moreover, please be noted that this version is provided as a paid app, mainly to support the development of this project. If you are not really into APK editing, please consider purchasing this version to support the development of this open-source project.

18 | 19 |

20 | 21 | ### F-Droid/GitHub 22 | 23 |

The F-Droid/GitHub version is named as APK Explorer & Editor, which is in fact the full version of AEE. It offers all the capabilities of this project including APK/app bundle signing, very basic editing on the resources (work in progress), as well as the installation of the exported APK's/app bundles. This version is, and always, remains free.

24 | 25 |

26 | -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Home 4 | --- 5 | 6 | 9 | 10 | ## Welcome to the home page of APK Explorer & Editor (AEE) 11 |

APK Explorer & Editor (AEE), includes a set of open-source tools mainly designed to check out what's inside installed APK's, is strictly made with an aim to inspect an installed APK file. Additionally, AEE offers a feature-rich APK/Split APK's/App bundle installer which allows users to pick and install files from device storage.

12 | 13 |

14 | 15 | ### Features 16 | 1. A beautifully designed list view of installed applications. 17 | 2. Explore an installed application or APK file picked from the device storage and navigate through its contents. 18 | 3. Export and easily manage (install, share etc.) APK's/Split APK's into device storage. 19 | 4. Includes a feature-rich APK/Split APK/App bundle installer (easily pick and install files from device storage) 20 | 5. Easily extract app icons by single-clicking on them. 21 | 6. Edit text/binary XML files using an in-built text editor (still, a bit buggy especially when working with big APK's). 22 | 8. View graphics, texts, binary XML, and many more. 23 | 7. Delete or replaces resources. 24 | 9. Save/Export individual or a batch of resource files into device storage or delete them. 25 | 10. Decompile dex classes (.dex) into smali files for editing and recompile back to dex format. 26 | 11. Create signed APK's/App Bundles after the above-mentioned modifications. 27 | 12. Resign APK's/bundles with AEE custom key. 28 | 13. Elegantly designed user interface with an auto-dark/light theme. 29 | 14. A lot more. 30 | -------------------------------------------------------------------------------- /pages/apk-signing.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Signing APK's 4 | permalink: /apk-signing/ 5 | --- 6 | 7 | 10 | 11 | ## APK Signing 12 | 13 |

AEE will recognize APK files and app bundles and sign them accordingly with its default key. In order to sign an APK using a custom Keystore, some specific methods need to be followed and are explained in the next section.

14 | 15 | ## Signing with a custom key 16 | 17 |

In order to sign APK's with a custom key, AEE requires either a PKCS #12 keystore or a PKCS #8/X509Certificate key pair.

18 | 19 | ### How to generate a PKCS #12 keystore 20 | 21 |
    22 |
  1. Convert a java keystore (JKS) to PKCS12 format

    keytool -importkeystore -srckeystore KEYSTORE_PATH -destkeystore intermediate.p12 -srcstoretype JKS -deststoretype PKCS12

  2. 23 |
24 | 25 | ### How to create a PKCS #8 private key 26 | 27 |
    28 |
  1. Convert a PKCS12 to pem format

    openssl pkcs12 -in intermediate.p12 -nodes -out intermediate.rsa.pem

  2. 29 |
  3. Convert the pem file to PKCS #8 format

    openssl pkcs8 -topk8 -outform DER -in intermediate.rsa.pem -inform PEM -out private.pk8 -nocrypt
  4. 30 |
31 | 32 | ### How to create X509Certificate 33 | 34 |
    35 |
  1. Read X509Certificate from a java keystore (JKS)

    keytool -list -rfc -keystore KEYSTORE_PATH -alias KEY_ALIAS -storepass STORE_PASSWORD

  2. 36 |
  3. From the output, copy the text starting from -----BEGIN CERTIFICATE----- to -----END CERTIFICATE----- (including both) and save it as a text file

  4. 37 |
38 | 39 | ### Configure AEE to work with custom key 40 | 41 |

Open AEE and Navigate to Settings -> Sign APK's with and select Custom Key. A new page will now open which offers an option to select a custom Private Key. Use it to import your PKCS #12 keystore or PKCS #8 private key. Depending on the imported file, AEE might ask for additional details. For e.g., keystore and alias passwords are requested upon importing a PKCS #12 keystore. On the other hand, importing a PKCS #8 private key to AEE will lead you to a new window requesting it's respective X509Certificate pair. By fulfilling them, AEE will do the following changes, and now onwards uses the new credentials for signing.

42 | 43 |
    44 |
  1. Save private key as

    /data/data/com.apk.editor/files/signing/APKEditor.pk8

  2. 45 |
  3. Save X509Certificate as

    /data/data/com.apk.editor/files/signing/APKEditorCert

  4. 46 |
47 | 48 |

Previous: General

49 | -------------------------------------------------------------------------------- /pages/general.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: General 4 | permalink: /general/ 5 | --- 6 | 7 | 10 | 11 | ## User Interface 12 | 13 |

The main user interface of AEE is categorized into a number of pages, and are

14 | 15 | ### 1. Installed Apps 16 | 17 |

This page will by default load all the installed application on your device. AEE also allow offers a separate view of System and User apps. The following tasks are allowed on this page.

18 | 19 |
    20 |
  1. Single click on an icon will load it in full screen. From the newly opened screen, it is also possible to save the same into device storage.
  2. 21 |
  3. Single click on any other part of an application will open the contents of the installed application in a File Manager and allows users to navigate through its contents.
  4. 22 |
  5. It is possible to Save/Export individual resource files such as fonts, graphics, binary XML files, etc to device storage.
  6. 23 |
  7. AEE even allow users to Delete or Replace original resource files of an APK.
  8. 24 |
  9. It is also possible to edit text/binary XML files using an in-built text editor (disabled by default in the Settings menu).
  10. 25 |
  11. Finally, AEE offers the generation of a signed (with AEE custom key) APK's/App Bundles after the above-mentioned modifications.
  12. 26 |
  13. Alternately, long clicking on an entry on the main screen will allow users to simply export (with or without signing with AEE custom key) APK's/App bundles into device storage.
  14. 27 |
28 | 29 | ### 2. Projects 30 | 31 |

This page lists all the applications (including the uninstalled ones) that are already explored from the first page, provided the user decided to retain the explored data upon asking (app will prompt when closing a project). This page also allows almost all the tasks that are available in the previous page. Additionally, long-clicking an item on this page will allow making a copy of the entire project folder of the selected app into device storage.

32 | 33 | ### 3. Extracted APK's 34 | 35 |

This page lists all the APK's/App bundles created on the first page. Various tasks that are allowed on this page are

36 | 37 |
    38 |
  1. Install an exported or resigned APK/Split APK's by single clicking.
  2. 39 |
  3. Share or save an exported APK/Split APK's to downloads folder by long clicking.
  4. 40 |
  5. Delete an exported APK/Split APK's.
  6. 41 |
42 | 43 |

Additionally, this page is also equipped with a feature-rich APK/Split APK/App bundle installer. AEE Split APK installer now handles normal APK's, split APK's as well as xapk, apks and apkm app bundles. In order to initialize an installation, simply click the installer button on the top to select the installation file(s) and follow onscreen instructions.

44 | 45 | ### 4. About 46 | 47 |

Shows very basic information about the development of this project. It includes links to visit the source code of AEE, Telegram support group etc.

48 | 49 | ### 5. Settings 50 | 51 |

The Settings menu of AEE is bundled with a number of options including,

52 | 53 |
    54 |
  1. Choose the default action when Exiting a Project, Exporting and Installing APK's, etc.
  2. 55 |
  3. Chose app theme and display language.
  4. 56 |
  5. Configure APK signing.
  6. 57 |
58 | 59 |

Next: Signing APK's

60 | -------------------------------------------------------------------------------- /_sass/jekyll-theme-hacker.scss: -------------------------------------------------------------------------------- 1 | @import "rouge-base16-dark"; 2 | @import "default_colors"; 3 | 4 | $body-background: $cod-grey !default; 5 | $body-foreground: $gallery !default; 6 | $header: $conifer !default; 7 | $blockquote-color: $silver-chalice !default; 8 | $blockquote-border: $dove-grey !default; 9 | $container-max-width: 1000px; 10 | 11 | @mixin media-max-width($max-width) { 12 | @media (max-width: $max-width) { 13 | @content; 14 | } 15 | } 16 | 17 | .topnav { 18 | background-color: $cod-grey; 19 | overflow: hidden; 20 | position: fixed; 21 | width: 100%; 22 | top: 0; 23 | } 24 | 25 | .topnav a { 26 | float: left; 27 | display: block; 28 | color: $conifer; 29 | text-align: center; 30 | padding: 14px 16px; 31 | text-decoration: none; 32 | font-size: 17px; 33 | } 34 | 35 | .active { 36 | background-color: #4caf50; 37 | color: white; 38 | } 39 | 40 | .topnav .icon { 41 | display: none; 42 | } 43 | 44 | .dropdown { 45 | float: left; 46 | overflow: hidden; 47 | } 48 | 49 | .dropdown .dropbtn { 50 | font-size: 17px; 51 | border: none; 52 | outline: none; 53 | color: $conifer; 54 | padding: 14px 16px; 55 | background-color: inherit; 56 | font-family: inherit; 57 | margin: 0; 58 | } 59 | 60 | .dropdown-content { 61 | display: none; 62 | position: fixed; 63 | background-color: $conifer; 64 | min-width: 160px; 65 | box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); 66 | z-index: 1; 67 | } 68 | 69 | .dropdown-content a { 70 | float: none; 71 | color: black; 72 | padding: 12px 16px; 73 | text-decoration: none; 74 | display: block; 75 | text-align: left; 76 | } 77 | 78 | .topnav a:hover, 79 | .dropdown:hover .dropbtn { 80 | background-color: #555; 81 | color: white; 82 | } 83 | 84 | .dropdown-content a:hover { 85 | background-color: #ddd; 86 | color: black; 87 | } 88 | 89 | .dropdown:hover .dropdown-content { 90 | display: block; 91 | } 92 | 93 | body { 94 | margin: 0; 95 | padding: 0; 96 | background: $cod-grey; 97 | color: $body-foreground; 98 | font-size: 16px; 99 | line-height: 1.5; 100 | font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; 101 | } 102 | 103 | /* General & 'Reset' Stuff */ 104 | 105 | .container { 106 | width: 90%; 107 | max-width: $container-max-width; 108 | margin: 0 auto; 109 | } 110 | 111 | section { 112 | display: block; 113 | margin: 0 0 20px 0; 114 | } 115 | 116 | h1, h2, h3, h4, h5, h6 { 117 | margin: 0 0 20px; 118 | } 119 | 120 | li { 121 | line-height: 1.4 ; 122 | } 123 | 124 | /* Header,
125 | header - container 126 | h1 - project name 127 | h2 - project description 128 | */ 129 | 130 | header { 131 | background: rgba(0, 0, 0, 0.1); 132 | width: 100%; 133 | border-bottom: 1px dashed $conifer; //header; 134 | padding: 20px 0; 135 | margin: 0 0 40px 0; 136 | } 137 | 138 | header h1 { 139 | font-size: 30px; 140 | line-height: 1.5; 141 | margin: 0 0 0 -40px; 142 | font-weight: bold; 143 | font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; 144 | color: $conifer;//$header; 145 | text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1), 146 | 0 0 5px rgba(181, 232, 83, 0.1), 147 | 0 0 10px rgba(181, 232, 83, 0.1); 148 | letter-spacing: -1px; 149 | -webkit-font-smoothing: antialiased; 150 | @include media-max-width($container-max-width) { 151 | margin-left: 0; 152 | } 153 | } 154 | 155 | 156 | header h1:before { 157 | content: "./ "; 158 | font-size: 24px; 159 | } 160 | 161 | header h2 { 162 | font-size: 18px; 163 | font-weight: 300; 164 | color: #666; 165 | } 166 | 167 | #downloads .btn { 168 | display: inline-block; 169 | text-align: center; 170 | margin: 0; 171 | } 172 | 173 | /* Main Content 174 | */ 175 | 176 | #main_content { 177 | width: 100%; 178 | -webkit-font-smoothing: antialiased; 179 | } 180 | section img { 181 | max-width: 100% 182 | } 183 | 184 | h1, h2, h3, h4, h5, h6 { 185 | font-weight: normal; 186 | font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; 187 | color: $header; 188 | letter-spacing: -0.03em; 189 | text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1), 190 | 0 0 5px rgba(181, 232, 83, 0.1), 191 | 0 0 10px rgba(181, 232, 83, 0.1); 192 | } 193 | 194 | #main_content h1 { 195 | font-size: 30px; 196 | } 197 | 198 | #main_content h2 { 199 | font-size: 24px; 200 | } 201 | 202 | #main_content h3 { 203 | font-size: 18px; 204 | } 205 | 206 | #main_content h4 { 207 | font-size: 14px; 208 | } 209 | 210 | #main_content h5 { 211 | font-size: 12px; 212 | text-transform: uppercase; 213 | margin: 0 0 5px 0; 214 | } 215 | 216 | #main_content h6 { 217 | font-size: 12px; 218 | text-transform: uppercase; 219 | color: #999; 220 | margin: 0 0 5px 0; 221 | } 222 | 223 | dt { 224 | font-style: italic; 225 | font-weight: bold; 226 | } 227 | 228 | ul li { 229 | list-style-image:url('../images/bullet.png'); 230 | } 231 | 232 | blockquote { 233 | color: $blockquote-color; 234 | padding-left: 10px; 235 | border-left: 1px dotted $blockquote-border; 236 | } 237 | 238 | pre { 239 | background: rgba(0, 0, 0, 0.9); 240 | border: 1px solid rgba(255, 255, 255, 0.15); 241 | padding: 10px; 242 | font-size: 16px; 243 | color: #b5e853; 244 | border-radius: 2px; 245 | word-wrap: normal; 246 | overflow: auto; 247 | overflow-y: hidden; 248 | } 249 | 250 | code.highlighter-rouge { 251 | background: rgba(0,0,0,0.9); 252 | border: 1px solid rgba(255, 255, 255, 0.15); 253 | padding: 0px 3px; 254 | margin: 0px -3px; 255 | color: #aa759f; 256 | border-radius: 2px; 257 | } 258 | 259 | table { 260 | width: 100%; 261 | margin: 0 0 20px 0; 262 | } 263 | 264 | th { 265 | text-align: left; 266 | border-bottom: 1px dashed #b5e853; 267 | padding: 5px 10px; 268 | } 269 | 270 | td { 271 | padding: 5px 10px; 272 | } 273 | 274 | hr { 275 | height: 0; 276 | border: 0; 277 | border-bottom: 1px dashed #b5e853; 278 | color: #b5e853; 279 | } 280 | 281 | /* Buttons 282 | */ 283 | 284 | .btn { 285 | display: inline-block; 286 | background: -webkit-linear-gradient(top, rgba(40, 40, 40, 0.3), rgba(35, 35, 35, 0.3) 50%, rgba(10, 10, 10, 0.3) 50%, rgba(0, 0, 0, 0.3)); 287 | padding: 8px 18px; 288 | border-radius: 50px; 289 | border: 2px solid rgba(0, 0, 0, 0.7); 290 | border-bottom: 2px solid rgba(0, 0, 0, 0.7); 291 | border-top: 2px solid rgba(0, 0, 0, 1); 292 | color: rgba(255, 255, 255, 0.8); 293 | font-family: Helvetica, Arial, sans-serif; 294 | font-weight: bold; 295 | font-size: 13px; 296 | text-decoration: none; 297 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.75); 298 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05); 299 | } 300 | 301 | .btn:hover { 302 | background: -webkit-linear-gradient(top, rgba(40, 40, 40, 0.6), rgba(35, 35, 35, 0.6) 50%, rgba(10, 10, 10, 0.8) 50%, rgba(0, 0, 0, 0.8)); 303 | } 304 | 305 | .btn .icon { 306 | display: inline-block; 307 | width: 16px; 308 | height: 16px; 309 | margin: 1px 8px 0 0; 310 | float: left; 311 | } 312 | 313 | .btn-github .icon { 314 | opacity: 0.6; 315 | background: url("../images/blacktocat.png") 0 0 no-repeat; 316 | } 317 | 318 | /* Links 319 | a, a:hover, a:visited 320 | */ 321 | 322 | a { 323 | color: #63c0f5; 324 | text-shadow: 0 0 5px rgba(104, 182, 255, 0.5); 325 | } 326 | 327 | /* Clearfix */ 328 | 329 | .cf:before, .cf:after { 330 | content:""; 331 | display:table; 332 | } 333 | 334 | .cf:after { 335 | clear:both; 336 | } 337 | 338 | .cf { 339 | zoom:1; 340 | } 341 | 342 | #a-title { 343 | text-decoration: none; 344 | } 345 | 346 | @media screen and (max-width: 600px) { 347 | .topnav a:not(:first-child), 348 | .dropdown .dropbtn { 349 | display: none; 350 | } 351 | 352 | .topnav.responsive { 353 | position: relative; 354 | } 355 | 356 | .topnav a.icon { 357 | float: left; 358 | display: block; 359 | } 360 | 361 | .topnav.responsive a.icon { 362 | position: absolute; 363 | right: 0; 364 | top: 0; 365 | } 366 | 367 | .topnav.responsive a { 368 | float: none; 369 | display: block; 370 | text-align: left; 371 | } 372 | 373 | .topnav.responsive .dropdown { 374 | float: none; 375 | } 376 | 377 | .topnav.responsive .dropdown-content { 378 | position: relative; 379 | } 380 | 381 | .topnav.responsive .dropdown .dropbtn { 382 | display: block; 383 | width: 100%; 384 | text-align: left; 385 | } 386 | } 387 | --------------------------------------------------------------------------------