├── notes ├── img │ ├── vbox-ptforward.png │ ├── anbox-calculator.png │ ├── vb_android_immer.png │ ├── androidstudio_immer.png │ ├── qemu_android_immer.png │ ├── vb_android_immer_2.png │ ├── vb_android_immer_3.png │ ├── vb_android_startup.png │ ├── androidstudio_immer_2.png │ ├── androidstudio_immer_3.png │ └── anbox-application-manager.png ├── android-metadata.md ├── android_anbox.md ├── download-packages-android.md ├── android-86-vb-adb.md ├── android-studio-emulator.md ├── android-86-qemu.md └── notes.md ├── README.md ├── apk-sig ├── add-siegfried.sh ├── apk-container-base.xml └── apk-standard-base.xml ├── scripts └── readplist.py ├── sample-files ├── info_plist.json ├── Info.plist ├── arize-androidManifest.xml └── immer-androidManifest.xml └── LICENSE /notes/img/vbox-ptforward.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KBNLresearch/mobile-apps/main/notes/img/vbox-ptforward.png -------------------------------------------------------------------------------- /notes/img/anbox-calculator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KBNLresearch/mobile-apps/main/notes/img/anbox-calculator.png -------------------------------------------------------------------------------- /notes/img/vb_android_immer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KBNLresearch/mobile-apps/main/notes/img/vb_android_immer.png -------------------------------------------------------------------------------- /notes/img/androidstudio_immer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KBNLresearch/mobile-apps/main/notes/img/androidstudio_immer.png -------------------------------------------------------------------------------- /notes/img/qemu_android_immer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KBNLresearch/mobile-apps/main/notes/img/qemu_android_immer.png -------------------------------------------------------------------------------- /notes/img/vb_android_immer_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KBNLresearch/mobile-apps/main/notes/img/vb_android_immer_2.png -------------------------------------------------------------------------------- /notes/img/vb_android_immer_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KBNLresearch/mobile-apps/main/notes/img/vb_android_immer_3.png -------------------------------------------------------------------------------- /notes/img/vb_android_startup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KBNLresearch/mobile-apps/main/notes/img/vb_android_startup.png -------------------------------------------------------------------------------- /notes/img/androidstudio_immer_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KBNLresearch/mobile-apps/main/notes/img/androidstudio_immer_2.png -------------------------------------------------------------------------------- /notes/img/androidstudio_immer_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KBNLresearch/mobile-apps/main/notes/img/androidstudio_immer_3.png -------------------------------------------------------------------------------- /notes/img/anbox-application-manager.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KBNLresearch/mobile-apps/main/notes/img/anbox-application-manager.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Mobile app archiving resources 2 | 3 | This repo contains various resources and documentation related to long-term preservation and access to mobile apps. 4 | -------------------------------------------------------------------------------- /apk-sig/add-siegfried.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # This script creates Siegfried signatures from the custom 4 | # DROID signatures in this directory. After build they will 5 | # replace the default signatures. To revert to the original 6 | # signatures afterwards, manually run "sudo roy build" 7 | 8 | sudo cp *.xml /usr/share/siegfried/ 9 | sudo roy build -noreports \ 10 | -droid /usr/share/siegfried/apk-standard-base.xml \ 11 | -container /usr/share/siegfried/apk-container-base.xml -------------------------------------------------------------------------------- /notes/android-metadata.md: -------------------------------------------------------------------------------- 1 | # Metadata 2 | 3 | Tech. dependencies: OS version, other apps? Source: app store, or automatically from packages? Are there tools that support this? 4 | 5 | Useful article on inspecting APK files: 6 | 7 | 8 | 9 | Tools for extracting metadata: 10 | 11 | - [APK Analyzer](https://developer.android.com/studio/build/apk-analyzer) (part of [Android Studio](https://developer.android.com/studio/index.html)) 12 | 13 | - [apk-analyzer](https://developer.android.com/studio/command-line/apkanalyzer.html) (as bove, but command-line version) 14 | 15 | - [Apktool](https://ibotpeaches.github.io/Apktool/). 16 | 17 | - [axmldec](https://github.com/ytsutano/axmldec) - stand-alone decoder for Android Binary XML 18 | 19 | - Perhaps [Androguard](https://github.com/androguard/androguard) 20 | 21 | Also: 22 | 23 | 24 | 25 | ## Androguard 26 | 27 | Decode Android Manifest (printed to screen; strangely redirect to file results in garbage): 28 | 29 | ``` 30 | androguard axml com.Triplee.TripleeSocial.apk 31 | ``` 32 | -------------------------------------------------------------------------------- /scripts/readplist.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python3 2 | 3 | """ 4 | This script demonstrates how to read Apple property list files. 5 | """ 6 | 7 | import os 8 | import argparse 9 | import plistlib 10 | import json 11 | 12 | # Create parser 13 | parser = argparse.ArgumentParser( 14 | description="Verify file size of ISO image and extract technical information") 15 | 16 | 17 | def parseCommandLine(): 18 | """Parse command line""" 19 | # Add arguments 20 | parser.add_argument('plist', 21 | action="store", 22 | type=str, 23 | help="input property list") 24 | # Parse arguments 25 | args = parser.parse_args() 26 | 27 | return args 28 | 29 | 30 | def main(): 31 | """Main function""" 32 | 33 | # Get input from command line 34 | args = parseCommandLine() 35 | 36 | # Input file 37 | plistIn = os.path.abspath(args.plist) 38 | 39 | # Read property list to Python dictionary 40 | with open(plistIn, 'rb') as f: 41 | pl = plistlib.load(f) 42 | 43 | # Convert dictionary to JSON 44 | pl = json.dumps(pl) 45 | print(pl) 46 | 47 | 48 | if __name__ == "__main__": 49 | main() 50 | -------------------------------------------------------------------------------- /apk-sig/apk-container-base.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Android Package Archive 8 | 16 | 17 | 18 | AndroidManifest.xml 19 | 20 | 23 | 24 | classes.dex 25 | 26 | 27 | resources.arsc 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /sample-files/info_plist.json: -------------------------------------------------------------------------------- 1 | {"BuildMachineOSBuild": "14A389", "CFBundleDevelopmentRegion": "en", "CFBundleDisplayName": "Floppy Cloud", "CFBundleDocumentTypes": [{"CFBundleTypeExtensions": ["rar"], "CFBundleTypeName": "rar", "CFBundleTypeRole": "Viewer", "LSHandlerRank": "Default", "LSItemContentTypes": ["public.rar"]}], "CFBundleExecutable": "Floppy Cloud", "CFBundleIcons": {"CFBundlePrimaryIcon": {"CFBundleIconFiles": ["AppIcon29x29", "AppIcon40x40", "AppIcon57x57", "AppIcon60x60"]}}, "CFBundleIcons~ipad": {"CFBundlePrimaryIcon": {"CFBundleIconFiles": ["AppIcon29x29", "AppIcon40x40", "AppIcon57x57", "AppIcon60x60", "AppIcon50x50", "AppIcon72x72", "AppIcon76x76"]}}, "CFBundleIdentifier": "com.hip.182797", "CFBundleInfoDictionaryVersion": "6.0", "CFBundleName": "Floppy Cloud", "CFBundlePackageType": "APPL", "CFBundleShortVersionString": "1.0.4", "CFBundleSignature": "????", "CFBundleSupportedPlatforms": ["iPhoneOS"], "CFBundleURLTypes": [{"CFBundleURLSchemes": ["db-v1yg7gcarlw9k66"]}], "CFBundleVersion": "6", "DTCompiler": "com.apple.compilers.llvm.clang.1_0", "DTPlatformBuild": "12B411", "DTPlatformName": "iphoneos", "DTPlatformVersion": "8.1", "DTSDKBuild": "12B411", "DTSDKName": "iphoneos8.1", "DTXcode": "0610", "DTXcodeBuild": "6A1052d", "LSRequiresIPhoneOS": true, "MinimumOSVersion": "7.0", "UIDeviceFamily": [1, 2], "UILaunchImageFile": "LaunchImage", "UILaunchImages": [{"UILaunchImageMinimumOSVersion": "7.0", "UILaunchImageName": "LaunchImage-700-568h", "UILaunchImageOrientation": "Portrait", "UILaunchImageSize": "{320, 568}"}], "UIPrerenderedIcon": true, "UIRequiredDeviceCapabilities": ["armv7"], "UISupportedInterfaceOrientations": ["UIInterfaceOrientationPortrait", "UIInterfaceOrientationLandscapeLeft", "UIInterfaceOrientationLandscapeRight", "UIInterfaceOrientationPortraitUpsideDown"], "UISupportedInterfaceOrientations~ipad": ["UIInterfaceOrientationPortrait", "UIInterfaceOrientationPortraitUpsideDown", "UIInterfaceOrientationLandscapeLeft", "UIInterfaceOrientationLandscapeRight"], "UTExportedTypeDeclarations": [{"UTTypeConformsTo": ["public.disk-image", "public.data", "public.rar"], "UTTypeIdentifier": "public.rar", "UTTypeTagSpecification": {"public.filename-extension": "rar", "public.mime-type": "com.rarlab.rar-archive"}}]} 2 | -------------------------------------------------------------------------------- /notes/android_anbox.md: -------------------------------------------------------------------------------- 1 | # Test with Anbox 2 | 3 | [Anbox](https://github.com/anbox/anbox) "is a container-based approach to boot a full Android system on a regular GNU/Linux system like Ubuntu. In other words: Anbox will let you run Android on your Linux system without the slowness of virtualization". 4 | 5 | After installation, start Anbox Application Manager from launcher menu. On startup it looks like this: 6 | 7 | ![](./img/anbox-application-manager.png) 8 | 9 | From what I see here, Anbox does not really emulate the "look and feel" of an actual Android environment. Instead: 10 | 11 | > Android applications are mapped into single windows within the desktop environment. 12 | 13 | See for example calculator app: 14 | 15 | ![](./img/anbox-calculator.png) 16 | 17 | Note that: 18 | 19 | > The Android runtime environment ships with a minimal customized Android system image based on the Android Open Source Project. The used image is currently based on Android 7.1.1 20 | 21 | This is a very old version (2017). Installation of packages with Android Debug Bridge (adb); connection is set up automatically: 22 | 23 | ``` 24 | adb devices -l 25 | ``` 26 | 27 | Results in: 28 | 29 | ``` 30 | * daemon not running; starting now at tcp:5037 31 | * daemon started successfully 32 | List of devices attached 33 | emulator-5558 offline transport_id:1 34 | ``` 35 | 36 | Install Arize app: 37 | 38 | ``` 39 | adb install com.Triplee.TripleeSocial.apk 40 | ``` 41 | 42 | Result: 43 | 44 | ``` 45 | Performing Streamed Install 46 | adb: failed to install com.Triplee.TripleeSocial.apk: Failure [INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res=-113] 47 | ``` 48 | 49 | From [StackOverflow](https://stackoverflow.com/a/24572239): 50 | 51 | > INSTALL_FAILED_NO_MATCHING_ABIS is when you are trying to install an app that has native libraries and it doesn't have a native library for your cpu architecture. For example if you compiled an app for armv7 and are trying to install it on an emulator that uses the Intel architecture instead it will not work.. 52 | 53 | Immer App: 54 | 55 | ``` 56 | adb install app.immer.immer.apk 57 | ``` 58 | 59 | Result: 60 | 61 | ``` 62 | Performing Streamed Install 63 | Success 64 | ``` 65 | 66 | Launch app: works, but cannot connect to server (no network). Double-checked by: 67 | 68 | ``` 69 | adb shell ping google.com 70 | ``` 71 | 72 | Result: 73 | 74 | ``` 75 | ping: unknown host google.com 76 | ``` 77 | 78 | Apparently this is a [known issue](https://github.com/anbox/anbox/issues/1724). 79 | 80 | -------------------------------------------------------------------------------- /notes/download-packages-android.md: -------------------------------------------------------------------------------- 1 | # Local download of installers 2 | 3 | - Various online services exist, but safety/trustworthiness often not clear. Also some of these sites appear to repackage the original data, so impossible verify authenticity. Not recommended. 4 | 5 | - There are also a number of (OS) tools, but many are abondoned projects that no longer work. After experimenting with some of these tools I did have success with [gplaycli](https://github.com/matlink/gplaycli), "a command line tool to search, install, update Android applications from the Google Play Store". 6 | 7 | APK can be downloaded by their App ID, e.g.: 8 | 9 | ``` 10 | gplaycli -d com.Triplee.TripleeSocial 11 | ``` 12 | 13 | This does result in a warning: 14 | 15 | ``` 16 | /home/johan/.local/lib/python3.6/site-packages/gpapi/googleplay.py:645: RuntimeWarning: Unexpected end-group tag: Not all data was converted 17 | response = googleplay_pb2.ResponseWrapper.FromString(response.content) 18 | ``` 19 | 20 | BUT does result in 81 MB APK file! Issue is [documented here](https://github.com/matlink/gplaycli/issues/272), and there's a pull request with a fix. 21 | 22 | ## Verify downloaded APK 23 | 24 | To verify the authenticity of the APK, I did this: 25 | 26 | In a VM, I installed the app from the Google Play store. 27 | 28 | Then I used the [Android Debug Bridge (adb)](https://developer.android.com/studio/command-line/adb) tool on my host machine download the APK from the VM [^1]. Steps: 29 | 30 | 1. Connect to the VM using its IP address: 31 | 32 | ``` 33 | adb connect 127.0.0.1 34 | ``` 35 | 36 | 2. Get list of installed packages (redirect output to file): 37 | 38 | ``` 39 | adb shell pm list packages > packages.txt 40 | ``` 41 | 42 | 3. Lookup package id this file (in this case com.Triplee.TripleeSocial). Then get file path of package: 43 | 44 | ``` 45 | adb shell pm path com.Triplee.TripleeSocial 46 | ``` 47 | 48 | Result: 49 | 50 | ``` 51 | package:/data/app/com.Triplee.TripleeSocial-r8iVFUp1MOSAc6LmHA1MDQ==/base.apk 52 | ``` 53 | 54 | 4. Download the package: 55 | 56 | ``` 57 | adb pull /data/app/com.Triplee.TripleeSocial-r8iVFUp1MOSAc6LmHA1MDQ==/base.apk 58 | ``` 59 | 60 | Result: local file "base.apk'. 61 | 62 | I then used the [cmp tool](https://linux.die.net/man/1/cmp) to compare this file against the file I downloaded with gplaycli: 63 | 64 | ``` 65 | cmp base.apk com.Triplee.TripleeSocial.apk 66 | ``` 67 | 68 | In this case no output is produced, which confirms both files are identical. 69 | 70 | [^1]: Part of [Android Studio](https://developer.android.com/studio) -------------------------------------------------------------------------------- /notes/android-86-vb-adb.md: -------------------------------------------------------------------------------- 1 | # Test with Android-x86 on VirtualBox + Android debug bridge 2 | 3 | This largely follows [this blog post by Sjoerd Langkemper](https://www.sjoerdlangkemper.nl/2020/05/06/testing-android-apps-on-a-virtual-machine/). I used the pre-built Virtual Box image (Android-x86 9.0-R2, 64-bit). 4 | 5 | Note this: 6 | 7 | > Testing on a virtual machine (VM) has some disadvantages. Testing on an actual Android phone is more reliable. Android is meant to run on ARM phones and not on x86 virtual machines, so things may randomly break when using a VM. Apps that ship with native libraries may not run at all in the VM, or they may run perfectly but don’t show up in the Play store. 8 | 9 | This has implications for (long-term) accessibility! 10 | 11 | Another useful resource: 12 | 13 | 14 | 15 | ## VM Installation 16 | 17 | Works; needs some fiddling of VM settings (set graphics controller to VBoxSVGA, otherwise VM boots with black screen); also set number of processors to 2 because according to info [here](https://www.android-x86.org/documentation/virtualbox.html): 18 | 19 | > Processor(s) should be set above 1 if you have more than one virtual processor in your host system. Failure to do so means every single app (like Google Chrome) might crush if you try to use it. 20 | 21 | However, despite this, Chrome browser reliably crashes on text input in URL widget! 22 | 23 | ## Android Debug Bridge tests 24 | 25 | First put Android in developer mode (don't know if this is really needed?). 26 | 27 | Get ip address of VM as per post Langkemper. NOTE: if I go to Settings/System/About, listed value is `10.0.2.15`, which doesn't work for me. If I open the Terminal Emulator on the VM and enter: 28 | 29 | ``` 30 | ip a 31 | ``` 32 | 33 | First entry contains IP address `127.0.0.1` (localhost), which does work for me. 34 | 35 | Connect to device: 36 | 37 | ``` 38 | adb connect 127.0.0.1 39 | ``` 40 | 41 | If this results in a "Connection refused" error, you might need to set a port forwarding rule. In VirtualBox, go to "Network" in your VM's settings. Click on "Advanced", followed by "Port Forwarding". Here, click on the green "+" icon (top-right). This adds a port forwarding rule. Now change the values of both "Host Port" and "Guest Port" to 5555 (defaults are 0): 42 | 43 | ![](./img/vbox-ptforward.png) 44 | 45 | Then try to connect again. 46 | 47 | List connected devices: 48 | 49 | ``` 50 | adb devices -l 51 | ``` 52 | 53 | Result: 54 | 55 | ``` 56 | List of devices attached 57 | 127.0.0.1:5555 device product:android_x86_64 model:VirtualBox device:x86_64 transport_id:1 58 | ``` 59 | 60 | ## Install app from local APK 61 | 62 | Here, APK is locally downloaded package on host machine. 63 | 64 | ``` 65 | adb install com.Triplee.TripleeSocial.apk 66 | ``` 67 | 68 | Result: 69 | 70 | ``` 71 | Performing Streamed Install 72 | Success 73 | ``` 74 | 75 | BUT app immediately crashes on startup. Apparently apps crashing under Android x86 is pretty common, see e.g.: 76 | 77 | - [Android x86 on VirtualBox: App crashes on startup](https://stackoverflow.com/questions/60120347/android-x86-on-virtualbox-app-crashes-on-startup) 78 | 79 | - [Android 9.0 x86 apps keep crashing - no native bridge](https://android.stackexchange.com/questions/225403/android-9-0-x86-apps-keep-crashing-no-native-bridge) 80 | 81 | Perhaps the app really needs a native ARM architecture? 82 | 83 | Immer app: 84 | 85 | ``` 86 | adb install app.immer.immer.apk 87 | ``` 88 | 89 | Result: 90 | 91 | ``` 92 | Performing Streamed Install 93 | Success 94 | ``` 95 | 96 | Launch: works! Some screenshots: 97 | 98 | ![](./img/vb_android_immer.png) 99 | 100 | ![](./img/vb_android_immer_2.png) 101 | 102 | ![](./img/vb_android_immer_3.png) 103 | 104 | 105 | ## ARM hardware emulation 106 | 107 | [QEMU can emulate both 32-bit and 64-bit Arm CPUs](https://qemu.readthedocs.io/en/latest/system/target-arm.html). 108 | 109 | So this is possible, but can't find any recent instructions on how to make this work for Android. -------------------------------------------------------------------------------- /notes/android-studio-emulator.md: -------------------------------------------------------------------------------- 1 | # Test with Android Studio Emulator 2 | 3 | [Android Studio](https://developer.android.com/studio/) includes [Android Emulator](https://developer.android.com/studio/run/emulator). 4 | 5 | Version used: 30.3.5.0 (build_id 7033400) 6 | 7 | Explained [here](https://developer.android.com/studio/run/managing-avds). It's possible to set up [Android Virtual Device](https://developer.android.com/studio/run/managing-avds) based on user-specified "hardware profile, system image, storage area, skin, and other properties". Both x86 and ARM system images are available. Uses wizard-like interface, very simple to set up. 8 | 9 | As a test I set up a device with Android 9 (same as VirtualBox) using x86 image. Some tests: 10 | 11 | Chrome browser - works without crashing. 12 | 13 | Connect with Android Debug Bridge (note that again IP address listed in Settings/System/About does not work, but localhost does): 14 | 15 | ``` 16 | adb connect 127.0.0.1 17 | ``` 18 | 19 | List devices: 20 | 21 | ``` 22 | adb devices -l 23 | ``` 24 | 25 | Output: 26 | 27 | ``` 28 | List of devices attached 29 | 127.0.0.1:5555 device product:sdk_gphone_x86_arm model:AOSP_on_IA_Emulator device:generic_x86_arm transport_id:9 30 | emulator-5554 device product:sdk_gphone_x86_arm model:AOSP_on_IA_Emulator device:generic_x86_arm transport_id:8 31 | ``` 32 | 33 | Note: 2 devices (don't really understand logic behind this?). Two devices because emulator automatically sets up a connection, so no need to do a manual adb connect. Anyway, [use `adb` with `-s` switch and device id to send commands to a specific device](https://developer.android.com/studio/command-line/adb#directingcommands): 34 | 35 | ``` 36 | adb -s 127.0.0.1:5555 shell pm list packages 37 | ``` 38 | 39 | Or: 40 | 41 | ``` 42 | adb -s emulator-5554 shell pm list packages 43 | ``` 44 | 45 | TODO: what's the difference between these 2 devices? 46 | 47 | Install Arize app: 48 | 49 | ``` 50 | adb -s 127.0.0.1:5555 install com.Triplee.TripleeSocial.apk 51 | ``` 52 | 53 | Result: 54 | 55 | ``` 56 | Performing Streamed Install 57 | Success 58 | ``` 59 | 60 | Launch app: works! But app needs camera, so let's test with webcam. See [How to use webcam in emulator](https://stackoverflow.com/a/30792615): shut down device, open AVD manager, go to Advanced Settings and set Front and Back Camera fields to Webcam0. However app freezes after some time, and VM becomes unresponsive (adb connect also fails). On re-boot it reboots in this error state. Fix: in AVD manager, change Boot option to "Cold boot". 61 | 62 | Immer app: 63 | 64 | ``` 65 | adb -s 127.0.0.1:5555 install app.immer.immer.apk 66 | ``` 67 | 68 | Result: 69 | 70 | ``` 71 | Performing Streamed Install 72 | adb: failed to install app.immer.immer.apk: Failure [INSTALL_FAILED_INSUFFICIENT_STORAGE] 73 | ``` 74 | 75 | Why does this happen? Default "Internal Storage" is only 800 MB, so change to 4GB. After this: 76 | 77 | ``` 78 | Performing Streamed Install 79 | Success 80 | ``` 81 | 82 | Launch: works! Some screenshots: 83 | 84 | ![](./img/androidstudio_immer.png) 85 | 86 | ![](./img/androidstudio_immer_2.png) 87 | 88 | ![](./img/androidstudio_immer_3.png) 89 | 90 | BUT if app is launched w/o network connection only blank screen is shown. 91 | 92 | 93 | ## Using Emulator from command line 94 | 95 | Explained [here](https://developer.android.com/studio/run/emulator-commandline). 96 | 97 | 98 | ## x86 vs ARM system images 99 | 100 | From [Emulator 30.0.0 release notes](https://developer.android.com/studio/releases/emulator#support_for_arm_binaries_on_android_9_and_11_system_images): 101 | 102 | > If you were previously unable to use the Android Emulator because your app depended on ARM binaries, you can now use the Android 9 x86 system image or any Android 11 system image to run your app – it is no longer necessary to download a specific system image to run ARM binaries. These Android 9 and Android 11 system images support ARM by default and provide dramatically improved performance when compared to those with full ARM emulation. 103 | 104 | so x86 should be OK. 105 | 106 | ## Link with QEMU 107 | 108 | From above page: 109 | 110 | > The Android Emulator uses the Quick Emulator (QEMU) hypervisor. Initial versions of the Android Emulator used QEMU 1 (goldfish), and later versions use QEMU 2 (ranchu). 111 | 112 | -------------------------------------------------------------------------------- /sample-files/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 14A389 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleDisplayName 10 | Floppy Cloud 11 | CFBundleDocumentTypes 12 | 13 | 14 | CFBundleTypeExtensions 15 | 16 | rar 17 | 18 | CFBundleTypeName 19 | rar 20 | CFBundleTypeRole 21 | Viewer 22 | LSHandlerRank 23 | Default 24 | LSItemContentTypes 25 | 26 | public.rar 27 | 28 | 29 | 30 | CFBundleExecutable 31 | Floppy Cloud 32 | CFBundleIcons 33 | 34 | CFBundlePrimaryIcon 35 | 36 | CFBundleIconFiles 37 | 38 | AppIcon29x29 39 | AppIcon40x40 40 | AppIcon57x57 41 | AppIcon60x60 42 | 43 | 44 | 45 | CFBundleIcons~ipad 46 | 47 | CFBundlePrimaryIcon 48 | 49 | CFBundleIconFiles 50 | 51 | AppIcon29x29 52 | AppIcon40x40 53 | AppIcon57x57 54 | AppIcon60x60 55 | AppIcon50x50 56 | AppIcon72x72 57 | AppIcon76x76 58 | 59 | 60 | 61 | CFBundleIdentifier 62 | com.hip.182797 63 | CFBundleInfoDictionaryVersion 64 | 6.0 65 | CFBundleName 66 | Floppy Cloud 67 | CFBundlePackageType 68 | APPL 69 | CFBundleShortVersionString 70 | 1.0.4 71 | CFBundleSignature 72 | ???? 73 | CFBundleSupportedPlatforms 74 | 75 | iPhoneOS 76 | 77 | CFBundleURLTypes 78 | 79 | 80 | CFBundleURLSchemes 81 | 82 | db-v1yg7gcarlw9k66 83 | 84 | 85 | 86 | CFBundleVersion 87 | 6 88 | DTCompiler 89 | com.apple.compilers.llvm.clang.1_0 90 | DTPlatformBuild 91 | 12B411 92 | DTPlatformName 93 | iphoneos 94 | DTPlatformVersion 95 | 8.1 96 | DTSDKBuild 97 | 12B411 98 | DTSDKName 99 | iphoneos8.1 100 | DTXcode 101 | 0610 102 | DTXcodeBuild 103 | 6A1052d 104 | LSRequiresIPhoneOS 105 | 106 | MinimumOSVersion 107 | 7.0 108 | UIDeviceFamily 109 | 110 | 1 111 | 2 112 | 113 | UILaunchImageFile 114 | LaunchImage 115 | UILaunchImages 116 | 117 | 118 | UILaunchImageMinimumOSVersion 119 | 7.0 120 | UILaunchImageName 121 | LaunchImage-700-568h 122 | UILaunchImageOrientation 123 | Portrait 124 | UILaunchImageSize 125 | {320, 568} 126 | 127 | 128 | UIPrerenderedIcon 129 | 130 | UIRequiredDeviceCapabilities 131 | 132 | armv7 133 | 134 | UISupportedInterfaceOrientations 135 | 136 | UIInterfaceOrientationPortrait 137 | UIInterfaceOrientationLandscapeLeft 138 | UIInterfaceOrientationLandscapeRight 139 | UIInterfaceOrientationPortraitUpsideDown 140 | 141 | UISupportedInterfaceOrientations~ipad 142 | 143 | UIInterfaceOrientationPortrait 144 | UIInterfaceOrientationPortraitUpsideDown 145 | UIInterfaceOrientationLandscapeLeft 146 | UIInterfaceOrientationLandscapeRight 147 | 148 | UTExportedTypeDeclarations 149 | 150 | 151 | UTTypeConformsTo 152 | 153 | public.disk-image 154 | public.data 155 | public.rar 156 | 157 | UTTypeIdentifier 158 | public.rar 159 | UTTypeTagSpecification 160 | 161 | public.filename-extension 162 | rar 163 | public.mime-type 164 | com.rarlab.rar-archive 165 | 166 | 167 | 168 | 169 | 170 | -------------------------------------------------------------------------------- /notes/android-86-qemu.md: -------------------------------------------------------------------------------- 1 | # Test with Android-x86 running under QEmu 2 | 3 | NOTE: this is really just virtualization, as full emulation would involve emulating ARM hardware! 4 | 5 | Followed [this guide](https://linuxhint.com/android_qemu_play_3d_games_linux/), using Linux Mint host machine: 6 | 7 | ``` 8 | sudo apt install qemu qemu-kvm 9 | sudo adduser `id -un` kvm 10 | ``` 11 | Reboot. Now create virtual hard disk: 12 | 13 | ``` 14 | qemu-img create -f qcow2 androidx86_hda.img 8G 15 | ``` 16 | 17 | Boot live image: 18 | 19 | ``` 20 | qemu-system-x86_64 \ 21 | -enable-kvm \ 22 | -m 2048 \ 23 | -smp 2 \ 24 | -cpu host \ 25 | -soundhw es1370 \ 26 | -device virtio-mouse-pci -device virtio-keyboard-pci \ 27 | -serial mon:stdio \ 28 | -boot menu=on \ 29 | -net nic \ 30 | -net user,hostfwd=tcp::5555-:22 \ 31 | -device virtio-vga,virgl=on \ 32 | -display gtk,gl=on \ 33 | -hda androidx86_hda.img \ 34 | -cdrom android-x86_64-9.0-r2.iso 35 | ``` 36 | 37 | BUT this results in this error: 38 | 39 | ``` 40 | qemu-system-x86_64: -display gtk,gl=on: GTK support is disabled 41 | ``` 42 | 43 | Google search on this error turned up [this](https://bugs.launchpad.net/ubuntu/+source/qemu/+bug/1859490): 44 | 45 | > versions up to 2.11 (<=Bionic) used -display sdl and not yet GTK. 46 | The GTK support got better and since 2.12 (>Bionic) Ubuntu qemu builds use GTK for the UI. 47 | 48 | Which makes sense, as I'm using the 2.11.1 version of qemu. So compiled most recent (5.2) release from source using instructions [here](https://www.qemu.org/download/#source.) Note: requires Python Ninja package, so install this first. All steps: 49 | 50 | ``` 51 | python3 -m pip install --user ninja 52 | wget https://download.qemu.org/qemu-5.2.0.tar.xz 53 | tar xvJf qemu-5.2.0.tar.xz 54 | cd qemu-5.2.0 55 | ./configure 56 | make 57 | sudo make install 58 | ``` 59 | 60 | Note "make" step will take a *long* time. 61 | 62 | Running the newly compiled `qemu-system-x86_64` results in: 63 | 64 | ``` 65 | qemu-system-x86_64: OpenGL support is disabled. 66 | ``` 67 | 68 | After some fiddling it works with below settings (which disable use of OpenGL): 69 | 70 | ``` 71 | qemu-system-x86_64 \ 72 | -enable-kvm \ 73 | -m 2048 \ 74 | -smp 2 \ 75 | -cpu host \ 76 | -device ES1370 -device virtio-mouse-pci -device virtio-keyboard-pci \ 77 | -serial mon:stdio \ 78 | -boot menu=on \ 79 | -net nic \ 80 | -net user,hostfwd=tcp::5555-:22 \ 81 | -device virtio-vga \ 82 | -display gtk,gl=off \ 83 | -hda androidx86_hda.img \ 84 | -cdrom android-x86_64-9.0-r2.iso 85 | ``` 86 | 87 | Installation: folllow steps [here](https://linuxhint.com/android_qemu_play_3d_games_linux/). After install close QEMU window and restart using (same as above, but omitting -cdrom argument:): 88 | 89 | ``` 90 | qemu-system-x86_64 \ 91 | -enable-kvm \ 92 | -m 2048 \ 93 | -smp 2 \ 94 | -cpu host \ 95 | -device ES1370 -device virtio-mouse-pci -device virtio-keyboard-pci \ 96 | -serial mon:stdio \ 97 | -boot menu=on \ 98 | -net nic \ 99 | -net user,hostfwd=tcp::5555-:22 \ 100 | -device virtio-vga \ 101 | -display gtk,gl=off \ 102 | -hda androidx86_hda.img 103 | ``` 104 | 105 | BUT only boots into console. Most likely cause is lack of 3D acceleration support (OpenGL). Setting `-display`'s `gl` flag to "on" again results in: 106 | 107 | ``` 108 | qemu-system-x86_64: OpenGL support is disabled 109 | ``` 110 | 111 | It's not clear to me how to enable OpenGL support (by re-compiling QEMU? But using which flags?). Also found this: 112 | 113 | 114 | 115 | One of the responses to this issue: 116 | 117 | > We can not enable spice GL by default because it blocks critical end user features like snapshots and the 'Save' option, because at the qemu level GL support is not wired up for memory migration. It definitely affects VM stablity too because there's a much larger and less tested interaction surface between qemu and the VM and that can lead to more crashes. 118 | 119 | And (from 2019): 120 | 121 | 122 | 123 | > Bottom line is that at least for running QEMU, right now well performing opengl is on the bleeding edge. 124 | 125 | Other how-to guide from 2019: 126 | 127 | 128 | 129 | From this I tried: 130 | 131 | ``` 132 | qemu-system-x86_64 -enable-kvm -boot c -cpu host -m 2048 -hda androidx86_hda.img 133 | ``` 134 | 135 | Which works! So let's go back to the original call and remove the virtio-vga device: 136 | 137 | ``` 138 | qemu-system-x86_64 \ 139 | -enable-kvm \ 140 | -m 2048 \ 141 | -smp 2 \ 142 | -cpu host \ 143 | -device ES1370 -device virtio-mouse-pci -device virtio-keyboard-pci \ 144 | -serial mon:stdio \ 145 | -boot menu=on \ 146 | -net nic \ 147 | -net user,hostfwd=tcp::4444-:5555 \ 148 | -hda androidx86_9_hda.img 149 | ``` 150 | 151 | Also works. 152 | 153 | ## Adb connection 154 | 155 | As per [here](https://www.android-x86.org/documentation/debug.html): 156 | 157 | ``` 158 | adb connect 127.0.0.1:4444 159 | ``` 160 | 161 | ## Install apps 162 | 163 | Install Arize app: 164 | 165 | ``` 166 | adb -s 127.0.0.1:4444 install com.Triplee.TripleeSocial.apk 167 | ``` 168 | 169 | Result: 170 | 171 | ``` 172 | Performing Streamed Install 173 | Success 174 | ``` 175 | 176 | Launch app: crashes immediately. 177 | 178 | 179 | Immer App: 180 | 181 | ``` 182 | adb -s 127.0.0.1:4444 install app.immer.immer.apk 183 | ``` 184 | 185 | Result: 186 | 187 | ``` 188 | Performing Streamed Install 189 | Success 190 | ``` 191 | 192 | Run the app - works, but on startup shows as: 193 | 194 | ![](./img/qemu_android_immer.png) 195 | 196 | Possible to click to user profile but display garbled. UPDATE: works fine on new QEMU machine?! -------------------------------------------------------------------------------- /apk-sig/apk-standard-base.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | D0CF11E0A1B11AE1 10 | 9 11 | 6 12 | 2 13 | 4 14 | 3 15 | 7 16 | 8 17 | 5 18 | 1 19 | FEFF 20 | 21 | 22 | 23 | 24 | 25 | 26 | 28 | 504B0304 29 | 5 30 | 2 31 | 1 32 | 3 33 | 4 34 | 35 | 36 | 37 | 39 | 504B0506 40 | -5 41 | -3 42 | -4 43 | -2 44 | -1 45 | 504B01 46 | 47 | 48 | 49 | 50 | 51 | 52 | 54 | 5B436F6E74656E745F54797065735D2E786D6C20A2 55 | 22 56 | 2 57 | 6 58 | 20 59 | 12 60 | 21 61 | 7 62 | 13 63 | 9 64 | 3 65 | 4 66 | 15 67 | 19 68 | 10 69 | 8 70 | 14 71 | 5 72 | 11 73 | 1 74 | 504B0304 75 | 76 | 77 | 504B0102 78 | 5 79 | 2 80 | 1 81 | 3 82 | 4 83 | 84 | 85 | 504B0506 86 | 5 87 | 2 88 | 1 89 | 3 90 | 4 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | apk 101 | 102 | 103 | 104 | 170 105 | 106 | 107 | 108 | 200 109 | zip 110 | 111 | 112 | 113 | 258 114 | 382 115 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /sample-files/arize-androidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /notes/notes.md: -------------------------------------------------------------------------------- 1 | # Mobile apps, raw notes 2 | 3 | All info in these raw notes eventually to be moved/edited into more structured docs. 4 | 5 | ## Avonturen van Max 6 | 7 | 8 | 9 | > De app kan op elke telefoon of tablet gedownload worden. De camera richt je op iedere rechterbladzijde van het boek. Daar wordt een extra laag op getoverd die het verhaal vertelt in de vorm van bewegende 3D-modellen en een vertelster. Zo kan een kind helemaal zelf het verhaal volgen en bekijken. Nog een pluspunt van dit boek, is de update van de app. Het boek blijft de hetzelfde, maar na elke update van de app worden er nieuwe modellen toegevoegd en verbeterd! 10 | 11 | "Dit Nederlandse prentenboek heeft wisselende 3D-afbeeldingen" (achtergrondinfo): 12 | 13 | 14 | 15 | Website (niet meer online): 16 | 17 | 18 | 19 | IA: 20 | 21 | 22 | 23 | Bevat appstore/playstore links. Playstore: 24 | 25 | 26 | 27 | But this returns a "We're sorry, the requested URL was not found on this server". 28 | 29 | MAAR, site ontwikkelaar zegt (): 30 | 31 | > Het kan zijn dat je zoekt naar ons oude applicatie (ARmazing) we hebben een nieuwe applicatie wat ARize heet. 32 | 33 | Link: 34 | 35 | 36 | 37 | 38 | - Version 3.0.6.1 39 | - 25 September 2020 40 | - Requires Andoid 7.0 and up. 41 | 42 | Appstore: 43 | 44 | 45 | 46 | 47 | Requires iTunes, which is not available for Linux (tried via Wine, but installation fails bc of Windows 10 dependency). 48 | 49 | Paper "Considerations on the Acquisition and Preservation of Mobile eBook Apps": 50 | 51 | 52 | 53 | Page 3: 54 | 55 | > The appearance and functionality of apps in this 56 | > category varied, though a notable shared characteristic 57 | > was that not all content was contained in the app 58 | > package, with each requiring an internet connection or 59 | > a fee to be paid in order to unlock access to additional 60 | > content. 61 | 62 | Also, several YouTube videos here: 63 | 64 | 65 | 66 | "Hoe werkt mijn boek?" 67 | 68 | 69 | 70 | Downloaden + opslaan als documentatie / contextinfo! 71 | 72 | 73 | # Emulation 74 | 75 | ## Android 76 | 77 | Good overview in [Android emulators entry on Emulation General Wiki](https://emulation.gametechwiki.com/index.php/Android_emulators); LOTS of detail about emulator-specific issues. 78 | 79 | - [Anbox](https://anbox.io/) (Android in a Box) - "Run Android applications on any GNU/Linux operating system". Recommended by Emulation General Wiki, so needs checking out! 80 | 81 | - Android Emulator (part of [Android Studio](https://developer.android.com/studio/intro)), [Android x86](https://www.android-x86.org/) (e.g. VM in VirtualBox). 82 | 83 | - Virtualbox - used to work back in 2015, but latest Android-x86 version ([9, rc 2](https://www.android-x86.org/releases/releasenote-9-0-r2.html)) results in various issues on VirtualBox. These are documented [here](https://forums.virtualbox.org/viewtopic.php?f=4&t=96610). So for the moment not a viable option. 84 | 85 | - QEmu - actually the Android-86 [release notes](https://www.android-x86.org/releases/releasenote-9-0-r2.html) describe how this works. 86 | 87 | - [Cuttlefish](]https://source.android.com/setup/create/cuttlefish) - "a configurable virtual Android device that can run both remotely (using third-party cloud offerings such as Google Cloud Engine) and locally (on Linux x86 machines)". 88 | 89 | 90 | 91 | ## Location of packages on Android 92 | 93 | Default apps: 94 | 95 | ``` 96 | /system/app/ 97 | ``` 98 | 99 | Self-installed apps: 100 | 101 | ``` 102 | /data/app/ 103 | ``` 104 | 105 | APKs in each folder. BUT trying to `ls' any of these folders gives "Permission denied". Explanation [here](https://stackoverflow.com/questions/1043322/why-do-i-get-access-denied-to-data-folder-when-using-adb). 106 | 107 | ### Install Arize app from Play store 108 | 109 | Works, but keeps crashing on startup. Package under `/data/app/com.Triplee.TripleeSocial-hvwhatever==/base.apk` 110 | 111 | ## iOS 112 | 113 | [iOS Simulator](https://docs.expo.io/workflow/ios-simulator/); but this only works in macOS (no Windows / Linux / VM). From paper Pennock, May & Day: 114 | 115 | > The iOS SDK simulator is used for development and 116 | > testing purposes. This could in theory be used to deliver 117 | > content on a PC but would require permission from the 118 | > publisher and extensive user testing. There would also 119 | > be challenges in enabling the simulator independently 120 | > of the full SDK environment. The iOS operating system 121 | > is closed and highly proprietary, limiting the availability 122 | > of alternative emulator sources. 123 | 124 | And: 125 | 126 | > The proprietary nature of iOS 127 | > remains at this point an unresolved challenge that limits 128 | > the viability of emulation as a preservation approach for 129 | > IPA apps and which will require positive engagement 130 | > with Apple to reach a satisfactory conclusion. 131 | 132 | [iOS emulators entry on Emulation General Wiki](https://emulation.gametechwiki.com/index.php/IOS_emulators) 133 | 134 | > Unlike their direct competitor, Android-based smartphones, they have currently no usable emulators, as the official iOS SDK (macOS-only) only allows for running your own projects, i.e. they run code generated for an x86 target rather than ARM code as used by iOS. 135 | 136 | Also, see the "History of Failed iOS Emulation Attempts". 137 | 138 | [iOS on QEMU](https://github.com/alephsecurity/xnu-qemu-arm64) - interesting, but no support for devices (screen!) at this stage. 139 | 140 | ## Virtual Box setup 141 | 142 | Android-86: 143 | 144 | 145 | 146 | Steps: 147 | 148 | 149 | 150 | 151 | 152 | 153 | --> 154 | 155 | Android version: [9.0](https://osdn.net/projects/android-x86/releases/71931) 156 | 157 | ## Other emulators 158 | 159 | Several listed here: 160 | 161 | 162 | 163 | 164 | Mostly proprietary products geared towards gaming. 165 | 166 | [Prime OS](https://primeos.in/) (website down 28/01/2021). 167 | 168 | Also: 169 | 170 | [Testing Android apps on a virtual machine](https://www.sjoerdlangkemper.nl/2020/05/06/testing-android-apps-on-a-virtual-machine/) -looks useful; also links to [pre-built VirtualBox images based on Android x86](https://www.osboxes.org/android-x86/). 171 | 172 | ## Download APK locally 173 | 174 | Use [googleplaydownloader](https://framagit.org/tuxicoman/googleplaydownloader) (Linux only) 175 | 176 | Installation: [Debian package, in source repo, v 2.4-1](https://framagit.org/tuxicoman/googleplaydownloader/-/blob/master/packages/googleplaydownloader_2.4-1_all.deb) 177 | 178 | Has 58 dependencies, so didn't bother trying! BUT source repo includes (modified/updated version of?) Google Play API, which has functionality for downloading: 179 | 180 | 181 | 182 | 183 | This, in turn, is taken from the APK Crawler tool: 184 | 185 | 186 | 187 | But code in googleplaydownloader looks more recent (python 3 fixes). API functions (login, search, download) in: 188 | 189 | 190 | 191 | BUT results in login error. 192 | 193 | Other project based on same code: 194 | 195 | 196 | 197 | README says: 198 | 199 | > You need to login on below website before use this package. https://accounts.google.com/b/0/DisplayUnlockCaptcha If show up SecurityCheckError when you modify the code also need to re-login. 200 | 201 | So this might be worth a try. 202 | 203 | Alternative: 204 | 205 | 206 | 207 | Installed & used: 208 | 209 | ``` 210 | gplaycli -d com.Triplee.TripleeSocial 211 | ``` 212 | 213 | Results in error message: 214 | 215 | ``` 216 | [Errno 2] No such file or directory: '/home/johan/.cache/gplaycli/token' 217 | /home/johan/.local/lib/python3.6/site-packages/gpapi/googleplay.py:645: RuntimeWarning: Unexpected end-group tag: Not all data was converted 218 | response = googleplay_pb2.ResponseWrapper.FromString(response.content) 219 | ``` 220 | 221 | BUT does result in 81 MB APK file! 222 | 223 | 224 | Via: 225 | 226 | 227 | 228 | 229 | 230 | 231 | BUT getting login errors with googleplaydownloader code. 232 | 233 | TODO test with other (more recent) fork of API: 234 | 235 | 236 | 237 | 238 | 239 | 240 | "APKMirror Free and safe Android APK downloads" 241 | 242 | BUT Max app not listed! 243 | 244 | Similar site: 245 | 246 | 247 | 248 | Has Max app (but not latest version): 249 | 250 | 251 | 252 | Similar site: 253 | 254 | 255 | 256 | BUT according to [virusTotal scan](https://www.virustotal.com/gui/url/ea7ae3587f1f9d47e4fa2c2fbf99d9e10da99da1ce6918e49f3c87ad41ca0d0d/detection) site may be malicious. 257 | 258 | Yet another one: 259 | 260 | 261 | 262 | Has latest version of app: 263 | 264 | 265 | 266 | Downloaded as XAPK file, described as "Base APK + Split APKs". 267 | 268 | BUT installation requires dedicated APKPure App: 269 | 270 | 271 | 272 | BUT actually this is just a ZIP file that contains apks + json file. 273 | 274 | Evozi APK Downloader: 275 | 276 | 277 | 278 | ZIP file that contains apks + json file; files inside ZIP are identical to those in APKPure ZIP file (same MD5 hashes). 279 | 280 | (see also ) 281 | 282 | 283 | 284 | # Immer app 285 | 286 | 287 | 288 | ## Android app 289 | 290 | - v. 1.17 291 | - 9 december 2020 292 | - Needs Android 7 or more recent 293 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /sample-files/immer-androidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | --------------------------------------------------------------------------------