Apk parser for java

Related tags

Utility apk-parser
Overview

APK parser lib, for decoding binary XML files, getting APK meta info.

Table of Contents

Features

  • Retrieve APK meta info, such as title, icon, package name, version, etc.
  • Parse and convert binary XML files to text
  • Get classes from DEX files
  • Get APK singer info

Get APK-parser

Get APK-parser from the Maven Central Reposotiry:

<dependency>
    <groupId>net.dongliu</groupId>
    <artifactId>apk-parser</artifactId>
    <version>2.6.10</version>
</dependency>

From version 2.0, apk-parser requires Java 7. The last version to support Java 6 is 1.7.4.

Usage

The ordinary way is using the ApkFile class, which contains convenient methods to get AndroidManifest.xml, APK info, etc. The ApkFile need to be closed when no longer used. There is also a ByteArrayApkFile class for reading APK files from byte array.

1. APK Info

ApkMeta contains name(label), packageName, version, SDK, used features, etc.

try (ApkFile apkFile = new ApkFile(new File(filePath))) {
    ApkMeta apkMeta = apkFile.getApkMeta();
    System.out.println(apkMeta.getLabel());
    System.out.println(apkMeta.getPackageName());
    System.out.println(apkMeta.getVersionCode());
    for (UseFeature feature : apkMeta.getUsesFeatures()) {
        System.out.println(feature.getName());
    }
}
2. Get Binary XML and Manifest XML Files
try (ApkFile apkFile = new ApkFile(new File(filePath))) {
    String manifestXml = apkFile.getManifestXml();
    String xml = apkFile.transBinaryXml("res/menu/main.xml");
}
3. Get DEX Classes
try(ApkFile apkFile = new ApkFile(new File(filePath))) {
    DexClass[] classes = apkFile.getDexClasses();
    for (DexClass dexClass : classes) {
        System.out.println(dexClass);
    }
}
4. Get APK Signing Info

Get the APK signer certificate info and other messages, using:

try(ApkFile apkFile = new ApkFile(new File(filePath))) {
    List<ApkSigner> signers = apkFile.getApkSingers(); // apk v1 signers
    List<ApkV2Signer> v2signers = apkFile.getApkV2Singers(); // apk v2 signers
}
5. Locales

An APK may have different info (title, icon, etc.) for different regions and languages——or we can call it a "locale". If a locale is not set, the default "en_US" locale (Locale.US) is used. You can set a preferred locale by:

try (ApkFile apkFile = new ApkFile(new File(filePath))) {
    apkFile.setPreferredLocale(Locale.SIMPLIFIED_CHINESE);
    ApkMeta apkMeta = apkFile.getApkMeta();
}

APK-parser will find the best matching languages for the locale you specified.

If locale is set to null, ApkFile will not translate the resource tag, and instead just give the resource ID. For example, the title will be something like '@string/app_name' instead of the real name.

Reporting Issues

If this parser has any problem with a specific APK, open a new issue, with a link to download the APK file.

Comments
  • Slow parsing of APK files

    Slow parsing of APK files

    I tried to check how much time it takes to parse APK files using this library, compared to the one of Android's framework.

    I know it's a bit hard to compare performance, but I tried to get it anyway.

    So I went over all installed apps, taking all flags possible for packageManager.getInstalledPackages , and getting the name of each app.

    And I did it for the library itself. I know the library does a lot more, but I think it can be better if we tell it exactly what to do.

    The results are quite bad (tested on Pixel 2). It took 3555 ms to use the Android framework. But, it took 27088 ms to use this library.

    Attached here the sample project.

    My Application.zip

    Is it possible to split the various parsing tasks in the library? Something that could match the one of Android framework?

    When I don't give any flags and not getting the names of the apps, it's even much faster (less than 100ms)...

    It doesn't get the app name and icons, but I can do it later on a different task.

    Is there a way to make it faster? To match the same performance, and delay loading of things that might not even be needed?

    Maybe to parse only the manifest file, and later the rest, if needed?

    opened by AndroidDeveloperLB 14
  • java.lang.StackOverflowError

    java.lang.StackOverflowError

    When i parse the com.google.android.apps.giant apk

    Exception in thread "main" java.lang.StackOverflowError at net.dongliu.apk.parser.struct.ResourceValue$ReferenceResourceValue.(ResourceValue.java:127) at net.dongliu.apk.parser.struct.ResourceValue.reference(ResourceValue.java:46) at net.dongliu.apk.parser.utils.ParseUtils.readResValue(ParseUtils.java:170) at net.dongliu.apk.parser.struct.resource.Type.readResourceEntry(Type.java:78) at net.dongliu.apk.parser.struct.resource.Type.getResourceEntry(Type.java:46) at net.dongliu.apk.parser.struct.resource.ResourceTable.getResourcesById(ResourceTable.java:68) at net.dongliu.apk.parser.struct.ResourceValue$ReferenceResourceValue.toStringValue(ResourceValue.java:146) at net.dongliu.apk.parser.struct.resource.ResourceEntry.toStringValue(ResourceEntry.java:42) at net.dongliu.apk.parser.struct.ResourceValue$ReferenceResourceValue.toStringValue(ResourceValue.java:170) at net.dongliu.apk.parser.struct.resource.ResourceEntry.toStringValue(ResourceEntry.java:42) at net.dongliu.apk.parser.struct.ResourceValue$ReferenceResourceValue.toStringValue(ResourceValue.java:170) at net.dongliu.apk.parser.struct.resource.ResourceEntry.toStringValue(ResourceEntry.java:42) at net.dongliu.apk.parser.struct.ResourceValue$ReferenceResourceValue.toStringValue(ResourceValue.java:170) at net.dongliu.apk.parser.struct.resource.ResourceEntry.toStringValue(ResourceEntry.java:42) at net.dongliu.apk.parser.struct.ResourceValue$ReferenceResourceValue.toStringValue(ResourceValue.java:170) at net.dongliu.apk.parser.struct.resource.ResourceEntry.toStringValue(ResourceEntry.java:42)

    opened by huangshaobb 6
  • Don't crash with a buffer underflow when packageCount == 0

    Don't crash with a buffer underflow when packageCount == 0

    This fixes #125

    I don't normally see this issue, the particular exception is on com.citymapper.app.release, versionCode 1009500, inside split_kyc2.config.xxxhdpi

    opened by paulo-raca 5
  • fail parse minSdkVersion

    fail parse minSdkVersion

    using version: compile group: 'net.dongliu', name: 'apk-parser', version: '2.6.5' test code: String minSdkVersion= apkMeta.getMinSdkVersion();` java version: "1.8.0_152" default

    The minSdkVersion is defined in the manifestXml, but is empty when parsing.

    opened by Kecin-Chen 5
  • Failure to parse the icon name and label

    Failure to parse the icon name and label

    The apk meta parser fails to parse the icon name and label for the attached apk file, although it seems to be present correctly in the application line. example.zip

    opened by mampcs 5
  • 对于16进制的字符串不应该直接转成10进制,这样会造成不一致

    对于16进制的字符串不应该直接转成10进制,这样会造成不一致

    对于16进制的字符串不应该直接转成10进制,这样会造成不一致

        public static ResourceEntity readResValue(ByteBuffer buffer, StringPool stringPool) {
            ResValue resValue = new ResValue();
            resValue.setSize(Buffers.readUShort(buffer));
            resValue.setRes0(Buffers.readUByte(buffer));
            resValue.setDataType(Buffers.readUByte(buffer));
    
            switch (resValue.getDataType()) {
                case ResValue.ResType.INT_DEC:
                case ResValue.ResType.INT_HEX:
                    resValue.setData(new ResourceEntity(buffer.getInt()));
    

    建议对于16进制的数,还是先转换成16进制。

    opened by shwenzhang 5
  • Bug : unknown protection level?

    Bug : unknown protection level?

    When I give it the APK of the package "android", it crashed on this:

     Caused by: java.lang.IllegalArgumentException: 18 is not a constant in net.dongliu.apk.parser.bean.Constants$ProtectionLevel
            at java.lang.Enum.valueOf(Enum.java:198)
            at net.dongliu.apk.parser.bean.Constants$ProtectionLevel.valueOf(Constants.java:146)
            at net.dongliu.apk.parser.ApkParser.parsePermission(ApkParser.java:363)
            at net.dongliu.apk.parser.ApkParser.parseApkMeta(ApkParser.java:208)
            at net.dongliu.apk.parser.ApkParser.getApkMeta(ApkParser.java:104)
    

    and indeed, I've tried debugging, and got a value of "18" for the protection level. The weird thing is that I don't see it documented anywhere: http://developer.android.com/guide/topics/manifest/permission-element.html

    After some searching, I've found this: http://stackoverflow.com/q/13515197/878126

    Please fix this issue.

    I think you need to make it a non-enum thing. It's more like an EnumSet . The file to change is "Constants.java" , at "ProtectionLevel" class.

    Also, BTW, it's more common to set enum values in uppercase...

    opened by AndroidDeveloperLB 5
  • The obtained AndroidManifest.xml differs from original

    The obtained AndroidManifest.xml differs from original

    I try to use the tool to obtain AndroidManifest.xml of an apk file. But attribute with boolean type are all set to "false" while the original value should be "true"...

    opened by mjblackhorse 4
  • throw error net.dongliu.apk.parser.exception.ParserException

    throw error net.dongliu.apk.parser.exception.ParserException

    hello,

        when i call the tool ,all other apks works fine,only this one throw exception:
    

    net.dongliu.apk.parser.exception.ParserException: Unexpected chunk type:0 at net.dongliu.apk.parser.parser.BinaryXmlParser.readChunkHeader(BinaryXmlParser.java:321) at net.dongliu.apk.parser.parser.BinaryXmlParser.parse(BinaryXmlParser.java:54) at net.dongliu.apk.parser.AbstractApkParser.transBinaryXml(AbstractApkParser.java:164) at net.dongliu.apk.parser.AbstractApkParser.parseManifestXml(AbstractApkParser.java:123) at net.dongliu.apk.parser.AbstractApkParser.parseApkMeta(AbstractApkParser.java:105) at net.dongliu.apk.parser.AbstractApkParser.getApkMeta(AbstractApkParser.java:56) at yunnex.hop.web.controller.ApplicationController.apkUpload(ApplicationController.java:199) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869) at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843) at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61) at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449) at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365) at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383) at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745)

    opened by AlloyMan 4
  • Questions about the license

    Questions about the license

    Sorry for this, but I'm not a lawyer and English isn't my main language :

    1. Is it ok to port this repo to a project that works on Android, and publish it on Github?
    2. Is it ok to use the library on a real app?
    3. Do I have to make the app open sourced too? Make the part that uses this repo open sourced?
    4. What exactly do I have to do?
    opened by AndroidDeveloperLB 4
  • not about issues...

    not about issues...

    Is there any way to get the value of launchable-activity?

    Currently I add some stupid codes in ApkMetaConstructor after if (currentTag.equals("uses-permission"):

    else if (name.equals("name")) {
        if (!isLaunchableActivitySetted && (
            value.equals("android.intent.action.MAIN") ||
            value.equals("android.intent.category.LAUNCHER") )) {
            apkMeta.setLaunchableActivity(launchableActivity);
            isLaunchableActivitySetted = true;
            } else {
                launchableActivity = value;
            }
        }
    }
    

    I am sure it will always work :-[

    btw, some lines are added to R.style.html. I generated a new one yesterday: https://dl.dropboxusercontent.com/u/1652957/r_styles.conf

    opened by tastypear 4
  • signature field of CertificateMeta was removed in v2.6.10

    signature field of CertificateMeta was removed in v2.6.10

    I am using version v2.6.9 but I encountered issue when parsing v2 signed APK (BufferOverFlow) which v2.6.10 can fix. Thus, I was forced to update version to v2.6.10. I noticed that in v2.6.10 'signature' field was removed in net.dongliu.apk.parser.bean.CertificateMeta bean. What is the alternative of 'signature' field so that I can get the same value? Thank you.

    opened by erickdelrey 5
  • Bug: sometimes can't get any correct app-icon

    Bug: sometimes can't get any correct app-icon

    See this APK for example:

    base.zip

    It's supposed to be as such:

    image

    But, it has only 2 icons that it returns me when calling ApkFile(filePath).allIcons : 0 = {Icon@9908} "Icon{path='res/xm.png', density=0, size=4716}" This image is just this one:

    xm

    1 = {AdaptiveIcon@9909} "AdaptiveIcon{foreground=null, background=null}" For some reason I can't find the path right away, so what I did is to get apkMetaTranslator.iconPaths. So, the matching IconPath for it is IconPath{path='res/uG.xml', density=0} I used this online tool, and got this content:

    <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:aapt="http://schemas.android.com/aapt">
        <background>
            <bitmap android:src="@mipmap/adaptiveproduct_one_background_color_108"/>
        </background>
        <foreground>
            <bitmap android:src="@mipmap/adaptiveproduct_one_foreground_color_108"/>
        </foreground>
    </adaptive-icon>
    

    This file doesn't exist in the folders, but somehow it exists inside somewhere else, probably in "resources.arsc". I've found the file using both of these tools:

    http://www.javadecompilers.com/apk http://www.javadecompilers.com/apktool

    This is what I got, here .

    How could it be? Opening the APK as a ZIP file doesn't show those files. But, I can see a file called "fV" in "res" folder which takes quite a lot, and I think it's the one that holds the extra content.

    opened by AndroidDeveloperLB 0
  • Suggestion: here's how you might be able to parse VectorDrawable

    Suggestion: here's how you might be able to parse VectorDrawable

    This, which is based on this.

    The problem there is that it's using reflection.

    However, the reflection is just to parse binary XML files, which I think the current repository can already do (using BinaryXmlParser, kinda) , no?

    I tried using other methods, but it caused an exception of java.lang.ClassCastException: android.util.XmlPullAttributes cannot be cast to android.content.res.XmlBlock$Parser , so maybe it wants to use only the reflected XmlBlock class...

    :(

    opened by AndroidDeveloperLB 0
  • Request: ditch bouncycastle dependency

    Request: ditch bouncycastle dependency

    Seems it can work fine without it. And it's not even the default way to get the signatures of an APK.

    I've noticed that this library alone takes 3.3 MB , having about 24-25K methods count...

    Is it really needed and useful? Why not remove it?

    opened by AndroidDeveloperLB 0
  • Bug: unable to get correct app label/name for some APKs

    Bug: unable to get correct app label/name for some APKs

    v2.6.10

    Found out that for some APK files, it failed to get their label/name. Sometimes it returns null, so in this case I used the package name according to the docs, but it can still be wrong.

    Attached here the problematic APK files:

    problematic apk files.zip

    This is the log from my sample of testing it on the emulator (found on emulator API 29) :

    E: apk label is different for /system/app/GoogleExtShared/GoogleExtShared.apk : correct one is: Android Shared Library vs found: {7:65536}
    E: apk label is different for /system/app/RcsService/RcsService.apk : correct one is: com.android.service.ims.RcsServiceApp vs found: com.android.service.ims
    E: apk label is different for /system/priv-app/NetworkPermissionConfig/NetworkPermissionConfig.apk : correct one is: com.android.server.NetworkPermissionConfig vs found: com.google.android.networkstack.permissionconfig
    

    And here's how I tested it:

    https://github.com/AndroidDeveloperLB/apk-parser

    EDIT: found more APKs, this time of Xiaomi Redmi 8 Android 9:

    problematic apk files2.zip

    Logs:

    E: apk label is different for /system/priv-app/GoogleExtServices/GoogleExtServices.apk : correct one is: Android Services Library vs found: {7:131072}
    E: apk label is different for /system/app/GoogleExtShared/GoogleExtShared.apk : correct one is: Android Shared Library vs found: {7:131072}
    E: apk label is different for /system/priv-app/CNEService/CNEService.apk : correct one is: com.quicinc.cne.CNEService.CNEServiceApp vs found: com.quicinc.cne.CNEService
    E: apk label is different for /system/priv-app/RtMiCloudSDK/RtMiCloudSDK.apk : correct one is: com.xiaomi.micloudsdk.SdkApplication vs found: com.xiaomi.micloud.sdk
    E: apk label is different for /system/app/miuisystem/miuisystem.apk : correct one is: com.miui.internal.app.SystemApplication vs found: com.miui.system
    E: apk label is different for /system/app/FileExplorer_old/FileExplorer_old.apk : correct one is: com.android.fileexplorer.FileExplorerApplication vs found: com.android.fileexplorer
    E: apk label is different for /system/app/SmsExtra/SmsExtra.apk : correct one is: com.miui.smsextra.internal.SmsExtraApp vs found: com.miui.smsextra
    E: apk label is different for /system/app/ThemeModule/ThemeModule.apk : correct one is: miui.external.Application vs found: com.android.thememanager.module
    
    opened by AndroidDeveloperLB 0
Releases(v2.6.7)
Owner
Hsiafan
Smilence
Hsiafan
APK parser for Android

APK Parser Features Retrieve basic apk metas, such as title, icon, package name, version, etc. Parse and convert binary xml file to text Classes from

Jared Rummler 613 Dec 20, 2022
Parser and Expression Evaluator for Logic Statements

LogicParser Parser and Expression Evaluator for Logic Statements: The steps behind the whole process of evaluating a given logic statement encompass:

Bărbuț-Dică Sami 1 Dec 8, 2021
🧹 Error correcting parser plugin

Tidyparse The main goal of this project is to speed up the process of learning a new language by suggesting ways to fix source code. Tidyparse expects

breandan 5 Dec 15, 2022
UE Capability parser used by smartphonecombo.it and cacombos.com

UE Capability Parser Warning Work In progress UE Capability parser used by smartphonecombo.it and cacombos.com $ java -jar uecapabilityparser.jar --he

Andrea Mennillo 4 Oct 16, 2022
Scanning APK file for URIs, endpoints & secrets.

APKLeaks Scanning APK file for URIs, endpoints & secrets. Installation from Pypi from Source from Docker Usage Options Output Pattern Pattern Argument

Dwi Siswanto 3.5k Jan 9, 2023
WebSocket & WAMP in Java for Android and Java 8

Autobahn|Java Client library providing WAMP on Java 8 (Netty) and Android, plus (secure) WebSocket for Android. Autobahn|Java is a subproject of the A

Crossbar.io 1.5k Dec 9, 2022
General purpose utilities and hash functions for Android and Java (aka java-common)

Essentials Essentials are a collection of general-purpose classes we found useful in many occasions. Beats standard Java API performance, e.g. LongHas

Markus Junginger 1.4k Dec 29, 2022
WebSocket & WAMP in Java for Android and Java 8

Autobahn|Java Client library providing WAMP on Java 8 (Netty) and Android, plus (secure) WebSocket for Android. Autobahn|Java is a subproject of the A

Crossbar.io 1.5k Dec 9, 2022
General purpose utilities and hash functions for Android and Java (aka java-common)

Essentials Essentials are a collection of general-purpose classes we found useful in many occasions. Beats standard Java API performance, e.g. LongHas

Markus Junginger 1.4k Dec 29, 2022
Java implementation of a Disk-based LRU cache which specifically targets Android compatibility.

Disk LRU Cache A cache that uses a bounded amount of space on a filesystem. Each cache entry has a string key and a fixed number of values. Each key m

Jake Wharton 5.7k Dec 31, 2022
a simple cache for android and java

ASimpleCache ASimpleCache 是一个为android制定的 轻量级的 开源缓存框架。轻量到只有一个java文件(由十几个类精简而来)。 1、它可以缓存什么东西? 普通的字符串、JsonObject、JsonArray、Bitmap、Drawable、序列化的java对象,和 b

Michael Yang 3.7k Dec 14, 2022
Runtime code generation for the Java virtual machine.

Byte Buddy runtime code generation for the Java virtual machine Byte Buddy is a code generation and manipulation library for creating and modifying Ja

Rafael Winterhalter 5.3k Jan 7, 2023
gRPC and protocol buffers for Android, Kotlin, and Java.

Wire “A man got to have a code!” - Omar Little See the project website for documentation and APIs. As our teams and programs grow, the variety and vol

Square 3.9k Dec 31, 2022
A lightning fast, transactional, file-based FIFO for Android and Java.

Tape by Square, Inc. Tape is a collection of queue-related classes for Android and Java. QueueFile is a lightning-fast, transactional, file-based FIFO

Square 2.4k Dec 30, 2022
UPnP/DLNA library for Java and Android

Cling EOL: This project is no longer actively maintained, code may be outdated. If you are interested in maintaining and developing this project, comm

4th Line 1.6k Jan 4, 2023
Error handling library for Android and Java

ErrorHandler Error handling library for Android and Java Encapsulate error handling logic into objects that adhere to configurable defaults. Then pass

null 237 Dec 29, 2022
Trail is a simple logging system for Java and Android. Create logs using the same API and the library will detect automatically in which platform the code is running.

Trail Trail is a simple logging system for Java and Android. Create logs using the same API and the library will detect automatically in which platfor

Mauricio Togneri 13 Aug 29, 2022
Multiplaform kotlin library for calculating text differences. Based on java-diff-utils, supports JVM, JS and native targets.

kotlin-multiplatform-diff This is a port of java-diff-utils to kotlin with multiplatform support. All credit for the implementation goes to original a

Peter Trifanov 51 Jan 3, 2023
java.io.File compatible SAF library

DocumentFileX java.io.File compatible SAF implementation Tired of SAF bullshits? Implement SAF with ease! This library is in alpha stage. Most feature

null 24 Aug 25, 2022