上街郑州网站建设,wordpress登录后评论,產品定制网站开发,建设网站你认为需要注意1、前言
在包大小的占比中#xff0c;so文件的占比往往是最高的#xff0c;动辄几兆的大小多一个都会把包大小的指标打爆。 而在各厂商要求对手机CPU ARM架构进行分包适配的情况下#xff0c;你更需要知道哪些依赖是没有适配v7a/v8a的#xff0c;这将影响你的APP在应用市场…1、前言
在包大小的占比中so文件的占比往往是最高的动辄几兆的大小多一个都会把包大小的指标打爆。 而在各厂商要求对手机CPU ARM架构进行分包适配的情况下你更需要知道哪些依赖是没有适配v7a/v8a的这将影响你的APP在应用市场的审核。 所以搞清楚so文件和依赖的关系它不仅是一个技术指标归因的工具也是应对厂商分包适配的利器。
2、分析APK
我们一般分析APK是通过Android Studio提供的Analyze APK工具可以清晰的看到APK文件的组成部分比如lib文件夹下有哪些so文件但是却无法直观的看出这些so文件属于哪个依赖。 如下图
3、so文件怎么来的
想要知道so文件是属于哪个依赖那么得先搞清楚so文件是怎么来的。 如果你分析过apk里面的so文件你会发现除了项目中lib文件夹下手动添加的so文件之外还有一些不知道是哪来的。 要想搞清楚这个你还得知道我们的依赖是依赖的什么东西。
以okhttp为例
implementation com.squareup.okhttp3:okhttp:4.10.0我们通过GAV坐标依赖的实际是square公司发布的jar/aar文件 所以除了你自己添加的so文件之外其余的都是通过依赖导进来的。
ok整体思路我们捋一下 Gradle管理依赖会自动去下载jar/aar然后我们通过遍历所有依赖拿到对应的jar/arr再去获取其中对应的so文件。 听起来并不复杂实际上也很简单下面来实战一下。
4、实战
4.1、栗子
以阿里云音视频SDK为例它一定是包含so文件的我不信它不用FFmpeg。 添加示例依赖 //8.全功能直播推流含超低延时直播、RTC连麦短视频播放器美颜特效implementation com.aliyun.aio:AliVCSDK_Premium:6.4.0其他配置就不赘述了可以自行去看文档。 别忘了添加ndk配置否则so打不进去。 defaultConfig {ndk {abiFilters arm64-v8a, armeabi-v7a, armeabi-v8a}}4.2、遍历
ok准备工作到位写个插件遍历所有的依赖文件并打印出来。
Configuration configuration project.getConfigurations().getByName(applicationVariant.getName() CompileClasspath);
configuration.forEach(file - {System.out.println(TAG file file.getName());String fineName file.getName();if (fineName.endsWith(.jar) || fineName.endsWith(.aar)) {try {JarFile jarFile new JarFile(file);for (Enumeration enums jarFile.entries(); enums.hasMoreElements(); ) {JarEntry jarEntry (JarEntry) enums.nextElement();System.out.println(TAG jarEntry jarEntry.getName());}} catch (IOException e) {throw new RuntimeException(e);}}
});这里在Project评估完成之后获取Configuration对象然后遍历所有的依赖文件最后通过JarEntry把文件里面所有的子文件打出来。 输出 可以看到已经把所有的子文件都打出来了包括jni/、res/、assets/等等。
4.3、优化
上面的输出还不够直观我们在过滤一下只打印so文件然后优化一下打印的格式。
configuration.forEach(file - {String fineName file.getName();System.out.println(TAG fine name fineName);if (fineName.endsWith(.jar) || fineName.endsWith(.aar)) {try {JarFile jarFile new JarFile(file);for (Enumeration enums jarFile.entries(); enums.hasMoreElements(); ) {JarEntry jarEntry (JarEntry) enums.nextElement();if (jarEntry.getName().endsWith(.so)){System.out.println(TAG ----- so name jarEntry.getName());}}} catch (IOException e) {throw new RuntimeException(e);}}
});最终效果
//...
GradleXPlugin fine name AliVCSDK_Premium-6.4.0.aar
GradleXPlugin ----- so name jni/arm64-v8a/libMNN_CL.so
GradleXPlugin ----- so name jni/arm64-v8a/libalivcffmpeg.so
GradleXPlugin ----- so name jni/arm64-v8a/liball_in_one.so
GradleXPlugin ----- so name jni/arm64-v8a/libMNN.so
GradleXPlugin ----- so name jni/armeabi-v7a/libMNN_CL.so
GradleXPlugin ----- so name jni/armeabi-v7a/libalivcffmpeg.so
GradleXPlugin ----- so name jni/armeabi-v7a/liball_in_one.so
GradleXPlugin ----- so name jni/armeabi-v7a/libMNN.so
//...是不是还挺简单的~
5、最后
如果你不想自己写这个插件我也发布远端了按照下面三步走即可使用。 Step 1. Add the JitPack repository to your build file
repositories {...maven { url https://jitpack.io }
}Step 2. Add the dependency
dependencies {classpath(com.github.yechaoa.GradleX:plugin:1.2)
}Step 3. Add the Plugin Id to your build file and configure the gradleX{ } dsl
plugins {id com.yechaoa.plugin.gradleX
}gradleX {printDependencies falseanalysisSo true
}ok以上即是本文介绍内容学废了吗写作不易快来三连~
6、GitHub
https://github.com/yechaoa/GradleX