javascript - 是否可以用 JavaScript 解析 .apk 文件?

标签 javascript android python apk

<分区>

我们有解析 .apk 文件的 Python 代码。我们想用 JavaScript 完成,然后将文件直接上传到 S3。是否可以?如果是,我们该怎么做?如有必要,我们可以使用现有的插件。

这是解析文件的 Python 代码:

import os
import urllib2
import StringIO
import re

from django.conf import settings
from django.core.files.uploadedfile import InMemoryUploadedFile

from androguard.core.bytecodes.apk import APK
from storages.backends.s3boto import S3BotoStorage

from parser import Parser


class APKParser(Parser):

    def __init__(self, filepath):
        if filepath.startswith("http://") or filepath.startswith("https://"):
            conn = urllib2.urlopen(filepath)
            self.apk = APK(conn.read(), raw=True)
            conn.close()
        else:
            self.apk = APK(filepath)
        self.apk_xml = self.apk.get_AndroidManifest()

    def get_version(self):
        manifest = self.apk_xml.getElementsByTagName("manifest")[0]
        return manifest.getAttribute("android:versionName")

    def get_name(self):
        app = self.apk_xml.getElementsByTagName("application")[0]
        name = app.getAttribute("android:label")
        if name.startswith("@"):
            package_parser = self.apk.get_android_resources()
            name = ''
            for package_name in package_parser.get_packages_names():
                name = package_parser.get_string(package_name, 'app_name')
                if name:
                    name = name[1]
                    break
        return name

    def get_package_name(self):
        return self.apk.package

    def get_image(self, content_item):
        storage = S3BotoStorage(bucket=settings.AWS_MANAGED_CONTENT_SETS_STORAGE_BUCKET_NAME,
                                secure_urls=settings.SECURE_IMAGES_URL)
        filepath = ""
        for apk_file in self.apk.get_files():
            if re.match("(res/drawable.*/(icon|logo).*)", apk_file):
                filepath = apk_file
                break
        if filepath:
            try:
                fileext = os.path.splitext(filepath)[1][1:]
                file_io = StringIO.StringIO()
                file_io.write(self.apk.get_file(filepath))
                icon_filename = "%s.%s" % (self.get_name(), fileext)
                inmemory_file = InMemoryUploadedFile(file_io, None, icon_filename, 'image/%s' % fileext,
                                                     file_io.len, None)
                inmemory_file.seek(0)
                upl_file = uploaded_filename(content_item, inmemory_file.name)
                storage._save(upl_file, inmemory_file)
                file_io.close()
                return dict(url=storage.url(upl_file), path=upl_file)
            except:
                pass
        return dict()

最佳答案

APK 文件只是一个 ZIP file包含一堆 XML 文件、 Assets 和类文件。 Javascript 可以读取 XML 文件没有问题,但它需要外部库来解压缩 zip 文件。解码类文件将非常困难,但我想您可能不需要这样做。

唯一的困难是,如果您需要在修改后重新压缩文件。如果你不想要安全警告,你可能需要重新签名包(这可能是不可能的,除非你有原始私钥)。您还需要能够生成 APK 元数据。这可能非常困难。

关于javascript - 是否可以用 JavaScript 解析 .apk 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23323941/

相关文章:

android - 联系人 LOOKUP_KEY 有多持久?

android - Admob 需要未发布应用程序的市场网址(需要 MY_AD_UNIT_ID)

android 如何在布局开始时添加 View ?

python - 通过序列化或内存中 KV 存储缓存 Pandas Dataframe

javascript - 谷歌地图 API 与防暴

javascript - Jquery if 条件为鼠标离开或鼠标进入

python - 自动构建可执行文件

python - 如何合并 pyspark 和 pandas 数据框

javascript - 我什么时候可以同步使用 Meteor.call?

Javascript 菜单项图像不粘