├── _template ├── vendor │ └── chromium │ │ └── crx │ │ └── README.txt ├── icon.png ├── _locales │ └── en │ │ └── messages.json ├── app_main.html └── manifest.json ├── chromeos-apk ├── misc ├── ARChonLogo.png └── ARChonLogo.svg ├── lib └── parseApk.js ├── CHANGELOG ├── .gitignore ├── .travis.yml ├── package.json ├── multiple-apps.md ├── LICENSE ├── manually-convert.md ├── manifest.md ├── chromeos-apk.js ├── README.md └── archon.md /_template/vendor/chromium/crx/README.txt: -------------------------------------------------------------------------------- 1 | APK goes here. 2 | -------------------------------------------------------------------------------- /chromeos-apk: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | require('./chromeos-apk.js')(); 4 | -------------------------------------------------------------------------------- /_template/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/no-problemo/chromeos-apk/master/_template/icon.png -------------------------------------------------------------------------------- /misc/ARChonLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/no-problemo/chromeos-apk/master/misc/ARChonLogo.png -------------------------------------------------------------------------------- /lib/parseApk.js: -------------------------------------------------------------------------------- 1 | var ApkReader = require('adbkit-apkreader'); 2 | 3 | module.exports = function parseApk(apk, cb) { 4 | try { 5 | var reader = ApkReader.readFile(apk); 6 | var manifest = reader.readManifestSync(); 7 | 8 | cb(null, manifest); 9 | } catch (e) { 10 | cb(e); 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /CHANGELOG: -------------------------------------------------------------------------------- 1 | v4.0.0: 2 | changes: 3 | - "key" param is not required anymore for ChromeOS (Chrome 38+). 4 | - "--scale" option added to enable application window scaling. 5 | v3.0.0: 6 | changes: 7 | - Windows support for the CLI tool. 8 | v2.0.0: 9 | changes: 10 | - ARChon runtime. 11 | v1.0.0: 12 | changes: 13 | - Initial release. 14 | -------------------------------------------------------------------------------- /_template/_locales/en/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "appNotSupported": { 3 | "description": "Message displayed when the app is not supported.", 4 | "message": "This app is incompatible with your device. Check to make sure other Android apps work for you from the Chrome Web Store" 5 | }, 6 | "extName": { 7 | "description": "Extension name", 8 | "message": "App" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /_template/app_main.html: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # Compiled binary addons (http://nodejs.org/api/addons.html) 20 | build/Release 21 | 22 | # Dependency directory 23 | # Commenting this out is preferred by some people, see 24 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- 25 | node_modules 26 | 27 | # Users Environment Variables 28 | .lock-wscript 29 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "0.10" 4 | 5 | script: 6 | - cd .. && npm link chromeos-apk 7 | - wget https://github.com/uberspot/2048-android/archive/v1.91.zip && unzip v1.91.zip 8 | - chromeos-apk 2048-android-1.91/2048.apk -a -t 9 | - stat com.uberspot.a2048.android/vendor/chromium/crx/custom-android-release-1400197.apk 10 | - rm -rf com.uberspot.a2048.android 11 | - chromeos-apk 2048-android-1.91/2048.apk 12 | - stat com.uberspot.a2048.android/vendor/chromium/crx/custom-android-release-1400197.apk 13 | - rm -rf com.uberspot.a2048.android 14 | - chromeos-apk 2048-android-1.91/2048.apk --scale 15 | - stat com.uberspot.a2048.android/vendor/chromium/crx/custom-android-release-1400197.apk 16 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "chromeos-apk", 3 | "version": "4.0.2", 4 | "description": "Run Android APKs on Chromebooks", 5 | "main": "chromeos-apk.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "bin": { 10 | "chromeos-apk": "chromeos-apk" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "https://github.com/vladikoff/chromebook-apk-creator.git" 15 | }, 16 | "author": "Vlad Filippov", 17 | "license": "MIT", 18 | "bugs": { 19 | "url": "https://github.com/vladikoff/chromebook-apk-creator/issues" 20 | }, 21 | "homepage": "https://github.com/vladikoff/chromebook-apk-creator", 22 | "dependencies": { 23 | "adbkit-apkreader": "^1.0.0", 24 | "chalk": "^0.5.1", 25 | "commander": "^2.3.0", 26 | "ncp": "^0.6.0" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /multiple-apps.md: -------------------------------------------------------------------------------- 1 | # Running Multiple Apps 2 | 3 | 4 | ***** 5 | 6 | ~~Currently you can load up to 4 of your favorite Android applications with the official ARC runtime.~~ 7 | ~~By default the `chromeos-apk` tool replaces the Vine application and everytime you load a different app it replaces it. However you can load 3 more apps by replacing Evernote and other apps. For each extra app adjust the `"key"` value in the `manifest.json` file of that app, then use `"Load unpacked extension..."`.~~ 8 | 9 | **Chrome OS:** With Chrome 38+ you can now side load as many applications as you want. If you have older apps that 10 | were created using `chromeos-apk` tool then re-convert them or remove the `"key"` option from `manifest.json`. 11 | 12 | **Windows, Linux and OS X:** To load unlimited number of apps on you need a custom runtime, see the [ARChon runtime guide](archon.md) for details. 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Vlad Filippov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /manually-convert.md: -------------------------------------------------------------------------------- 1 | # Instructions to convert APKs manually 2 | > Use this if the command line tool (`chromeos-apk`) fails to parse work for you. 3 | 4 | ***** 5 | 6 | 7 | - Get the APK that you want to convert. Find the package name of the APK (i.e `com.soundcloud.android`, you can easily find it by looking at the URL in the Play Store). This process will not work without the proper package name. 8 | - Make a copy of the [_template](https://github.com/vladikoff/chromeos-apk/tree/master/_template) directory. Name the **new directory** `com.soundcloud.android` for instance. 9 | - Using the new directory, put the APK file into the `crx` directory, like so: [com.soundcloud.android/vendor/chromium/crx](https://github.com/vladikoff/chromeos-apk/tree/master/_template/vendor/chromium/crx) 10 | - Update the [manifest.json](https://github.com/vladikoff/chromeos-apk/blob/master/_template/manifest.json#L8) file to suite your APK file. You can also change other stuff, such as `formFactor`: (`phone` or `tablet`), `orientation`: (`landscape` or `portrait`) for tablet apps. Note: some apps may crash with `tablet` or `portrait` settings. 11 | - Now you can load the new directory and it as an unpacked extension in Chrome Extensions. 12 | 13 | ## For ARChon runtime 14 | 15 | - Remove the `"key"` parameter from `manifest.json`. 16 | -------------------------------------------------------------------------------- /_template/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "app": { 3 | "background": { 4 | "page": "app_main.html" 5 | } 6 | }, 7 | "arc_metadata": { 8 | "apkList": [ "custom-android-release-1400197.apk" ], 9 | "enableExternalDirectory": false, 10 | "formFactor": "phone", 11 | "name": "__PACKAGE__", 12 | "orientation": "portrait", 13 | "packageName": "__PACKAGE__", 14 | "useGoogleContactsSyncAdapter": false, 15 | "usePlayServices": [ "gcm" ] 16 | }, 17 | "default_locale": "en", 18 | "icons": { 19 | "128": "icon.png", 20 | "16": "icon.png" 21 | }, 22 | "import": [ { 23 | "id": "mfaihdlpglflfgpfjcifdjdjcckigekc" 24 | } ], 25 | "manifest_version": 2, 26 | "name": "__MSG_extName__", 27 | "oauth2": { 28 | "client_id": "133701689125-jj0hr4gb0ff4ulsbrn0uk2i4th946d4c.apps.googleusercontent.com", 29 | "scopes": [ ] 30 | }, 31 | "offline_enabled": true, 32 | "permissions": [ "gcm", { 33 | "socket": [ "tcp-connect", "tcp-listen", "udp-bind", "udp-send-to", "resolve-host" ] 34 | }, "unlimitedStorage", "notifications", "clipboardRead", { 35 | "fileSystem": [ "write" ] 36 | }, "https://clients2.google.com/", "videoCapture", "clipboardWrite", "identity.email", "alarms", "storage", "identity", "audioCapture" ], 37 | "requirements": { 38 | "3D": { 39 | "features": [ "webgl" ] 40 | } 41 | }, 42 | "update_url": "https://localhost", 43 | "version": "1337" 44 | } 45 | -------------------------------------------------------------------------------- /manifest.md: -------------------------------------------------------------------------------- 1 | # `manifest.json` configuration 2 | 3 | ## `arc_metadata` 4 | Raw list of possible values for `arc_metadata`: 5 | 6 | ``` 7 | "arc_metadata": { 8 | "allowEmptyActivityStack": false, 9 | "apkList": [ 10 | "custom-android-release-1400197.apk" 11 | ], 12 | "canRotate": false, 13 | "disableAutoBackButton": false, 14 | "enableAdb": false, 15 | "enableArcStrace": false, 16 | "enableExternalDirectory": false, 17 | "enableGlErrorCheck": false, 18 | "formFactor": "phone", 19 | "fpsLimit": 60, 20 | "isSlowDebugRun": false, 21 | "jdbPort": 0, 22 | "logLoadProgress": false, 23 | "minimumLaunchDelay": 0, 24 | "name": "", 25 | "ndkAbi": "", 26 | "orientation": "portrait", 27 | "packageName": "org.chromium.arc", 28 | "resize": "disabled", 29 | "shell": [], 30 | "stderrLog": "S", 31 | "useGoogleContactsSyncAdapter": false, 32 | "usePlayServices": [ 33 | "gcm" 34 | ], 35 | "sleepOnBlur": true 36 | } 37 | ``` 38 | 39 | ## `file_handlers` 40 | 41 | See https://developer.chrome.com/apps/manifest/file_handlers. 42 | This is useful for Chrome OS users. You can experiment opening files with certain Android apps by setting their file handlers. Add to `manifest.json` in your app: 43 | ``` 44 | "file_handlers": { 45 | "any": { 46 | "title": "Open with SOME_APP", 47 | "types": [ "*/*" ] 48 | } 49 | }, 50 | ``` 51 | This way your file manager will get this option: 52 | 53 | -------------------------------------------------------------------------------- /misc/ARChonLogo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 10 | 12 | 17 | 18 | -------------------------------------------------------------------------------- /chromeos-apk.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var fs = require('fs'); 3 | var readline = require('readline'); 4 | 5 | var program = require('commander'); 6 | var ncp = require('ncp').ncp; 7 | var chalk = require('chalk'); 8 | var rl = readline.createInterface(process.stdin, process.stdout); 9 | 10 | var parseApk = require('./lib/parseApk'); 11 | 12 | function success(appPath) { 13 | console.log(chalk.green('Directory "', appPath, '" created. Copy that directory onto your Chromebook and use "Load unpacked extension" to load the application.')); 14 | process.exit(0); 15 | } 16 | 17 | module.exports = function (callback) { 18 | 19 | program 20 | .version('4.0.2') 21 | .option('-t, --tablet', 'Create a tablet version') 22 | .option('-s, --scale', 'Enable application window scaling') 23 | .option('-n, --name [value]', 'Extension display name') 24 | .usage('') 25 | .parse(process.argv); 26 | 27 | var apk = program.args[0]; 28 | callback = callback || success; 29 | 30 | if (!apk) { 31 | throw new Error('Please provide a path to an APK file...'); 32 | } 33 | 34 | parseApk(apk, function (err, data) { 35 | if (err) { 36 | console.log(chalk.yellow('Failed to load APK')); 37 | } 38 | 39 | var packageName = null; 40 | 41 | try { 42 | packageName = data.package; 43 | } catch (e) { 44 | console.log(chalk.yellow('Failed to parse package name in the APK.')); 45 | } 46 | 47 | if (!packageName) { 48 | console.log(chalk.yellow('Unknown APK package.')); 49 | console.log('Please enter the package name (i.e "com.skype.raider", if you get this wrong your app will NOT work): '); 50 | rl.prompt(); 51 | rl.on('line', function (text) { 52 | text = text.trim(); 53 | 54 | if (/\.apk$/.test(text)) { 55 | console.log(chalk.red('Package names do not end with .apk')); 56 | console.log('They usually look like com.application.developer or com.website.www'); 57 | process.exit(0); 58 | } else if (text.indexOf(' ') !== -1) { 59 | console.log(chalk.red('Package names do not contain spaces')); 60 | console.log('They usually look like com.application.developer or com.website.www'); 61 | process.exit(0); 62 | } 63 | else { 64 | createExtension(text); 65 | } 66 | }) 67 | .on('close', function () { 68 | process.exit(0); 69 | }); 70 | } else { 71 | createExtension(packageName); 72 | } 73 | 74 | function createExtension(packageName) { 75 | var templatePath = path.join(__dirname, '_template'); 76 | var appPath = path.join(packageName + '.android'); 77 | 78 | // TODO: refactor this if needed in the future 79 | ncp(templatePath, appPath, function (err) { 80 | if (err) { 81 | throw err; 82 | } 83 | 84 | fs.writeFileSync(path.join(appPath, 'vendor', 'chromium', 'crx', 'custom-android-release-1400197.apk'), fs.readFileSync(apk)); 85 | 86 | var manifest = JSON.parse(fs.readFileSync(path.join(templatePath, 'manifest.json'))); 87 | var messages = JSON.parse(fs.readFileSync(path.join(templatePath, '_locales', 'en', 'messages.json'))); 88 | manifest.arc_metadata.name = packageName; 89 | manifest.arc_metadata.packageName = packageName; 90 | manifest.version = '1337'; 91 | 92 | if (program.name) { 93 | messages.extName.message = program.name; 94 | } else if (packageName) { 95 | messages.extName.message = packageName; 96 | } else { 97 | messages.extName.message = 'App'; 98 | } 99 | 100 | if (program.tablet) { 101 | manifest.arc_metadata.formFactor = 'tablet'; 102 | manifest.arc_metadata.orientation = 'landscape'; 103 | } 104 | 105 | if (program.scale) { 106 | manifest.arc_metadata.resize = 'scale'; 107 | } 108 | 109 | fs.writeFileSync(path.join(appPath, 'manifest.json'), JSON.stringify(manifest, null, 2)); 110 | fs.writeFileSync(path.join(appPath, '_locales', 'en', 'messages.json'), JSON.stringify(messages, null, 2)); 111 | 112 | // done. 113 | callback(appPath); 114 | }); 115 | } 116 | }); 117 | 118 | }; 119 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | chromeos-apk 2 | ====================== 3 | 4 | > Run Android APKs on Chrome OS, OS X, Linux and Windows. 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | ### Now supports OS X, Linux and Windows 15 | 16 | 17 | 18 | 19 | >See the [Custom ARChon runtime guide](archon.md) to run apps on other operating systems besides Chrome OS. 20 | 21 | 22 | ### [Video Demo](https://www.youtube.com/watch?v=O-yFLqp_sXs) 23 | 24 | ## Quick Demo for Chrome OS 25 | - Download an official app, [such as Evernote](https://chrome.google.com/webstore/detail/evernote/dhfolfjkgpeaojbiicgheljefkfbbfkc), from the Chrome Web Store. 26 | - Then download this open source game: [2048.APK Game](https://github.com/vladikoff/chromeos-apk/releases/download/v1.1.0/com.uberspot.a2048.android-OFFICIAL.zip) by [Uberspot](https://github.com/uberspot/2048-android) and load it as an unpacked extension. Press "Launch", ignore warnings. 27 | 28 | ## Setup for Chrome OS / App Conversion 29 | > Conversion Tool Tested on OS X, Windows and Ubuntu. You can also [convert APKs manually](manually-convert.md). 30 | 31 | - Install [a sample Android app from the Chrome Store](https://chrome.google.com/webstore/detail/kids-sight-words/inpoiemibmljfjmjmlokfdllnkjejhai) to get the runtime. Test out that app, make sure it runs on your hardware. 32 | - (Ubuntu might need `sudo apt-get install lib32stdc++6`) 33 | - Install Node.js (via http://nodejs.org/) 34 | - Install the tool (might need a `sudo` prefix): 35 | ``` 36 | npm install chromeos-apk -g 37 | ``` 38 | or 39 | 40 | ``` 41 | sudo npm install chromeos-apk -g 42 | ``` 43 | 44 | ## Usage 45 | 46 | Run 47 | `chromeos-apk [path to apk file]` 48 | 49 | ### Example phone app 50 | 51 | ``` 52 | chromeos-apk com.soundcloud.android.apk 53 | ``` 54 | 55 | #### Example tablet app 56 | 57 | ``` 58 | chromeos-apk com.soundcloud.android.apk --tablet 59 | ``` 60 | 61 | This will generate a directory for you, i.e `com.soundcloud.android`. Copy this directory to your Chromebook. 62 | On your Chromebook go to `chrome://extensions`, enable "Developer mode", and load the directory using the "Load unpacked extension" button. 63 | 64 | 65 | ## Troubleshooting 66 | 67 | Make sure Android applications are compatible with your Chromebook, first try to install an official application such as Vine: 68 | https://chrome.google.com/webstore/detail/vine/plfjlfohfjjpmmifkbcmalnmcebkklkh 69 | 70 | If you get a `Failed to parse package name in the APK.` error, then you will have to type it the proper package name for the application. You can find out the package name by looking at the URL of the app in the Play Store. 71 | 72 | ## Note 73 | 74 | **Chrome OS:** With Chrome 38+ you can now side load as many applications as you want. If you have older apps that 75 | were created using `chromeos-apk` tool then re-convert them or remove the `"key"` option from `manifest.json`. 76 | 77 | **Windows, Linux and OS X:** To load unlimited number of apps on you need a custom runtime, see the [ARChon runtime guide](archon.md) for details. 78 | 79 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 80 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 81 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 82 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 83 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 84 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 85 | SOFTWARE. 86 | 87 | ## Tested Apps 88 | 89 | Read [the manifest guide](manifest.md) to tweak applications. Android `Menu` key is accessible using `ctrl` + `ESC`. 90 | 91 | - Flipboard, Flixster, Twitter - Works. 92 | - Pandora - Works [[Screenshot](http://i.imgur.com/0d8XvXr.png)] 93 | - Yahoo Screens, Weather and Mail work in Phone mode (might need to remove `gcm` from `usePlayServices` in `manifest.json`). 94 | - Soundcloud - Works, crashes when playing sound. 95 | - Chrome, Firefox, Opera, Spotify - Crashes (require native libraries). 96 | - Opera Mini - Works, issues with the back button. 97 | - [Gyro Game](https://play.google.com/store/apps/details?id=pl.submachine.gyro&hl=en) - Works 98 | - [Break Bricks Game](https://play.google.com/store/apps/details?id=com.tongwei.blockbreaker) - Works 99 | - Swing Copters - Crashes on Google Play Services. 100 | - WhatsApp - Crashes 101 | - IMDB - Works 102 | - Skype `com.skype.raider` - Works, requires you to enter the package name manually in the CLI, use `com.skype.raider`. Use an older version of APK 5.0.0.x to get this to work. 103 | - XBMC - Crash after initial load. 104 | - Microsoft Remote Desktop - App seems to work properly after crashing once. 105 | 106 | 107 | ### Author 108 | 109 | | [![twitter/vladikoff](https://avatars3.githubusercontent.com/u/128755?s=70)](https://twitter.com/vladikoff "Follow @vladikoff on Twitter") | 110 | |---| 111 | | [@vladikoff](https://twitter.com/vladikoff) | 112 | -------------------------------------------------------------------------------- /archon.md: -------------------------------------------------------------------------------- 1 | # ARChon Custom Runtime Guide 2 | 3 | > ARChon runtime lets you run unlimited number of Android APKs created with `chromeos-apk` on Chrome OS and across any desktop platform that supports Chrome. 4 | 5 | 6 | 7 | 8 | ## Instructions 9 | 10 | 11 | **Note: This can be unstable on operating systems other than Chrome OS.** 12 | 13 | **Warning: The custom runtime will replace the official runtime component. To go back to the official runtime you will need to uninstall the custom one and reinstall the official one.** 14 | 15 | Tested on OS X, Windows 64-bit and Ubuntu. You must have Chrome 37+ installed. (If it doesn't work try Chrome Canary). 16 | 17 | - Download the runtime that is appropriate for your system: 18 | 19 | | Runtime | Download | 20 | |---|---| 21 | | ARChon 1.2 - Intel x86 **Chrome 64-bit / Chrome OS 64-bit** | [BitBucket](https://bitbucket.org/vladikoff/archon/get/v1.2-x86_64.zip) :: [Mirror](http://archon.vf.io/ARChon-v1.2-x86_64.zip) MD5:d77b468339cc512e121c003cc97715db | 22 | | ARChon 1.2 - Intel x86 **Chrome 32-bit / Chrome OS 32-bit** (Win7 32-bit: Use something like Chrome Beta 38.0.2125.77 beta-m) | [BitBucket](https://bitbucket.org/vladikoff/archon/get/v1.2-x86_32.zip) :: [Mirror](http://archon.vf.io/ARChon-v1.2-x86_32.zip) MD5:9c9844e2591a27d952098581011a2bce | 23 | | ARChon 1.2 - **ARM (i.e ARM-based Chromebooks)** | [BitBucket](https://bitbucket.org/vladikoff/archon/get/v1.2-ARM.zip) :: [Mirror](http://archon.vf.io/ARChon-v1.2-ARM.zip) MD5:3d6955c7702baf1e1d16a000d9f67b10 | 24 | 25 | 26 | - Unzip it, Load it as an unpacked extension. 27 | 28 | 29 | - (Try out this pre-packaged open source game: [2048-ARChon.APK](https://github.com/vladikoff/chromeos-apk/releases/download/v1.1.0/com.uberspot.a2048.android-ARChon-runtime.zip) by [Uberspot](https://github.com/uberspot/2048-android) and load it as an unpacked extension. Press "Launch", ignore warnings.) 30 | - To load custom applications, make sure you have `chromeos-apk@2.0.0` or higher. (Update using `npm install -g chromeos-apk@latest`). See [README.md](README.md) for more help with the `chromeos-apk` tool. 31 | - Create your custom APKs with the ARChon flag: `chromeos-apk com.imdb.mobile.apk`. 32 | This will create an app directory for you. 33 | - Load as many APKs as you want as unpacked extensions on any platform of your choice. 34 | 35 | 36 | ## Notes 37 | 38 | ### Google Play Services 39 | 40 | - See https://github.com/vladikoff/chromeos-apk/issues/66 41 | 42 | ### Load additional files 43 | 44 | - Put any additional files into `/vendor/chromium/crx/`, those would be accessible within the app environment 45 | - OBB files, one way: enable the `enableAdb` flag in `manifest.json`, `adb push // /storage/sdcard/Android/obb//` 46 | 47 | ### Convert older apps created with `chromeos-apk` tool to ARChon runtime. 48 | 49 | - Remove the `"key"` parameter from `manifest.json`. 50 | 51 | ### Uninstalling ARChon 52 | 53 | - Remove the component and all applications that depend on it from `chrome://extensions` using the "Remove" button. 54 | - Chrome OS: Reinstall an app such as Evernote to get the official runtime. 55 | 56 | ### ARChon source 57 | 58 | ARChon source is hosted here: https://bitbucket.org/vladikoff/archon/src. It's on BitBucket because GitHub has a 100mb file limit. Feel free to hack on ARChon and tweak it. 59 | 60 | ### Changing app resolution 61 | 62 | Tweak the runtime in 2 places: You need to change the tablet resolution values in these 2 places: https://bitbucket.org/vladikoff/archon/src/master/gen_main.min.js and 63 | https://bitbucket.org/vladikoff/archon/src/master/gen_index.min.js 64 | 65 | Find `tablet: {"long": 1280, "short": 800}`, tweak it, fit your resolution, reload the run time. 66 | 67 | ### Tweak Apps 68 | 69 | Add `"resize": "scale"` to `"arc_metadata"` in `manifest.json`. 70 | 71 | **How to adjust font size** 72 | 73 | 1. Modify the two files (gen_index.min.js and gen_main.min.js). 74 | 75 | 2. Search a.prototype.computeValues_. 76 | 77 | 3. Change the value of a.prototype.computeValues_. 78 | 79 | 4. Let the value c double. Just like the following codes. 80 | ```JavaScript 81 | a.prototype.computeValues_ = function (a) { 82 | var c = 2*window.devicePixelRatio / getCurrentZoom() 83 | ..... 84 | } 85 | ``` 86 | Read [the manifest guide](manifest.md) for more advanced tweaks. 87 | 88 | ### Older downloads 89 | > These are downloads for previous versions of ARChon 90 | 91 | | Runtime | Download | 92 | |---|---| 93 | | ARChon 1.1 - Intel x86 **Chrome 64-bit / Chrome OS 64-bit** (OSX: Use this in Chrome Canary) | [BitBucket](https://bitbucket.org/vladikoff/archon/get/v1.1-x86_64.zip) :: [GitHub](https://github.com/vladikoff/chromeos-apk/releases/download/v3.0.0/ARChon-v1.1-x86_64.zip) MD5:d409801cac97cdff9ea6aad468ddc927 | 94 | | ARChon 1.1.1 - Intel x86 **Chrome 32-bit / Chrome OS 32-bit** (OSX: Use this in Chrome Stable) (Win7 32-bit: Use something like Chrome Beta 38.0.2125.77 beta-m) | [BitBucket](https://bitbucket.org/vladikoff/archon/get/v1.1.1-x86_32.zip) :: [GitHub](https://github.com/vladikoff/chromeos-apk/releases/download/v3.0.0/ARChon-v1.1.1-x86_32.zip) MD5:5780637446ba941bd2969756f56f9671 | 95 | | ARChon 1.1 - **ARM (i.e ARM-based Chromebooks)** | [BitBucket](https://bitbucket.org/vladikoff/archon/get/v1.1-ARM.zip) :: [GitHub](https://github.com/vladikoff/chromeos-apk/releases/download/v3.0.0/ARChon-v1.1-ARM.zip) MD5:d0a69d822399545ff67292b50f8c4047 | 96 | | ARChon 1.0 - Intel x86 64-bit | [BitBucket](https://bitbucket.org/vladikoff/archon/get/v1.0.zip) MD5:3bd2e6014a0cba0b1ee3c69462a9b46d | 97 | | ARChon 1.1 - Intel x86 **Chrome 32-bit / Chrome OS 32-bit** (OSX: Use this in Chrome Stable) | [BitBucket](https://bitbucket.org/vladikoff/archon/get/v1.1-x86_32.zip) :: [GitHub](https://github.com/vladikoff/chromeos-apk/releases/download/v3.0.0/ARChon-v1.1-x86_32.zip) MD5:873c4d116eabd1a5ebedec65d11d6d8a | 98 | --------------------------------------------------------------------------------