All Projects → IMFWorks → Android-So-Handler

IMFWorks / Android-So-Handler

Licence: other
支持APK包中所有System.Load/LoadLibrary加载的So库文件(Maven、aar文件引入三方库、源码引入的so文件),对So文件进行7z压缩与云端下发,完成apk瘦身

Programming Languages

c
50402 projects - #5 most used programming language
java
68154 projects - #9 most used programming language
kotlin
9241 projects
groovy
2714 projects
CMake
9771 projects
shell
77523 projects
C++
36643 projects - #6 most used programming language

Projects that are alternatives of or similar to Android-So-Handler

Gradle Swagger Generator Plugin
Gradle plugin for OpenAPI YAML validation, code generation and API document publishing
Stars: ✭ 197 (+207.81%)
Mutual labels:  gradle-plugin
Avito Android
Infrastructure of Avito android
Stars: ✭ 253 (+295.31%)
Mutual labels:  gradle-plugin
codeartifact-gradle-plugin
Codeartifact gradle plugin
Stars: ✭ 14 (-78.12%)
Mutual labels:  gradle-plugin
Javafx Gradle Plugin
Gradle plugin that makes it easy to work with JavaFX 11+
Stars: ✭ 214 (+234.38%)
Mutual labels:  gradle-plugin
Gradle Cargo Plugin
Gradle plugin that provides deployment capabilities to local and remote containers via Cargo
Stars: ✭ 238 (+271.88%)
Mutual labels:  gradle-plugin
gradle-syntastic-plugin
A Gradle plugin for integrating your Java project with Vim and Syntastic.
Stars: ✭ 45 (-29.69%)
Mutual labels:  gradle-plugin
Jarfilterplugin
Help exclude classes before building the JAR into Android DEX archives.
Stars: ✭ 189 (+195.31%)
Mutual labels:  gradle-plugin
blowdryer
Keep your gradle builds dry 干
Stars: ✭ 22 (-65.62%)
Mutual labels:  gradle-plugin
Coveralls Gradle Plugin
👨‍🔧 gradle plugin for coveralls
Stars: ✭ 250 (+290.63%)
Mutual labels:  gradle-plugin
ConfigDroid
Gradle plugin to generate config classes for your Android projects
Stars: ✭ 31 (-51.56%)
Mutual labels:  gradle-plugin
Badass Jlink Plugin
Create a custom runtime image of your modular application
Stars: ✭ 216 (+237.5%)
Mutual labels:  gradle-plugin
Gradle Android Git Version
A gradle plugin to calculate Android-friendly version names and codes from git tags
Stars: ✭ 227 (+254.69%)
Mutual labels:  gradle-plugin
editorconfig-gradle-plugin
A Gradle plugin for checking whether project files comply with format rules defined in .editorconfig files and eventually also for fixing the violations
Stars: ✭ 40 (-37.5%)
Mutual labels:  gradle-plugin
Gradle Errorprone Plugin
Gradle plugin to use the error-prone compiler for Java
Stars: ✭ 202 (+215.63%)
Mutual labels:  gradle-plugin
badass-runtime-plugin
Create a custom runtime image of your non-modular application
Stars: ✭ 143 (+123.44%)
Mutual labels:  gradle-plugin
Gradle Baseline
A set of Gradle plugins that configure default code quality tools for developers.
Stars: ✭ 191 (+198.44%)
Mutual labels:  gradle-plugin
AndroidLintReporter
Gradle Plugin to report Android Lint and Detekt result back to Github Pull Request
Stars: ✭ 22 (-65.62%)
Mutual labels:  gradle-plugin
gradle-flatbuffers-plugin
Gradle plugin for generating code from Google FlatBuffers schemas
Stars: ✭ 20 (-68.75%)
Mutual labels:  gradle-plugin
jacoco-gradle-testkit-plugin
Gradle plugin for JaCoCo code coverage in tests using Gradle TestKit
Stars: ✭ 37 (-42.19%)
Mutual labels:  gradle-plugin
gradle-natives
Gradle plugin to aid in managing native libraries associated with Java-based projects.
Stars: ✭ 32 (-50%)
Mutual labels:  gradle-plugin

Android-So-Handler

减包工具集合 , 通过处理so库实现减包

特点如下:

  1. 支持APK中所有通过System.Load/LoadLibrary加载的So库文件(包含Maven、aar等方式引入三方库与源码中的so文件)进行处理。
  2. 支持7z压缩与云端下发
  3. 对项目代码侵入少,如果只是压缩so库,只需一行初始化AssetsSoLoadBy7zFileManager.init(v.getContext());即可。
  4. 云端下发so库需要在init中传入NeedDownloadSoistener自行下载,并在下载后调用SoFileInfo#insertOrUpdateCache(saveLibsDir,File)插入缓存即可,需要在加载前插入缓存

数据对比:

仅仅在加载时通过记录的MD5判断是否存在,不存在解压,存在则跳过直接加载。 这里通过压缩时记录的MD5判断是否需要解压更新不依赖apk版本减少解压次数。

so库名称 apk包中所占大小 7z极限压缩大小 解压后实际大小 解压耗时(毫秒)
RTCStatistics 1331kb(1.3M) 958kb 2752kb(2.68M) 109
flutter(Debug版本) 10,547kb(10.3M) 6360kb 23358kb(22.8M) 700
bd_idl_pass_token 9.6k 8kb 17kb 3
idl_license 63.3kb 51kb 113kb 6
FaceSDK 269.5kb 220kb 450kb 25
turbonet 1,638.4kb(1.6M) 1258kb 2737kb 167
gnustl_shared 273.7kb 195kb 693kb 28
xiaoyuhost 426.9kb 309kb 1009kb(1M) 48
crab_native 57.7kb 44kb 109kb 7

apk包中所占大小: apk属于zip压缩 所以apk包中已经为zip压缩后大小

7z极限压缩大小: 7z极限压缩大小是执行7z a xxx.7z libxxx.so -t7z -mx=9 -m0=LZMA2 -ms=10m -mf=on -mhc=on -mmt=on -mhcf 压缩后大小

解压后实际大小: 指so文件实际大小,AndroidStudio中文件大小

解压耗时(毫秒): 统计手机为谷歌Pixel 2XL 骁龙835处理器

接入方式如下:

ps:配置较多全可走默认 ~_ ~!

  1. 根build.gradle中加入
buildscript {
    repositories {
        maven { url "https://raw.githubusercontent.com/IMFWorks/Android-So-Handler/master/maven" }
    }
}
allprojects {
    repositories {
      maven { url "https://raw.githubusercontent.com/IMFWorks/Android-So-Handler/master/maven" }
    }
}
  1. 复制工程下so-file-config.gradle到工程根目录
  2. 工程根目录gradle.properties中添加SO_PLUGIN_VERSION=0.0.6 build.gradle中添加classpath "com.imf.so:load-hook-plugin:${SO_PLUGIN_VERSION}"classpath "com.imf.so:file-plugin:${SO_PLUGIN_VERSION}"
  3. appbuild.gradle中添加apply from: "${rootDir}/so-file-config.gradle"
  4. 在Application中调用AssetsSoLoadBy7zFileManager.init(v.getContext());初始化,重载方法支持传入NeedDownloadSoListener完成云端所需要so库下载,下载后使用SoFileInfo#insertOrUpdateCache(saveLibsDir,File)插入缓存中
  5. 修改根目录中so-file-config.gradle进行压缩删减库配置主要修改deleteSoLibs与compressSo2AssetsLibs如下:
//指定编辑阶段要删除的so库
deleteSoLibs = []
//指定至assets中的so库
compressSo2AssetsLibs = []

其他配置请参考注释

插件介绍

一、 SoLoadHookPlugin插件

  1. 通过Hook System.loadLibrarySystem.load实现加载转发具体步骤如下:

    • 通过ASM框架对Hook目标类进行字节码修改具体为 System.loadLibrarySystem.load修改成SoLoadHook.loadLibrarySoLoadHook.load
    • SoLoadHook可设置SoLoadProxy完成对外代理

    SoLoadHook有默认实现只是调用System.loadLibrarySystem.load

  2. 具体接入步骤如下:

  • gradle配置
//build.gradle中只加入
classpath "com.imf.so:load-hook-plugin:${SO_PLUGIN_VERSION}" 
//app.gradle中只配置
apply plugin: 'SoLoadHookPlugin'
SoLoadHookConfig {
		//是否跳过R文件与BuildConfig
		isSkipRAndBuildConfig = true
		//设置跳过的包名,跳过的包不去hook 修改后请先clean
		excludePackage = ['com.imf.test.']
}
dependencies {
  implementation "com.imf.so:load-hook:${SO_PLUGIN_VERSION}"
}
  • java代码实现SoLoadProxy完成加载
public interface SoLoadProxy {
    void loadLibrary(String libName);

    void load(String filename);
}
SoLoadHook.setSoLoadProxy(new XXXSoLoadProxy())

实现SoLoadProxy类后不会被修改System.loadLibrarySystem.load字节码 如果不想在指定包名下修改 在excludePackage中配置报名 如果不想在指定类或方法下被修改字节码,请添加注解@KeepSystemLoadLib

二、SoFileTransformPlugin与SoFileAttachMergeTaskPlugin插件依赖SoLoadHookPlugin

SoFileTransformPlugin与SoFileAttachMergeTaskPlugin功能一样只是编辑阶段插入口不同 根据com.android.tools.build:gradle:x.x.x中版本号不同选择使用哪个 3.4.0版本及以下使用SoFileTransformPlugin 3.5.0 - 3.6.0版本使用SoFileAttachMergeTaskPlugin 其他版本请自行尝试,如果都失败提交issues我这边进行适配 已知问题最新版本4.1.0中添加了compressed_assets机制导致无法把压缩后的so文件放入asstes中,这个空闲时间阅读下4.1.0源码后适配 也欢迎大家push提交解决

  1. 通过实现transform或在mergeNativeLibs中添加Action的方式,对so库进行7z压缩(利用压缩差实现压缩apk),压缩后放入asstes下的jniLib
  2. 根据压缩或删除so情况生成info.json
  3. 运行时进行解压加载 so
  1. so库依赖拷贝了ReLinker中解析代码
  2. 解压部分微调自AndroidUn7z

接入方式参考顶部最开始部分

三、TODO

  1. 尝试对比压缩工具 zstd 与 7z
  2. 兼容facebook/SoLoader库解压加载
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].