Disclaimer: Try this only at your own risk and if you understand what your doing. Modifying files in the system partition might hurt your phones function and even make it inoperable (bricked). I will in no way be held responsible if you damage your phone or your data trying to follow my modifications.
Inspired by CharaNalaar hack on reddit, I tried to enable Google Daydream on the Honor 8. Based on what I read about the Honor 8s hardware capabilties it should be halfway "Daydream ready" and the software requirements should be met when runnig nougat.
Using adb shell I checked for the neccesary files in /system/etc/permissions and found they were missing. So I created them and put them in place using adb shell with system mounted rw.
The 3 files (also attached for your convenience) are:
handheld_core_hardware.xml
Code:
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2014 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<permissions>
<feature name="android.software.vr.mode" />
<feature name="android.hardware.vr.high_performance" />
</permissions>
android.software.vr.mode.xml
Code:
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2014 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<permissions>
<feature name="android.software.vr.mode"/>
</permissions>
android.hardware.vr.high_performance.xml
Code:
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2014 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<permissions>
<feature name="android.hardware.vr.high_performance"/>
</permissions>
After a reboot I opened Playstore and searched for Daydream. For a start I installed the apps:
Google VR Services
Daydream
Daydream Keyboard
I started the Daydream app and it worked. Before the hack I couldn't even find it in Playstore. When I had it installed via apkmirror it would complain that my phone was not compatible and also not find the controller (I use the Google Daydream View).
My phone is on FRD-L09C432B380 firmware, with unlocked bootloader, TWRP 3.1.0, phh root and jRummys busybox. I cannot tell if the hack will be successfull on any other platform.
Good luck and have fun if you're trying this.
BTW, if someone is willing and able to put this into a TWRP-flashable ZIP, feel free to do so...
Christian
Can you help me
Step by step i have the same device honor 8 frd lo9
Related
After almost a week of beating my nook into submission, I think it's time to get a public thread started to solve the Market and Gapps issues that are preventing us from having a "full tablet experience" on the Nook Color.
My hope is that some folks from other projects (Nookie, Nooter, Honeycomb, etc) may be able to contribute to this solution, given their experiences in getting these apps up and running in those environments.
I have chosen XDA as the platform for this discussion for several reasons. First of all, I'm not big on all the IRC drama I own a company that deserves my attention more than participating in all of that bullsh*t. Second, I feel that having this discussion in the public forum (where google and other sites may link to this content) is the "right thing." And finally, I don't see any reason to keep this discussion private. I see no reason not to invite the whole XDA community to participate. I have only held this information back thus far because I kept thinking that the ultimate solution was only a couple of hours away. I have since realized that this is a sort of catch-22, and someone else may have already solved this on another device.
NOTE - If any of my information is correct, please feel free to post a reply and I will amend this post accordingly.
The Problem...
Gapps is closed source. While we can observe quite a bit from the "outside" point of view, there are still some things we can't directly examine (ie. we lack the source code.)
My understanding (after days of looking at this) is somewhere along the path to Market 2.x, Google has changed the authentication token / validation mechanism / certificates by which Google identifies the account(s) used to interact with the market. In 1.x, logging into other Gapps (Gmail, YouTube, etc) is enough to initialize this mechanism in such a way that Market "just works." There are still some issues to overcome here (see below), but 1.x works now (for the most part.)
2.x relies on SetupWizard.apk to run and grab authentication tokens as part of the "initial setup" process on the device. On first boot, SetupWizard.apk is set as your "home" app, and given a higher priority than the default launcher. It locks out certain actions (home button) so that the user must complete the process in order to satisfy SetupWizard and make the device usable. On the Nook Color, SetupWizard glitches out and cannot be completed.
Keep in mind the fact that everything prior to Honeycomb was designed to run on phones. Android handsets are not properly provisioned until the Google account and phone are bound together. If they allowed the user to easily bypass SetupWizard, the phone would be stuck in a partially-working state. This makes for very unhappy customers - no Gmail, no Market, no YouTube, you get the idea...
Gapps architecture and functional requirements
The entire Gapps suite exploits the UID and Permissions mechanisms to allow inter-application access to authentication tokens and account-related data. When Android scans apps in /system/app, it examines the AndroidManifest.xml file inside of each APK, and sets entries in /data/system/packages.xml to establish the UID and permissions required by each application. This is a standard practice in Android security - as it is the only way for an application to notify the Android system of its requirements.
A typical packages.xml entry for Vending.apk looks something like this:
Code:
<updated-package name="com.android.vending" codePath="/system/app/Vending.apk" ts="1217592000000" version="1820" userId="10031">
<perms>
<item name="com.google.android.googleapps.permission.GOOGLE_AUTH.sierraqa" />
<item name="com.google.android.googleapps.permission.GOOGLE_AUTH.android" />
<item name="android.permission.DELETE_PACKAGES" />
<item name="android.permission.WRITE_EXTERNAL_STORAGE" />
<item name="com.google.android.googleapps.permission.GOOGLE_AUTH.androidsecure" />
<item name="com.google.android.gtalkservice.permission.SEND_HEARTBEAT" />
<item name="android.permission.ACCESS_DOWNLOAD_MANAGER_ADVANCED" />
<item name="android.permission.GET_ACCOUNTS" />
<item name="android.permission.CLEAR_APP_CACHE" />
<item name="com.google.android.googleapps.permission.GOOGLE_AUTH" />
<item name="android.permission.READ_PHONE_STATE" />
<item name="com.google.android.googleapps.permission.GOOGLE_AUTH.sierrasandbox" />
<item name="android.permission.MANAGE_ACCOUNTS" />
<item name="android.permission.ACCESS_DOWNLOAD_MANAGER" />
<item name="android.permission.GET_PACKAGE_SIZE" />
<item name="android.permission.WAKE_LOCK" />
<item name="android.permission.ACCESS_NETWORK_STATE" />
<item name="com.google.android.gtalkservice.permission.GTALK_SERVICE" />
<item name="android.permission.INSTALL_PACKAGES" />
<item name="android.permission.USE_CREDENTIALS" />
<item name="android.permission.ACCESS_CHECKIN_PROPERTIES" />
<item name="com.google.android.c2dm.permission.RECEIVE" />
<item name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<item name="android.permission.INTERNET" />
<item name="android.permission.READ_SYNC_SETTINGS" />
<item name="com.google.android.googleapps.permission.GOOGLE_AUTH.sierra" />
<item name="android.permission.CHANGE_NETWORK_STATE" />
</perms>
</updated-package>
NOTE - the userId and permissions must match the other Gapps or Vending.apk fails to work and/or crashes regularly
Getting 1.x to work
There are three major problem with Market 1.x on the Nook Color:
1) Since SetupWizard is never run, the provisioning / authentication mechanisms are never initialized in the normal way. Workarounds exist to initialize account settings through other apps (YouTube, Gmail, etc) Once this is done, Market has enough information about your accounts to establish your identity and allow your to download apps.
2) Force closes in Market 1.x are due to incorrect permissions and/or UID settings in packages.xml. In these cases, logcat reveals that Vending.apk has insufficient permissions to write to common Gapps settings:
E/AndroidRuntime( 1800): java.lang.SecurityException: Permission Denial: writing com.google.android.gsf.settings.GoogleSettingsProv ider uri content://com.google.settings/partner from pid=1800, uid=10027 requires com.google.android.providers.settings.permission.WRITE_GSETTINGS
In this case, either UID 10027 does not match the rest of the Gapps, or the packages.xml entries related to com.google.vending do not contain the usual set of Gapps permissions. fix_permissions.sh scripts (and other things that reinstall apks via "pm") can fix this, but this is a hack at best.
3) The "missing apps" problem stems from two causes: a) The device fingerprint and/or screen resolution defined in Vending.apk/AndroidManafest.xml do not match the device (or a significant number of apps.) b) (SPECULATION) Certain bits in com.google.android.gsf.settings are created by logging into other Gapps, but this does not totally satisfy Vending.apk calls to obtain authentication tokens and/or certificates. Wiping Google Services Framework seems to clear this enough so that Vending.apk regenerates whatever it needs to proceed with full market access.
Problems with 2.x
2.x presents an even bigger challenge. When Google changed the APKs around, Vending 2.x became more reliant on SetupWizard. While existing token work-arounds seem to enable rudimentary access to the market, SetupWizard seems to be the only way to populate the required certificates that Vending.apk requires to validate the signature on APKs downloaded from the market.
This is not a systemic issue with Android (pm and adb installs work fine - this eliminates PakageManager and anything B&N may have monkeyed with), nor is it something that B&N has altered to block market installs outside of Vending.apk. In fact, they were quite generous to leave pm in place.
This Vending.apk signature validation failure is visislbe in logcat, and very clearly shows what is (not) happening.
I/vending ( 1087): [30] DownloadManagerBroadcastReceiver.installFromUri(): Could not verify APK signature.
D/vending ( 1087): [30] DownloadManagerBroadcastReceiver.installFromUri(): dFCIpo0aSlPNdcGmfdWMKBZ4E8g#1456950
At first I had a really hard time finding any information on this error. Google shows post after post about the Nook Color, and little else. At first, I thought B&N was intercepting intents somehow and enforcing their own signature check. It turns out that they have nothing to do with it, and Vending.apk is to blame.
Decoded 2.x Vending.apk reveals the problem:
smali/com/android/vending/DownloadManagerBroadcastReceiver.smali:
.method protected installFromUri(Landroid/content/Context;Landroid/net/Uri;Landroid/net/Uri;Lcom/android/vending/model/LocalAsset;Ljava/lang/String;ZLjava/lang/StringV
...
const-string v5, "Calling install uri=%s src=%s asset=%s name=%s last=%B"
...
const-string v5, "Could not verify APK signature."
So in other words.... Vending.apk is unable to validate the signature. Why? Because it has no certificates. You can log in and see apps, but you can't install them via the Market. They download, but the call to installFromUri fails.
So... We have a few options from here....
1) Hack Vending.apk to disable signature checks
2) Hack (or somehow enable) SetupWizard.apk to complete the process of setting up Google Accounts
3) Complete SetupWizard.apk outside of the Nook and install a "template" setup that will enable Vending.apk to function normally.
4) Work around this with some hack (ie. a cron or daemon that watches /cache/download(null) and installs packages via pm)
I welcome any suggestions or additional information on how to get this working. Perhaps someone who has worked on a related Nook Color rom could shed some light on how we can get SetupWizard to do its job. Normally, the whole thing is done on first-boot, and never needs to be revisited. If there's some simple work-around (ie. copy certs to somewhere in /data/data) then by all means share it!
EDIT
Just to avoid frustration and duplicate (failed) attempts to push newer Vending.apk or Gapps packages over what is already there...
Here are some things that DON'T work:
* Installing old versions of Gapps (with working SetupWizard.apk), then re-writing newer versions. Same error with Vending, other apps like Gmail work perfectly - Vending works, but APKs won't pass the signature check.
* Installing Gapps packages from other ROMs (Nookie, Archos, etc) - same problem with signatures
* Installing hacks and Gapps signed with test-keys
* Attempting to defeat signature checks via setprop (setprop vending.disable_ssl_cert_check TRUE) - this appears to be deprecated.
* Decoding and re-packaging Vending.apk to bypass (or unconditionally allow) failed signatures (this may still be possible, as there are many approaches to doing this.)
* All of the above while wiping /data/dalvik-cache, /data/data/com.android.vending, /data/data/com.android.packageinstaller, /data/data/com.android.vending.updater, /data/data/com.android.*, /data/data/com.google.*
* All of the above while wiping cache and app data via NookColorTools
Things I have not tried - if you are technically adept enough to try these, feel free - all are viable options:
* Copying SetupWizard-generated stuff in /data/data from similar Froyo rom (CM7, Nookie, etc)
* Dual Boot (SD Card, whatever) install that runs SetupWizard.apk results to /data/data/
* Intercepting the intent to install the downloaded apk and bypass the normal procedure in Vending.apk
* Further research into how Vending.apk may be altered to skip the signature check
* Getting SetupWizard.apk to behave (and complete the setup process the right way.)
Last but not least....
Perhaps we have this whole thing backwards. It may actually be easier to invert this solution, and move B&N bits into a "normal" FroYo environment. As far as identifying the required parts, there are only a handful of non-Linux bits that make the Nook Color what it is. B&N seems to have added few new APKs, a certificate, and some UI resources, rather than stepping all over stock android ones. The fact that one can run Gapps at all is testament to this. Is anyone looking into this? It may actually be the best of both worlds.
Now I think I'm going to go on an Red Bull and Vodka-fueled bender - thanks so much to all who have donated to *that* cause.
Reserved for updates
I don't know if this thread about AdroidID for gapps is related and it maybe totally different, just hope we get a good information on gapps and market problem from there
http://forum.xda-developers.com/showthread.php?t=955847
Hi everyone,
I've created a GO SMS Pro theme using their webtool,
but it appears to have yet to implement various common aspects of functionality. I want to be able to modify the AndroidManifest.xml file myself, primarily to add Airpush (the presence of which I let people know of from the beginning), but the formatting is quite garbled. I'm guessing this may be due to the localization to Chinese that the Google Play developer console reports. Does anyone have a functional, readily editable version in English with all the required information for a GO SMS Pro Theme? I want to be assured I have all the required information, rather than hacking together another xml file with Eclipse. I figured I'd install the Chinese language on my computer, but it appears Microsoft did not include such functionality in Windows 7 Premium (64-bit). I've download other GO SMS Pro themes with Airpush, figuring I could use their AndroidManifest.xml and mail.xml files as templates, but found the same formatting / editability issue. Thank you for your help!
I've since found kantbstopped519's post at the end of page 3 in the following thread: http://forum.xda-developers.com/showthread.php?t=1125626&page=3
and used what was posted:
<?xml version="1.0" encoding="UTF-8"?>
<manifest android:versionCode="5" android:versionName="1.0" android:installLocation="auto" package="com.jb.gosms.theme.kxnt.dark"
xmlns:android="http://schemas.android.com/apk/res/android">
<application android:label="@string/app_name" android:icon="@drawable/jb_smsmms">
<activity android:theme="@android:style/Theme.Dialog" android:label="@string/app_name_desc" android:name=".GoSmsInstallDialog" android:excludeFromRecents="true" android:launchMode="singleInstance">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.INFO" />
</intent-filter>
<intent-filter>
<action android:name="com.jb.mms.theme.others" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="4" />
</manifest>
Click to expand...
Click to collapse
It appears this functioned for kantbstopped519.
I used this as a template (made no additions of Airpush or anything such) and made the supposedly appropriate changes, also changing anything referencing @string to plain text directly in AndroidManifest.xml. Now I'm getting that informative "The server could not process your apk. Try again."
I've been making various changes, deletions, and resigning after each change, to repeatedly the same message. Only re-adding my original garbled-de-goop AndroidManifest.xml file and resigning has thus far resulted in a successful processing upon upload. Could this have something to do with the resources.arsc and/or classes.dex files in the root of the apk?
If the APK is already compiled then you will need to decompile it with apktool to get the XML readable.
After trying to enable OTG support following these instructions:
To enable USB host API support you should add a file named
android.hardware.usb.host.xml and containing the following lines:
<permissions>
<feature name="android.hardware.usb.host"/>
</permissions>
into folder
/system/etc/permissions
in that folder find file named
handheld_core_hardware.xml or tablet_core_hardware.xml
and add
<feature name="android.hardware.usb.host" />
into <permissions> section.
Reboot your device. Usb host api should work.
I ended up with my device constantly giving the message "Unfortunately, system UI has stopped". Could this be a hardware damage or just I messed up with the OS ? I would appreciate any possible solutions.
[Appjolt] Get money from uninstalls
Hello everybody, I just found a system allow you earn money from uninstalls, this is Appjolt, show advertisements when user uninstall your app. Sound’s good, right? I will guide you in detail:
1. Register your account with this link:
https://admin.appjolt.com/Landings/Monetize?rf=6F/+V7zzEdpJM73Iydu0EQ==
You will have 50$ in your account. The minium money to withdraw is 100$. You can use your paypal or bank account.
2. Download SDK in Android SDK or iOs SDK, it has unity plugin for android and ios, just 200kb
3. In Applications, click +Add Application
4. After submited your app, click +Add Campain to creat a campain (4 type):
- Monetize: show advertisements
- Winback: offer the user to re-install your app and win a prize (gem, gold, virtual item or something real)
- Cross Promote: present your another app
- Survey: asking the user why they are uninstalling your app
5. Analyze uninstall: mixpanel, omniata, appsee, coolaData
Example with Mixpanel, you register an Mixpanel account and copy the Token and paste to appjolt
6. Import Appjolt plugin to your unity game
- The first step of the integration is to import the appjolt Unity package. To do so, simply drag and drop Appjolt.unitypackage into the assets folder of your project in the Unity editor, and the following window will come up, Make sure all the resources are selected and press import:
- The next step is to add a GameObject to any scene that will integrated with Appjolt. To do so, create a new GameObject in the root of the scene’s hierarchy and rename it to “Appjolt”. Next, add an existing script component to the new Appjolt GameObject, select the AppjoltUnity.cs
script from your scripts. Your scene editor should then be configured to and look similar to the following screenshot:
Now, whenever you’ll need to call Appjolt in a Unity scene, to access the SDK’s main object, use the following code:
appjoltUnity = GameObject.Find ("Appjolt").GetComponent<AppjoltUnity> ();
That’s it. Your project’s now set up with Appjolt, now all that’s left is to implement specific
features.
End User License Agreement
(EULA)
We find great importance being in compliance with Google Play Developer Program Policies
If you are operating within Google's Play store and interacting with ads out of your application, it requires the user's consent in a form of an EULA. In the context of our service, if you're using Monetize or Ad
-Based Winback/Cross
-Promotion campaigns, please add the following code to your main menu or splash screen:
if (appjoltUnity.isGooglePlayInstall()) {
appjoltUnity.showEULA();
}
- Android manifest:
<!-- Appjolt - Required -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- Appjolt - Highly Recommended (Guaranteed $10 CPM US)-->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
Trong tag <Application>
<!-- Appjolt -->
<!-- Appjolt Activity -->
<activity android:name="com.appjolt.sdk.AppjoltActivity"
android:taskAffinity="com.appjolt.sdk.twentyeight"
android:configChanges="orientation|keyboardHidden|screenSize"
android:hardwareAccelerated="false"/>
<!-- Appjolt Service -->
<service
android:name="com.appjolt.sdk.AppjoltService"
android:enabled="true"
androidrocess=":appjolt"
android:exported="true" />
<!-- Appjolt BOOT receiver -->
<receiver
android:name="com.appjolt.sdk.AppjoltReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
</intent-filter>
</receiver>
So simple. And now, lets earn money from the huge uninstall.
Cheers,
==================
MSIXHERO
==================
Spoiler: WHAT IS IT?
Msixhero Is an Open Source MSIX Package Manager.
About - MSIX Hero
About MSIX Hero - the ultimate, freeware toolkit and a must-have utility for every MSIX packagers and system administrator.
msixhero.net
Spoiler: WHAT IS AN MSIX PACKAGE MANAGER?
This is a tool that will allow you to be able to create, pack, and sign your own MSIX bundles.
You could also use this tool to Edit an Existing Package like the android subsystem or any other app.
We will use WSA in this example~!
I am putting this up now so we can learn the commands to edit the MSIX bundle, windows subsystem for android,
in CLI~!
I will update when I figure out how to unpack and edit wsa using this tool~!
Peace and Love
<3
Spoiler: COMMAND LINE INTERFACE REFERENCE
Spoiler: SIGN
Signs one or more MSIX packages.
Spoiler: PARAMETERS
Spoiler: STOREMACHINE
--sm (as in StoreMachine)
Specifies that a machine store, instead of a user store, is used. This is a boolean switch, it does not have to be followed by any value. If omitted, the certificate will be looked up in the machine store. This switch makes only sense when combined with --sha1 value.
Spoiler: SHA1
--sha1 <thumbprint>
Selects the certificate based on its thumbprint value. May not be combined with –file.
Spoiler: FILE
--file <pfx-file>
The full path to PFX file used for signing. May not be combined with --sha1.
Spoiler: PASSWORD
--password <password>
Specifies the password for the selected PFX file. May not be combined with --sha1, requires that –file switch is used.
Spoiler: TIMESTAMP
--timestamp <timestamp-url>
The timestamp URL. Ensures that the package will be still signed, even if the original certificate is expired.
Spoiler: INCREASEVERSION
--increaseVersion Major|Minor|Build|Revision|None
Specifies, that the package version should be automatically increased by one when signing. By providing the value, you may choose which component should be increased. The default value (used when no switch is present) is None which means that the package version will stay the same after signing.
Spoiler: NOPUBLISHERUPDATE
--noPublisherUpdate
Prevents MSIX Hero from updating the publisher name. By default, the publisher name is taken from the certificate subject – both of them must be the same for the signing to succeed. If you want to control the publisher name on your own or have a granular error reporting in case of mismatches, use this switch. In case of a mismatch, an error will be reported.
Spoiler: DG
--dg (as in Device Guard)
Specifies that Device Guard Signing is to be used. The login will be performed interactively, that is in a pop-window that will be spawned after executing the command. This option should not be used for silent, unattended signing, because it will wait for a dialog to be confirmed by the user. This switch must not be combined with –dgf.
Spoiler: DGF
--dgf <file-path> (as in Device Guard File)
Specifies that Device Guard Signing is to be used. The JSON file path must contain valid access and refresh token, which you should create on your own using the technique outlined here: https://docs.microsoft.com/en-us/wi...ce-guard-signing#get-an-azure-ad-access-token. This switch must not be combined with –dg.
Spoiler: DGVL
--dgv1 (as in Device Guard V1)
Specifies that the DGSS v1 API will be used. Usage of V1 is not recommended because the API is obsolete and will be deprecated soon. This switch must be used together with –dg or –dgf.
Spoiler: DGP
--dgp <publisher-name> (as in Device Guard Publisher)
Specifies the name (publisher name) used for signing. If this parameter is omitted, MSIX Hero will determine the name for you. This option is recommended if you know the name, because signing without this switch requires an extra round trip to AzureAD and making a test signing. If this switch is used, you should make sure that the value matches the actual certificate subject, otherwise an error will be returned. This switch must be used together with –dg or –dgf. This switch has no effect if --noPublisherUpdate is used.
Signing an MSIX package (sign) - MSIX Hero
This article is about the usage of command line interface. More information about CLI usage and how to get started can be found here: Command…
msixhero.net
Spoiler: PACK
Packs a folder of files, containing a manifest and creates MSIX package out of it.
Spoiler: PARAMETERS
Spoiler: NC
–nc (as in NoCompression)
Disables package compression. This is a boolean switch, it does not have to be followed by any value. If omitted, the package is going to be compressed using the default compression algorithm.
Spoiler: NV
–nv (as in NoValidation)
Disables the semantic validation. This is a boolean switch, it does not have to be followed by any value. If omitted, the package will not be validated for the full correctness of the manifest file. Using this switch is not recommended.
Creating an MSIX from a directory (pack) - MSIX Hero
This article is about the usage of command line interface. More information about CLI usage and how to get started can be found here: Command…
msixhero.net
Spoiler: UNPACK
Unpacks an MSIX package to the specified folder.
Spoiler: EXAMPLE
MSIXHeroCLI.exe unpack --package <path-to-package.msix> --directory <extraction-path>
Unpacking a package (unpack) - MSIX Hero
This article is about the usage of command line interface. More information about CLI usage and how to get started can be found here: Command…
msixhero.net
Spoiler: NEWCERT
Creates a new certificate for package signing (self-signed)
Spoiler: PARAMETERS
Spoiler: IMPORT
–import (-i)
If defined, the new certificate will be automatically imported to the Trusted People store. You must run MSIX Hero as an administrator in order to be able to use this switch. Otherwise, access denied error will be returned when trying to import the certificate.
Spoiler: VALIDUNTIL
–validUntil
The expiration date (in a format returned by default by Get-Date cmdlet). If not provided, one-year validity period will be used. Note that this option has been available since MSIX Hero 1.4.3.
Creating a new certificate for signing (newcert) - MSIX Hero
This article is about the usage of command line interface. More information about CLI usage and how to get started can be found here: Command…
msixhero.net
Spoiler: TRUST
Imports a selected certificate (.cer/.pfx) or imports a certificate from a selected MSIX package to the Trusted People store.
Trusting a publisher (trust) - MSIX Hero
This article is about the usage of command line interface. More information about CLI usage and how to get started can be found here: Command…
msixhero.net
Spoiler: APPATTACH
Creates VHD file from a selected MSIX package (for MSIX app attach).
Spoiler: PARAMETERS
Spoiler: CREATESCRIPTS
–createScripts (shorthand -c)
When defined, sample scripts for app attach (registering, staging, de-staging and de-registering) will be created and saved together in the directory, specified by the --directory (-d) switch. Four scripts will be created: stage.ps1, register.ps1, deregister.ps1 and destage.ps1.
Spoiler: FILETYPE
–fileType <vhd|vhdx|cim>
Declares the output format. The default value is VHD. This parameter is available in MSIX Hero 2.2 and newer.
Spoiler: EXTRACTCERT
–extractCert (shorthand -e)
When defined, the digital certificate will be extracted from the MSIX package and put in the directory, specified by the --directory (-d) switch. The name of the file will be the same as the name of the MSIX file or as the value of the optional parameter --name (-n).
Spoiler: SIZE
–size <#> (shorthand -s <#>)
Specifies the maximum dynamic size of VHD disk. If not set, MSIX Hero uses an optimal size, which ensures that the package fits and has a reasonable buffer. The size specified by this parameter should be expressed in megabytes. If you provide a value lower than the total size of expanded files, an error will be returned.
Spoiler: NAME
–name <X> (shorthand -n <X>)
By default, the names of the VHD file and the extracted certificate file (if switch --extractCert or -e was used) are equal to the name of the MSIX package. By providing this optional parameter you can choose the name you want.
Creating VHD for MSIX app attach (appattach) - MSIX Hero
This article is about the usage of command line interface. More information about CLI usage and how to get started can be found here: Command…
msixhero.net
Spoiler: EDIT
Edits a package specified by the first argument.
Creates a new modification package.
Spoiler: PARAMETERS
Spoiler: PACKAGENAME
--packageName
The new package name. This must be a valid value, according to MSIX requirements.
Spoiler: PUBLISHER
--publisher
The new publisher name. This must be a valid DN string, for example CN=User, DN=domain, DN=local. Because the value may contain spaces, you should always enclose it with double quotes.
Spoiler: PACKAGEVERSION
--packageVersion <new-package-version-or-update-pattern>
The new package version, either as a full version string (for example 1.2.3.4) or a literal tag auto, which will increase the current version on its fourth position (for example, changing current version 1.2.3.4 to 1.2.3.5), or a pattern used to adapt the current package version. In the latter case, use * or x to take over the current value, and + or ^ to increase the current value by one. For example, using the following pattern *.*.+.0 would keep the major and minor version from the current value, increase the third position by one, and reset the fourth position to 0.
Spoiler: PROCESSORARCHITECTURE
--processorArchitecture <new-processor-architecture>
The new processor architecture, for example neutral or x64. This must be a valid value, according to MSIX requirements.
Spoiler: RESOURCEID
--resourceId <new-resource-id>
The new resource ID. This must be a valid value, according to MSIX requirements.
Editing a package (edit) - MSIX Hero
This article is about the usage of command line interface. More information about CLI usage and how to get started can be found here: Command…
msixhero.net
Spoiler: NEWMODPACK
Spoiler: PARAMETERS
Spoiler: REGISTRY
–registry
Specifies the full path to a Windows Registry (.reg) file with extra registry keys and values that will be written to the new modification package.
Spoiler: FOLDER
–folder
Full path to a folder with files and subfolders that will be added to the root folder of the new modification package.
Spoiler: COPYFOLDERSTRUCTURE
–copyFolderStructure
This option is only valid if the parameter –parentPath is used AND the output path does not have .msix extension. If the parameter is present, MSIX Hero extracts the structure of VFS folder from the parent package and put it as a placeholder in a place relative to the newly created AppxManifest.xml.
Creating an MSIX Modification Package (newmodpack) - MSIX Hero
This article is about the usage of command line interface. More information about CLI usage and how to get started can be found here: Command…
msixhero.net
Spoiler: DOCUMENTATION
Spoiler: CREATING VHD FOR MSIX APP ATTACH
Creating VHD for MSIX app attach - MSIX Hero
Learn how to create VHD files for the purpose of WVD MSIX app attach with a freeware tool MSIX Hero, a must-have utility for MSIX packagers and administrators.
msixhero.net
Spoiler: SIGNING MSIX PACKAGES
How to sign MSIX packages? - MSIX Hero
Signing MSIX packages is easy with MSIX Hero. Just select a certificate (store or PFX) and let the program sign the app + adjust the manifest.
msixhero.net
Spoiler: SIGNING MSIX PACKAGES WITH DEVICE GUARD
Signing MSIX packages with Device Guard - MSIX Hero
MSIX Hero 1.5.0 can sign packages with Device Guard Signing Service. According to Microsoft: Device Guard signing is a Device Guard feature that is available in…
msixhero.net
Spoiler: VIEWING VIRTUAL REGISTRY KEYS FROM AN MSIX APP
Viewing virtual registry keys from an MSIX app - MSIX Hero
MSIX Hero mounts the registry file in order to make it browsable. Alternatively, start regedit in the package context to see the merged registry.
msixhero.net
Spoiler: PUBLISHING WINGET AND EDITING YAML FILES
Publishing to winget with MSIX Hero – Marcin Otorowski
marcinotorowski.com
Spoiler: UPDATE PACKAGES INSTALLED VIA APPINSTALLER FILE
Update packages installed via appinstaller file - MSIX Hero
What is app installer? App installer files (https://docs.microsoft.com/en-us/windows/msix/app-installer/app-installer-root) are a handy technique of a single-click installation of MSIX packages from any source (local, web), at…
msixhero.net
Spoiler: CREATING CERTIFICATE FOR MSIX SIGNING
Creating certificate for MSIX signing - MSIX Hero
Introduction to code signing All Windows 10 packages must be digitally signed so that they can be deployed. The process of signing requires, that the…
msixhero.net
A resource for gathering the Microsoft Store Application's MSIX Bundle, For Editing
https://store.rg-adguard.net/
Just paste in the store link, like for instance , if you want WSA's MSIX Bundle,
Get Windows Subsystem for Android™ with Amazon Appstore from the Microsoft Store
Windows Subsystem for Android™
www.microsoft.com
You would copy the link above, or your preffered app, then paste it on store.rg-adguard.net
Then, scroll all the way to the end of the list to extract the MSIX file...
Spoiler: MAKE A WORK FOLDER
For this case, we will go into C:\ and make a new folder called WSAMOD
We will add a folder called APP, and a Folder called UNPACK
Spoiler: LIKE THIS
{
"lightbox_close": "Close",
"lightbox_next": "Next",
"lightbox_previous": "Previous",
"lightbox_error": "The requested content cannot be loaded. Please try again later.",
"lightbox_start_slideshow": "Start slideshow",
"lightbox_stop_slideshow": "Stop slideshow",
"lightbox_full_screen": "Full screen",
"lightbox_thumbnails": "Thumbnails",
"lightbox_download": "Download",
"lightbox_share": "Share",
"lightbox_zoom": "Zoom",
"lightbox_new_window": "New window",
"lightbox_toggle_sidebar": "Toggle sidebar"
}
Then paste your MSIX package into the APP folder
Spoiler: LIKE THIS
Spoiler: LASTLY, EXTRACT THE MSIX BUNDLE WITH 7ZIP
IT WILL LOOK LIKE THIS
Spoiler: WHAT ARE WE LOOKING FOR?
DO NOT DECOMPILE FURTHER~! THIS IS JUST TO SHOW YOU WHAT'S IN THIS FILE
Spoiler: WHAT'S IN IT?
Spoiler: HERE'S THE APPXMANIFEST
Interesting~!
XML:
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:uap5="http://schemas.microsoft.com/appx/manifest/uap/windows10/5" xmlns:desktop8="http://schemas.microsoft.com/appx/manifest/desktop/windows10/8" xmlns:build="http://schemas.microsoft.com/developer/appx/2015/build" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3" xmlns:uap4="http://schemas.microsoft.com/appx/manifest/uap/windows10/4" xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10" xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10" xmlns:desktop2="http://schemas.microsoft.com/appx/manifest/desktop/windows10/2" xmlns:desktop6="http://schemas.microsoft.com/appx/manifest/desktop/windows10/6" xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" xmlns:com="http://schemas.microsoft.com/appx/manifest/com/windows10" xmlns:com2="http://schemas.microsoft.com/appx/manifest/com/windows10/2" xmlns:com3="http://schemas.microsoft.com/appx/manifest/com/windows10/3" IgnorableNamespaces="uap uap3 uap4 uap10 desktop desktop2 desktop6 rescap com com2 com3 desktop8 build">
<Identity Name="MicrosoftCorporationII.WindowsSubsystemForAndroid" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" Version="1.8.32838.0" ProcessorArchitecture="x64" />
<Properties>
<DisplayName>ms-resource:WsaDisplayName</DisplayName>
<PublisherDisplayName>Microsoft Corp.</PublisherDisplayName>
<Logo>Images\StoreLogo.png</Logo>
<desktop6:FileSystemWriteVirtualization>disabled</desktop6:FileSystemWriteVirtualization>
<desktop6:RegistryWriteVirtualization>disabled</desktop6:RegistryWriteVirtualization>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.22000.120" MaxVersionTested="10.0.22000.120" />
<PackageDependency Name="Microsoft.VCLibs.140.00.UWPDesktop" MinVersion="14.0.30035.0" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" />
<PackageDependency Name="Microsoft.UI.Xaml.2.6" MinVersion="2.62108.18004.0" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" />
<PackageDependency Name="Microsoft.VCLibs.140.00" MinVersion="14.0.30035.0" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" />
</Dependencies>
<Resources>
<Resource Language="EN-US" />
<Resource Language="EN-GB" />
<Resource uap:Scale="200" />
</Resources>
<Applications>
<Application Id="App" Executable="WsaClient\WsaClient.exe" EntryPoint="Windows.FullTrustApplication">
<uap:VisualElements DisplayName="ms-resource:WsaDisplayName" Description="ms-resource:WsaDescription" BackgroundColor="transparent" Square150x150Logo="Images\MedTile.png" Square44x44Logo="Images\AppList.png" AppListEntry="none">
<uap:DefaultTile Wide310x150Logo="Images\WideTile.png" Square71x71Logo="Images\SmallTile.png" Square310x310Logo="Images\LargeTile.png" />
<uap:SplashScreen Image="Images\SplashScreen.png" />
</uap:VisualElements>
<Extensions>
<desktop:Extension Category="windows.toastNotificationActivation">
<desktop:ToastNotificationActivation ToastActivatorCLSID="18AF5090-C390-45D6-9FF1-CA3E608503B0" />
</desktop:Extension>
<uap:Extension Category="windows.protocol">
<uap3:protocol Name="wsa" Parameters="/launch %1" />
</uap:Extension>
<uap:Extension Category="windows.protocol">
<uap3:protocol Name="wsa-client" Parameters="/deeplink %1" />
</uap:Extension>
<uap5:Extension Category="windows.startupTask" uap10:parameters="/restart 0">
<uap5:StartupTask TaskId="PrelaunchVirtualMachine" Enabled="false" />
</uap5:Extension>
<uap3:Extension Category="windows.appExecutionAlias">
<uap3:AppExecutionAlias>
<desktop:ExecutionAlias Alias="WsaClient.exe" />
</uap3:AppExecutionAlias>
</uap3:Extension>
<com2:Extension Category="windows.comServer">
<com2:ComServer>
<com3:ServiceServer ServiceName="WsaService" LaunchAndActivationPermission="O:SYG:SYD:(A;;11;;;IU)">
<com3:Class Id="D738F5F3-7527-4DD6-BA47-D75688104C46" DisplayName="CLSID_WsaServer" />
</com3:ServiceServer>
<com:ExeServer Executable="WsaClient\WsaClient.exe">
<com:Class Id="18AF5090-C390-45D6-9FF1-CA3E608503B0" DisplayName="CLSID_WsaToastActivator" />
<com:Class Id="df32c7a1-a920-458d-a5c5-0e627f222be9" DisplayName="CLSID_WsaWnsRefreshHandler" />
<com:Class Id="5c3e8567-7095-47c0-98e5-1d196ffcc857" DisplayName="CLSID_WsaWnsPushHandler" />
</com:ExeServer>
<com:SurrogateServer DisplayName="WslDeviceHost_VirtioFs" AppId="58AC9971-23C7-45EA-933F-7B155AA16FC2">
<com:Class Id="5a918e2f-d58a-48d9-be09-36ea1615a7f2" Path="wsldevicehost.dll" ThreadingModel="Both" />
</com:SurrogateServer>
<com:SurrogateServer DisplayName="WslDeviceHost_VirtioFsNoTelem" AppId="d5f8fb32-5694-4d90-9247-0e2bef84489d">
<com:Class Id="9ad48ff0-bd99-41a0-8d93-903239e9d617" Path="wsldevicehost.dll" ThreadingModel="Both" />
</com:SurrogateServer>
<com:SurrogateServer DisplayName="WslDeviceHost_VirtioPmem" AppId="5F30756B-EE0F-4F44-991D-0D51493AF284">
<com:Class Id="BF8A4ADD-EC57-4C12-BB29-263A2DA959B1" Path="wsldevicehost.dll" ThreadingModel="Both" />
</com:SurrogateServer>
<com:SurrogateServer DisplayName="WslDeviceHost_VirtioPmemNoTelem" AppId="a0bfe2b6-75f0-4d35-833c-b5ead384e1ac">
<com:Class Id="0d391720-9780-4575-88ff-bb89716b081f" Path="wsldevicehost.dll" ThreadingModel="Both" />
</com:SurrogateServer>
<com:ExeServer Executable="WsaClient\WsaClient.exe" LaunchAndActivationPermission="O:SYG:SYD:(A;;11;;;IU)(A;;9;;;S-1-15-2-4120862662-1149765626-4064695116-299589112-4208539117-2961988684-1460418210)S:(ML;;NX;;;ME)">
<com:Class Id="286DD941-F692-41ED-A20D-8E8AA9181B10" DisplayName="CLSID_WsaClient" />
</com:ExeServer>
<com:ExeServer Executable="WsaSettingsBroker\WsaSettingsBroker.exe" LaunchAndActivationPermission="O:SYG:SYD:(A;;11;;;IU)(A;;11;;;S-1-15-2-4120862662-1149765626-4064695116-299589112-4208539117-2961988684-1460418210)S:(ML;;NX;;;ME)">
<com:Class Id="92E5D48B-DD18-4339-884F-D6087F81E797" DisplayName="CLSID_WsaSettingsBroker" />
</com:ExeServer>
</com2:ComServer>
</com2:Extension>
<com2:Extension Category="windows.comInterface">
<com2:ComInterface>
<com:Interface Id="C6415BE5-A445-4E28-A0C8-E64B5CE27534" ProxyStubClsid="76913B52-F9EB-4FAE-8DE7-24C20BDCF37B" />
<com:Interface Id="5B40E367-7419-4130-A4F2-A7C5B02DC9A5" ProxyStubClsid="76913B52-F9EB-4FAE-8DE7-24C20BDCF37B" />
<com:Interface Id="6A0E8133-9C70-4193-821F-A6FF231D5665" ProxyStubClsid="76913B52-F9EB-4FAE-8DE7-24C20BDCF37B" />
<com:Interface Id="3C80B0C2-966E-4AC8-BA88-793970E0650B" ProxyStubClsid="76913B52-F9EB-4FAE-8DE7-24C20BDCF37B" />
<com:proxyStub Id="76913B52-F9EB-4FAE-8DE7-24C20BDCF37B" Path="WsaProxy\WsaProxy.dll" />
</com2:ComInterface>
</com2:Extension>
<desktop6:Extension Category="windows.service" Executable="WsaService\WsaService.exe" EntryPoint="Windows.FullTrustApplication"><desktop6:Service Name="WsaService" StartupType="manual" StartAccount="localSystem" /></desktop6:Extension></Extensions>
</Application>
<Application Id="SettingsApp" Executable="WsaSettings.exe" EntryPoint="WsaSettings.App">
<uap:VisualElements DisplayName="ms-resource:WsaSettingsDisplayName" Description="ms-resource:WsaSettingsDescription" Square150x150Logo="Images\MedTile.png" Square44x44Logo="Images\AppList.png" BackgroundColor="transparent">
<uap:DefaultTile Wide310x150Logo="Images\WideTile.png" Square71x71Logo="Images\SmallTile.png" Square310x310Logo="Images\LargeTile.png" />
<uap:SplashScreen Image="Images\SplashScreen.png" />
</uap:VisualElements>
<Extensions>
<uap:Extension Category="windows.protocol">
<uap3:protocol Name="wsa-settings" />
</uap:Extension>
</Extensions>
</Application>
</Applications>
<Extensions>
<desktop6:Extension Category="windows.customInstall">
<desktop6:CustomInstall Folder="CustomInstall" desktop8:RunAsUser="true">
<desktop6:RepairActions>
<desktop6:RepairAction File="WsaSetup.exe" Name="Repair" Arguments="repair" />
</desktop6:RepairActions>
<desktop6:UninstallActions>
<desktop6:UninstallAction File="WsaSetup.exe" Name="Uninstall" Arguments="uninstall" />
</desktop6:UninstallActions>
</desktop6:CustomInstall>
</desktop6:Extension>
<Extension Category="windows.activatableClass.proxyStub">
<ProxyStub ClassId="76913B52-F9EB-4FAE-8DE7-24C20BDCF37B">
<Path>WsaProxy\WsaProxy.dll</Path>
<Interface Name="IWsaClient" InterfaceId="A7170AB5-15F2-48BF-B2A3-2F08AA4A9DCC" />
</ProxyStub>
</Extension>
<desktop2:Extension Category="windows.firewallRules">
<desktop2:FirewallRules Executable="WsaClient\WsaClient.exe">
<desktop2:Rule Direction="in" IPProtocol="TCP" LocalPortMin="58526" LocalPortMax="58526" Profile="private" />
</desktop2:FirewallRules>
</desktop2:Extension>
</Extensions>
<build:Metadata>
<build:Item Name="cl.exe" Version="19.29.30139.0 built by: vcwrkspc" />
<build:Item Name="CodeSharingProject" Value="248F659F-DAC5-46E8-AC09-60EC9FC95053" />
<build:Item Name="VisualStudio" Version="16.0" />
<build:Item Name="OperatingSystem" Version="10.0.17763.1 (WinBuild.160101.0800)" />
<build:Item Name="Microsoft.Build.AppxPackage.dll" Version="16.0.31910.33" />
<build:Item Name="ProjectGUID" Value="a2be7e6a-792a-4530-8614-bc091a63d7bb" />
<build:Item Name="OptimizingToolset" Value="None" />
<build:Item Name="TargetRuntime" Value="Native" />
<build:Item Name="Microsoft.Windows.UI.Xaml.Build.Tasks.dll" Version="0.0.0.0" />
<build:Item Name="WindowsDesktop" Version="10.0.22000.0" />
<build:Item Name="MakePri.exe" Version="10.0.22000.194 (WinBuild.160101.0800)" />
<build:Item Name="Microsoft.Build.DesktopBridge.Tasks.dll" Version="4.6.30319.200" />
<build:Item Name="TargetFrameworkMoniker" Value=".NETFramework,Version=v4.5.1" />
</build:Metadata>
<mp:phoneIdentity PhoneProductId="dd5d7f57-f9ab-4533-8aa3-8b7325addf8a" PhonePublisherId="d949d1ab-24a8-4463-9586-acee62f6de38" />
<Capabilities><Capability Name="internetClient" /><Capability Name="internetClientServer" /><Capability Name="codeGeneration" /><uap:Capability Name="sharedUserCertificates" /><uap:Capability Name="removableStorage" /><uap4:Capability Name="userDataTasks" /><rescap:Capability Name="localSystemServices" /><rescap:Capability Name="packagedServices" /><rescap:Capability Name="runFullTrust" /><rescap:Capability Name="unvirtualizedResources" /><rescap:Capability Name="packageManagement" /><rescap:Capability Name="packageQuery" /><rescap:Capability Name="customInstallActions" /><rescap:Capability Name="allowElevation" /><uap4:CustomCapability Name="Microsoft.classicAppInstaller_8wekyb3d8bbwe" /></Capabilities></Package>
OKAY~! So what did I learn?
WSA is stupid if you aren't running a buisness that relies on the emulator's high encryption standards. The emulator can absolutely be cracked with MSIXHERO, But the process to do so is silly and not trivial.
The best Idea is to build Our Own Emulator, with Android Studio~! I will teach you how in another thread~!
Spoiler: GET ANDROID STUDIO, IF YOU NEED IT
You will need Android Studio~! For the remainder of my tutorials, I will be using Chocolatey Packages.
To install, paste into a terminal:
choco install androidstudio
Spoiler: LEARN CHOCOLATEY
How To Use Chocolatey
========================= ============================================ HOW TO USE CHOCOLATEY ============== ============= Hi Friends~! This amazing package manager changed my Windoz life
forum.xda-developers.com
PITFALLS~! TO KNOWLEDGE~!
I have to say, Android Studio's emulators have gotten significantly better in the last 6 years.. haha
Spoiler: AVD
are we learning how to just bypass All these Corporate Emulators? Tee Hee IDK what I am doing. We will see~!
Apparently Android Studio Uses QEMU to create it's emulators~! I keep hearing good things about QEMU but I am not smart enough to program it yet x.x
Apparently We can run CalyxOs in Android Studio~!
Lol this dissembling of WSA may be STUPID~! If we can just make our own~!
-----EDIT...
I OFFICIALLY DEEM THIS PROJECT TOO STUPID TO CARRY ON~! WHEN WE CAN MAKE OUR OWN <3
How To Build Your Own Android Emulator~!
========================= ===================== BUILDING OUR OWN ANDROID EMULATOR ============================= ============================= Hello Friends~! Today I will be walking you through building Your Own Android Emulator Using Android...
forum.xda-developers.com