Giter Club home page Giter Club logo

adbkit-apkreader's Introduction

Warning

This project along with other ones in OpenSTF organisation is provided as is for community, without active development.

You can check any other forks that may be actively developed and offer new/different features here.

Active development has been moved to DeviceFarmer organisation.

adbkit-apkreader

adbkit-apkreader provides a Node.js API for extracting information from Android APK files. For example, it allows you to read the AndroidManifest.xml of an existing APK file.

Requirements

  • Node.js 4.x or newer. Older versions are not supported.

Getting started

Install via NPM:

npm install --save adbkit-apkreader

Examples

Read the AndroidManifest.xml of an APK

const util = require('util')
const ApkReader = require('adbkit-apkreader')

ApkReader.open('HelloApp.apk')
  .then(reader => reader.readManifest())
  .then(manifest => console.log(util.inspect(manifest, { depth: null })))

API

ApkReader

ApkReader.MANIFEST

A convenience constant with the value 'AndroidManifest.xml'. Can use useful with other API methods in certain circumstances.

ApkReader.open(file)

Alternate syntax to manually creating an ApkReader instance. Currently, only files are supported, but support for streams might be added at some point.

Note that currently this method cannot reject as the file is opened lazily, but this may change in the future and therefore returns a Promise for fewer future compatibility issues. On a related node, calling the constructor directly is still possible, but discouraged.

  • file The path to the APK file.
  • Returns: A Promise that resolves with an ApkReader instance.

reader.readContent(path)

Reads the content of the given file inside the APK.

  • path The path to the file. For example, giving 'META-INF/MANIFEST.MF' as the path would read the content of that file.
  • Returns: A Promise that resolves with a Buffer containing the full contents of the file.

reader.readManifest()

Reads and parses the AndroidManifest.xml file inside the APK and returns a simplified object representation of it.

  • Returns: A Promise that resolves with a JavaScript Object representation of the manifest. See example output below. Rejects on error (e.g. if parsing was unsuccessful).
{ versionCode: 1,
  versionName: '1.0',
  package: 'com.example.hello.helloapp.app',
  usesPermissions: [],
  permissions: [],
  permissionTrees: [],
  permissionGroups: [],
  instrumentation: null,
  usesSdk: { minSdkVersion: 7, targetSdkVersion: 19 },
  usesConfiguration: null,
  usesFeatures: [],
  supportsScreens: null,
  compatibleScreens: [],
  supportsGlTextures: [],
  application:
   { theme: 'resourceId:0x7f0b0000',
     label: 'resourceId:0x7f0a000e',
     icon: 'resourceId:0x7f020057',
     debuggable: true,
     allowBackup: true,
     activities:
      [ { label: 'resourceId:0x7f0a000e',
          name: 'com.example.hello.helloapp.app.MainActivity',
          intentFilters:
           [ { actions: [ { name: 'android.intent.action.MAIN' } ],
               categories: [ { name: 'android.intent.category.LAUNCHER' } ],
               data: [] } ],
          metaData: [] } ],
     activityAliases: [],
     launcherActivities:
      [ { label: 'resourceId:0x7f0a000e',
          name: 'com.example.hello.helloapp.app.MainActivity',
          intentFilters:
           [ { actions: [ { name: 'android.intent.action.MAIN' } ],
               categories: [ { name: 'android.intent.category.LAUNCHER' } ],
               data: [] } ],
          metaData: [] } ],
     services: [],
     receivers: [],
     providers: [],
     usesLibraries: [] } }

reader.readXml(path)

Reads and parses the binary XML file at the given path inside the APK file. Attempts to be somewhat compatible with the DOM API.

  • path The path to the binary XML file inside the APK. For example, giving 'AndroidManifest.xml' as the path would parse the manifest (but you'll probably want to use reader.readManifest() instead).
  • Returns: A Promise that resolves with a JavaScript Object representation of the root node of the XML file. All nodes including the root node have the properties listed below. Rejects on error (e.g. if parsing was unsuccessful).
    • namespaceURI The namespace URI or null if none.
    • nodeType 1 for element nodes, 2 for attribute nodes, and 4 for CData sections.
    • nodeName The node name.
    • For element nodes, the following additional properties are present:
      • attributes An array of attribute nodes.
      • childNodes An array of child nodes.
    • For attribute nodes, the following additional properties are present:
      • name The attribute name.
      • value The attribute value, if possible to represent as a simple value.
      • typedValue May be available when the attribute represents a complex value. See android.util.TypedValue for more information. Has the following properties:
        • value The value, which might null, String, Boolean, Number or even an Object for the most complex types.
        • type A String representation of the type of the value.
        • rawType A raw integer presentation of the type of the value.
    • For CData nodes, the following additional properties are present:
      • data The CData.
      • typedValue May be available if the section represents a more complex type. See above for details.

reader.usingFileStream(path, action)

Opens a readable Stream to the given file inside the APK and runs the given action with it. The APK file is kept open while the action runs, allowing you to process the stream. Once the action finishes, the APK will be automatically closed.

  • path The path to the file. For example, giving 'META-INF/MANIFEST.MF' as the path would open that file.
  • action(stream) A function that processes the stream somehow. MUST return a Promise that resolves when you're done processing the stream. The value that the Promise resolves with will also be the value that usingFileStream() resolves with.
    • stream A readable Stream of the file content. You should either consume or end the stream yourself before resolving the action.
  • Returns: A Promise that resolves with whatever action resolves with.

More information

Contributing

See CONTRIBUTING.md.

License

See LICENSE.

Copyright © The OpenSTF Project. All Rights Reserved.

adbkit-apkreader's People

Contributors

dependabot[bot] avatar dos1in avatar harlentan avatar imurchie avatar koral-- avatar legneato avatar sorccu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

adbkit-apkreader's Issues

Could you provide an interface to inject a amdZip or ZipEntry?

Hi,

I am using your library to parse a manifest and I already have a zip because the apk is uploaded into a service. So I create the zip on the fly from the postet data.

currently I do this:

var admZip = require('adm-zip');
var ApkReader = require('adbkit-apkreader');

var zip = new admZip(blob);
var reader = new ApkReader(null);
reader.zip = zip;
var manifest = reader.readManifestSync();

This works but as soon as you change something internally it will break.

So I suggest to add an optional parameter zip to the readManifestSync function. If it is set, the function could read the provided zip if not the one of the class.

Regards
Christian

Parsing AndroidManifest.xml error if there is no namespace in xml.

Apk-reader raises error when I try to use it to parse Chrome 68 beta apk. By further investgation, I find that there is no namespace declaration in manifest.xml. The apk-reader seems to assume that it must be namespace in manifest.xml, which causes the error. I don't know chrome is intentional or not. However, I think it is better to make it compatible. I check the Chrome project, such as catapult project. They use aapt tool to dump xml to get the activity. They make it compatible by adding the correct namespace before parsing it.

npm audit complains

debug package dependency version is obsolete and has vulnerability. please, update dependency to new one.

Is it possible to use apkreader with browserify?

main.js

var util = require('util')
var ApkReader = require('adbkit-apkreader')

var reader = ApkReader.readFile('test.apk')
var manifest = reader.readManifestSync()

console.log(util.inspect(manifest, { depth: null }))
browserify main.js

will produce


Error: Cannot find module './src/apkreader' from '/home/tumh/browserify/node_modules/adbkit-apkreader'
    at /home/tumh/.nvm/versions/node/v0.12.1/lib/node_modules/browserify/node_modules/resolve/lib/async.js:55:21
    at load (/home/tumh/.nvm/versions/node/v0.12.1/lib/node_modules/browserify/node_modules/resolve/lib/async.js:69:43)
    at onex (/home/tumh/.nvm/versions/node/v0.12.1/lib/node_modules/browserify/node_modules/resolve/lib/async.js:92:31)
    at /home/tumh/.nvm/versions/node/v0.12.1/lib/node_modules/browserify/node_modules/resolve/lib/async.js:22:47
    at FSReqWrap.oncomplete (fs.js:99:15)

This repository is no longer maintained

Warning

This project along with other ones in OpenSTF organisation is provided as is for community, without active development.

You can check any other forks that may be actively developed and offer new/different features here.

Active development has been moved to DeviceFarmer organisation.

The problem discovered today

Make a mistake

const reader = await ApkReader.open('coins.apk');
const manifest = await reader.readManifest();
  Error: end of central directory record signature not found
      at /Users/workspace/demo/node_modules/yauzl/index.js:187:14
      at Immediate._onImmediate (/Users/workspace/demo/node_modules/yauzl/index.js:624:38)
      at runCallback (timers.js:705:18)
      at tryOnImmediate (timers.js:676:5)
      at processImmediate (timers.js:658:5)

Retrive Icon

Hello, I installed this library today, however I don't seem to get the Icon from an APK.
Is there any documentation regarding this subject?
Thanks.

RangeError: Index out of range

Error Stack:
7/26/2017, 4:01:22 PM ERR/storage:plugins:apk 24363 [*] Unable to read manifest of "ffa8c30f-7dcb-4482-b2d1-c02fda67713c" RangeError: Index out of range
at checkOffset (buffer.js:825:11)
at Buffer.readUInt16LE (buffer.js:871:5)
at BinaryXmlParser.readU16 (/Users/yangrenjie/gitlab/stellar-stf/node_modules/adbkit-apkreader/lib/apkreader/parser/binaryxml.js:98:25)
at BinaryXmlParser.readString (/Users/yangrenjie/gitlab/stellar-stf/node_modules/adbkit-apkreader/lib/apkreader/parser/binaryxml.js:296:16)
at BinaryXmlParser.readStringPool (/Users/yangrenjie/gitlab/stellar-stf/node_modules/adbkit-apkreader/lib/apkreader/parser/binaryxml.js:335:32)
at BinaryXmlParser.parse (/Users/yangrenjie/gitlab/stellar-stf/node_modules/adbkit-apkreader/lib/apkreader/parser/binaryxml.js:470:12)
at ManifestParser.parse (/Users/yangrenjie/gitlab/stellar-stf/node_modules/adbkit-apkreader/lib/apkreader/parser/manifest.js:140:33)
at /Users/yangrenjie/gitlab/stellar-stf/node_modules/adbkit-apkreader/lib/apkreader.js:103:44
at tryCatcher (/Users/yangrenjie/gitlab/stellar-stf/node_modules/adbkit-apkreader/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/Users/yangrenjie/gitlab/stellar-stf/node_modules/adbkit-apkreader/node_modules/bluebird/js/release/promise.js:512:31)
at Promise._settlePromise (/Users/yangrenjie/gitlab/stellar-stf/node_modules/adbkit-apkreader/node_modules/bluebird/js/release/promise.js:569:18)
at Promise._settlePromise0 (/Users/yangrenjie/gitlab/stellar-stf/node_modules/adbkit-apkreader/node_modules/bluebird/js/release/promise.js:614:10)
at Promise._settlePromises (/Users/yangrenjie/gitlab/stellar-stf/node_modules/adbkit-apkreader/node_modules/bluebird/js/release/promise.js:693:18)
at Async._drainQueue (/Users/yangrenjie/gitlab/stellar-stf/node_modules/adbkit-apkreader/node_modules/bluebird/js/release/async.js:133:16)
at Async._drainQueues (/Users/yangrenjie/gitlab/stellar-stf/node_modules/adbkit-apkreader/node_modules/bluebird/js/release/async.js:143:10)
at Immediate.Async.drainQueues (/Users/yangrenjie/gitlab/stellar-stf/node_modules/adbkit-apkreader/node_modules/bluebird/js/release/async.js:17:14)
at runCallback (timers.js:649:20)
at tryOnImmediate (timers.js:622:5)
at processImmediate [as _immediateCallback] (timers.js:594:5)

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="16"
    android:versionName="2.3.17"
    package="xxx.xxx.xxx">

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="22" />

    <uses-permission
        android:name="android.permission.INTERNET" />
    <uses-permission
        android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission
        android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission
        android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission
        android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission
        android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission
        android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission
        android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission
        android:name="android.permission.WRITE_SETTINGS" />

    <application
        android:theme="@ref/0x7f0d0004"
        android:label="@ref/0x7f0c0014"
        android:icon="@ref/0x7f0a0000"
        android:debuggable="true"
        android:allowBackup="true"
        android:supportsRtl="true">

        <activity
            android:name=".MainActivity">
            <intent-filter>
                <action
                    android:name="android.intent.action.MAIN" />
                <category
                    android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

adbkit-apkreader getting wrong fields from AndroidManifest

Good morning,

We are having issues with this plugin, it is reading the information of the AndroidManifest.xml incorrectly.

Instead of grabbing the package name it's grabbing the platformBuildVersionName instead.

We have an open issue on the google-play-vsts-extension regarding this issue. You have on there the manifest we are using plus the execution result of the adbkit-apkreader.

Best Regards

AndroidManifest not parsed correctly

AndroidManifest.xml.zip

apkreader 3.0.0 failed to parse this AXML. Only top-level info is extracted (versionCode) and the inner parts (permissions) are missing. No exception is thrown, though.

I am attaching the parsed result from jadx:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="27" android:versionName="1.2.9" package="com.vip.pinganedai">
    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="25"/>
    <permission android:name="com.vip.pinganedai.permission.JPUSH_MESSAGE" android:protectionLevel="signature"/>
    <uses-permission android:name="com.vip.pinganedai.permission.JPUSH_MESSAGE"/>
    <uses-permission android:name="android.permission.READ_CALL_LOG"/>
    <uses-permission android:name="android.permission.READ_SMS"/>
    <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.VIBRATE"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.READ_CALENDAR"/>
    <uses-permission android:name="android.permission.WRITE_CALENDAR"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_GPS"/>
    <uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS"/>
    <uses-permission android:name="android.permission.ACCESS_LOCATION"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.SEND_SMS"/>
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_UPDATES"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.GET_TASKS"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
    <uses-permission android:name="android.permission.READ_LOGS"/>
    <uses-permission android:name="android.permission.CALL_PHONE"/>
    <uses-permission android:name="android.permission.SET_DEBUG_APP"/>
    <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
    <uses-permission android:name="android.permission.USE_CREDENTIALS"/>
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-feature android:name="android.hardware.camera"/>
    <uses-feature android:name="android.hardware.camera.autofocus"/>
    <uses-permission android:name="android.permission.FLAG_GRANT_READ_URI_PERMISSION"/>
    <application android:theme="@style/AppTheme" android:label="中鸿贷" android:icon="@mipmap/applogo" android:name="com.vip.pinganedai.app.AppApplication" android:debuggable="true" android:allowBackup="true" android:hardwareAccelerated="true" android:supportsRtl="true">
        <meta-data android:name="UMENG_CHANNEL" android:value="Alpha"/>
        <meta-data android:name="UMENG_APPKEY" android:value="5aa73d8cb27b0a52570000f4"/>
        <activity android:theme="@style/Theme_AppLauncher" android:name="com.vip.pinganedai.ui.main.activity.SplashActivity" android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:theme="@style/dispatcher" android:name="com.vip.pinganedai.ui.main.scheme.ui.DispatcherActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:scheme="flashloan" android:host="www.xulu.com"/>
            </intent-filter>
        </activity>
        <activity android:name="com.vip.pinganedai.ui.main.activity.MainActivity" android:launchMode="singleTask" android:screenOrientation="portrait" android:configChanges="orientation" android:windowSoftInputMode="adjustUnspecified|stateHidden|adjustResize"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.CheckLoginActivity" android:launchMode="singleTop" android:screenOrientation="portrait" android:alwaysRetainTaskState="true"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.LoginActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.SmsActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.RegistActivity" android:launchMode="singleTask" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.main.activity.GuideActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.PhoneOperatorActivity" android:screenOrientation="portrait" android:configChanges="keyboardHidden|orientation|screenSize" android:windowSoftInputMode="adjustResize"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.FlashSettingsActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.FeedBackActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.LoanRecordsActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.UrgentLinkmanActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.main.activity.GuideH5Activity" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.main.activity.H5ZhanShiActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.UserLoadH5Activity" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.KeFuActivity" android:launchMode="singleTop" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.repayment.activity.CardPayStep2Activity" android:launchMode="singleTop" android:screenOrientation="portrait"/>
        <meta-data android:name="PARTNER_CODE" android:value="paed"/>
        <meta-data android:name="com.amap.api.v2.apikey" android:value="31b1545949994a55965d5d2405d0120c"/>
        <meta-data android:name="com.taobao.android.hotfix.IDSECRET" android:value="24779881-1"/>
        <meta-data android:name="com.taobao.android.hotfix.APPSECRET" android:value="1d8c622982666d37b871eab8dd31aa16"/>
        <meta-data android:name="com.taobao.android.hotfix.RSASECRET" android:value="MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDWptCZbC7u2I9+JkB0iSylG8mOxelibDe1BWezGPNwBdzsrRdNxbbtEacOq3mD7fyFvfNlw7Pau8G5lbKsrclMNuIkoD2DKMvSFzXuvvEXLFVQMbBF1v01OveOHyrvFsw6iWWdpAHTbkGpdcFnqnIemfwoaXKbGclXfuFR1AVrRV1vL+ebxXsNF7pwePsOALXzIgQPXcL+ShzOglg6/oFgdVj85Mhggnqr1ZpL/H9YRv/ef4sZu2LKfHXips3/vpeZTiqeYU1CFmmmSnsw3GSdKS3MM7Ig0s4tufv4lxwNOY1YQn0d1o1bwH1UNsMMLJstiQDXey83NB4jE/Zy92iNAgMBAAECggEBAI+u2EFqvjvZMKwztL+NNxpKcHAmoKPmZp/Av3qOQB4Dfq/a6ZeAuoMUZuwV8mBShM+NqAi9qH3JYtL0lsaqCe3/av8zWBmczFqUeOCYZc+qOG1W5XTKhXIFR8KVsGqcqxaf9CpCp4o86q0hitX2rS84yibO9w1FhJYR84eP0hTL/rt7sEfEh+v09PjRkG9cebCu91jGHJMR8yW5SC1z/3q08pu+3G4nBSXJZ9mRFNFRs+RrtCnNf+A48R2mZfMMUqZ6rCt2Utp88ik8OVs1RJWzY+Ux1/Q4WBqpCWBjQ0uAAeVHKhcIwStjxyjBqw3Ont3osyZn9tM7jGzwai1N4iECgYEA8/mLnUKBmBjEgeoO63jpqzRx9GxCAsCQ4KuzTRhIneAJjTGM29STqHYg8JQw2FDuaEPrXperYJ7exFNqcjwaSPEfzglL6o/i8dqSdLgHyll/nuZN+uBpmNhQ2Z9Kk99DYLXseXsc3Oe3XRAI3ht3mh3vpFcJAzqHzON3Do4voEUCgYEA4TtFppgw6r30tuI3VLX30kpwi/WXYAp5AG2wKA7i1yHKCdh3Ak0uN4QjYJND7UZX++wRoQqI6VGAYS7V0YLvgwbBjc3yufBSW4t3letKkFCbEiRhUV/E/nBD3L1l+hFQKAQ7oSdVW3yaQMvi2aPNWhvBzqaCudemcWZJPCYpX6kCgYEAm2d8D+q6A7jbCumdIU5+gQhCAfAnR/uDDSkxZ80tDCsVynMihzBr8aV1K+kpB9DdW1rQBQvVJRFtUl7T8fnowEee+62eRsXqSCXynhhPFgxWJ1AJoeDqQmqfbU9ywKg5EdQv0d2ir++FM+kvzNJwJ6Ij8GlkG0NgFxlYz9Ov8IUCgYBlEDKVqU6x1mCbO3B2e1xjKPHNa3rsJmbbMVzM7LkOrWO5/T6Rcs5dLNau/AWLz3elW+0hJNgAUYjYkqpw417TnVF2bsYOdu6Nk0wqojSIAxNCFb7xQ5biUL+yqe27Qs+D1TpoenzLm2Kf1pzI6b44Q6I4NvELsN9HnQ0Zh0ojWQKBgQDqi5nM6OuhXc/ZcnO126cgjye2gH0yVkgQvNxYoe/zFNLXrRYQHJQFDd4xAdZZ0yidqRH6j6wsDZw/RqAB7wsZwono2nFnQLrH/2+amWumHtSmomU6Oo/rCkvE/DQUuvZ1mplzlldSRO+kNdnX8n2zbKYHAGwOoxjHA4cZXGItqQ=="/>
        <service android:name="com.amap.api.location.APSService"/>
        <provider android:name="com.vip.pinganedai.utils.update.UpdateFileProvider" android:exported="false" android:authorities="com.vip.pinganedai.updatefileprovider" android:grantUriPermissions="true">
            <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/update_cache_path"/>
        </provider>
        <provider android:name="android.support.v4.content.FileProvider" android:exported="false" android:authorities="com.vip.pinganedai.fileprovider" android:grantUriPermissions="true">
            <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/>
        </provider>
        <activity android:name="com.megvii.livenesslib.LivenessActivity" android:screenOrientation="portrait"/>
        <activity android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" android:label="@string/app_name" android:name="com.megvii.idcardlib.IDCardScanActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.megvii.demo.BankCardScanActivity" android:launchMode="singleTop" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.ConfirmBankActivity" android:launchMode="singleTop" android:screenOrientation="portrait"/>
        <service android:name="cn.jpush.android.service.PushService" android:enabled="true" android:exported="false">
            <intent-filter>
                <action android:name="cn.jpush.android.intent.REGISTER"/>
                <action android:name="cn.jpush.android.intent.REPORT"/>
                <action android:name="cn.jpush.android.intent.PushService"/>
                <action android:name="cn.jpush.android.intent.PUSH_TIME"/>
            </intent-filter>
        </service>
        <provider android:name="cn.jpush.android.service.DataProvider" android:exported="false" android:authorities="com.vip.pinganedai.DataProvider"/>
        <service android:name="cn.jpush.android.service.DaemonService" android:enabled="true" android:exported="true">
            <intent-filter>
                <action android:name="cn.jpush.android.intent.DaemonService"/>
                <category android:name="com.vip.pinganedai"/>
            </intent-filter>
        </service>
        <provider android:name="cn.jpush.android.service.DownloadProvider" android:exported="true" android:authorities="com.vip.pinganedai.DownloadProvider"/>
        <receiver android:name="cn.jpush.android.service.PushReceiver" android:enabled="true">
            <intent-filter android:priority="1000">
                <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY"/>
                <category android:name="com.vip.pinganedai"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.USER_PRESENT"/>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_ADDED"/>
                <action android:name="android.intent.action.PACKAGE_REMOVED"/>
                <data android:scheme="package"/>
            </intent-filter>
        </receiver>
        <activity android:theme="@android:style/Theme.NoTitleBar" android:name="cn.jpush.android.ui.PushActivity" android:exported="false" android:configChanges="keyboardHidden|orientation">
            <intent-filter>
                <action android:name="cn.jpush.android.ui.PushActivity"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="com.vip.pinganedai"/>
            </intent-filter>
        </activity>
        <activity android:theme="@style/MyDialogStyle" android:name="cn.jpush.android.ui.PopWinActivity" android:exported="false" android:configChanges="keyboardHidden|orientation">
            <intent-filter>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="com.feilu.flashloan"/>
            </intent-filter>
        </activity>
        <receiver android:name="com.vip.pinganedai.hotfix.listener.MyPatchListener$ScreenBroadcastReceiver"/>
        <receiver android:name="cn.jpush.android.service.AlarmReceiver" android:exported="false"/>
        <receiver android:name="com.vip.pinganedai.jpush.JPushReceiver" android:enabled="true" android:exported="false">
            <intent-filter>
                <action android:name="cn.jpush.android.intent.REGISTRATION"/>
                <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED"/>
                <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED"/>
                <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED"/>
                <action android:name="cn.jpush.android.intent.CONNECTION"/>
                <category android:name="com.vip.pinganedai"/>
            </intent-filter>
        </receiver>
        <receiver android:name="com.vip.pinganedai.jpush.MyJPushMessageReceiver">
            <intent-filter>
                <action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE"/>
                <category android:name="com.vip.pinganedai"/>
            </intent-filter>
        </receiver>
        <service android:name="com.talkingdata.sdk.TDAntiCheatingService" android:process="com.talkingdata.sdk.TDAntiCheatingService">
            <intent-filter>
                <action android:name="com.talkingdata.sdk.TDAntiCheatingService"/>
            </intent-filter>
        </service>
        <meta-data android:name="TD_APP_ID" android:value="0932BC785A634E6A8846BEAF82BA0840"/>
        <meta-data android:name="TD_CHANNEL_ID" android:value="Alpha"/>
        <meta-data android:name="JPUSH_CHANNEL" android:value="developer-default"/>
        <meta-data android:name="JPUSH_APPKEY" android:value="bf63abd2565f38915fe13b43"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.AuthBindCardActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.SelectRelationActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.ModifyPasswordActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.BindBankCardActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.TransactionRecordActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.ProductDetailActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.MessageActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.AgreementActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.AuthPersonInfoActivity" android:screenOrientation="portrait" android:windowSoftInputMode="adjustPan"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.AddressManngerActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.BuySuccessActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.WriteAddressActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.AddressMapActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.AuthNewPersonInfoAct"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.AuthNewAgreementAct"/>
        <activity android:name="com.vip.pinganedai.ui.usercenter.activity.RepaymentWayActivity" android:screenOrientation="portrait"/>
        <activity android:theme="@style/Udesk_Theme" android:name="cn.udesk.activity.UdeskHelperActivity" android:configChanges="keyboardHidden|navigation|orientation|uiMode|screenSize"/>
        <activity android:theme="@style/Udesk_Theme" android:name="cn.udesk.activity.UdeskHelperArticleActivity" android:configChanges="keyboardHidden|navigation|orientation|uiMode|screenSize"/>
        <activity android:theme="@style/Udesk_Theme" android:name="cn.udesk.activity.UdeskRobotActivity" android:configChanges="keyboardHidden|orientation" android:windowSoftInputMode="adjustUnspecified|stateVisible|adjustResize"/>
        <activity android:theme="@style/Udesk_Theme" android:name="cn.udesk.activity.UdeskFormActivity" android:launchMode="singleTop" android:configChanges="keyboardHidden|navigation|orientation|uiMode|screenSize"/>
        <activity android:theme="@style/Udesk_Theme" android:name="cn.udesk.activity.UdeskChatActivity" android:launchMode="singleTop" android:configChanges="keyboardHidden|navigation|orientation|uiMode|screenSize"/>
        <activity android:theme="@style/Udesk_Theme" android:name="cn.udesk.activity.UdeskZoomImageActivty" android:configChanges="keyboardHidden|navigation|orientation|uiMode|screenSize"/>
        <activity android:theme="@style/transcutestyle" android:name="cn.udesk.activity.SurvyDialogActivity" android:configChanges="keyboardHidden|navigation|orientation|uiMode|screenSize"/>
        <activity android:theme="@style/Udesk_Theme" android:name="cn.udesk.activity.OptionsAgentGroupActivity" android:configChanges="keyboardHidden|navigation|orientation|uiMode|screenSize"/>
        <activity android:theme="@style/Udesk_Theme" android:name="cn.udesk.activity.UdeskWebViewUrlAcivity" android:configChanges="keyboardHidden|navigation|orientation|uiMode|screenSize"/>
        <meta-data android:name="android.support.VERSION" android:value="25.4.0"/>
        <service android:name="com.taobao.sophix.aidl.DownloadService" android:exported="true">
            <intent-filter>
                <action android:name="com.taobao.hotfix.action"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </service>
    </application>
</manifest>

Can I use it in browser with webpack?

I try to use it in browser with webpack, but brower complain about fs.open is not a function. How can I add fs module to make it work in browser. Thank you!

Feature request: read icon

Is it possible to use this library to retrieve the icon? I guess knowing the path using usingFileStream () would work but how to get the path?

STF cannot install apk error

INF/storage:temp 14483 [] Uploaded "com.eg.android.AlipayGphone.1512041827.apk" to "/tmp/upload_4661586ca7a0226fcb7ee3f55b9db4ad"
Dec 07 14:11:55 odroid stf[14427]: ERR/storage:plugins:apk 14493 [
] Unable to read manifest of "8d25b9bd-5f9a-4498-9f74-cfa46d549ee7" Error: Invalid or unsupported zip format. No END header found
Dec 07 14:11:55 odroid stf[14427]: at new ApkReader (/root/STF/node_modules/adbkit-apkreader/lib/apkreader.js:27:17)
Dec 07 14:11:55 odroid stf[14427]: at Function.ApkReader.readFile (/root/STF/node_modules/adbkit-apkreader/lib/apkreader.js:16:14)
Dec 07 14:11:55 odroid stf[14427]: at /root/STF/lib/units/storage/plugins/apk/task/manifest.js:9:30
Dec 07 14:11:55 odroid stf[14427]: at doNTCallback0 (node.js:408:9)
Dec 07 14:11:55 odroid stf[14427]: at process._tickCallback (node.js:337:13)

Thanks.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.