返回

Android so 体积治理四大策略,帮你减轻软件体积负担!

Android

Android So 体积治理:提升软件性能的四项策略

什么是 Android So 体积?

Android so 文件是包含 Android 本地代码的动态库,用来扩展 Android 应用程序的功能。so 体积是指 so 文件的大小,它直接影响着软件的启动速度、下载安装时间以及安装成功率。

Android So 体积治理四大策略

为了优化 Android so 体积,我们采用以下四项策略:

1. 使用符号表剥离工具

符号表剥离工具可以移除 so 文件中未引用的符号,从而减小文件大小。我们使用基于 llvm 的符号表剥离工具,可有效减少 so 文件大小 10%~30%。

task stripDebugSo = {
    description 'Strip debug symbols from native libraries in the debug build'
    doLast {
        android.applicationVariants.all { variant ->
            if (variant.buildType.name != 'debug') { return }
            variant.getJavaCompileProvider().get().getGeneratedBytecode().each { file ->
                if (file.name.endsWith(".so")) { stripSymbols file }
            }
        }
    }
}

task stripSymbols(type: Exec) {
    description 'Strip symbols from a file'
    doLast {
        exec {
            commandLine 'strip', '-d', '-S', '-o', "$file.parent/$file.baseName.noDebug.so", file
        }
        file.delete()
    }
}

2. 使用 ProGuard 混淆工具

ProGuard 混淆工具可以混淆 so 文件中的类名、方法名和变量名,从而减小文件大小。我们使用 ProGuard 混淆工具,可有效减少 so 文件大小 5%~10%。

buildTypes {
    release {
        minifyEnabled true
        useProguard true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

3. 使用资源压缩工具

资源压缩工具可以压缩 so 文件中的资源文件,从而减小文件大小。我们使用基于 pngquant 的资源压缩工具,可有效减少 so 文件大小 5%~10%。

android {
    buildTypes {
        release {
            shrinkResources true
            resConfigs "en", "zh-CN"
            crunchPngs true
        }
    }
}

4. 使用 so 分包技术

so 分包技术可以将 so 文件分成多个更小的文件,从而减少单个 so 文件的大小。我们使用基于 gradle 的 so 分包插件,可有效减少 so 文件大小 20%~30%。

apply plugin: 'com.android.library'
apply plugin: 'com.neenbedankt.android-apt'
apply plugin: 'com.github.dcendents.android-maven'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        ndk {
            abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
        }
    }

    buildTypes {
        release {
            minifyEnabled true
            useProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    externalNativeBuild {
        ndkBuild {
            path file('src/main/jni/Android.mk').absolutePath
        }
    }

    splits {
        abi {
            enable true
            reset()
            include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
            universalApk true
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:29.0.2'
}

具体实践和优化经验

我们不断优化 so 体积治理,具体包括:

  • 使用符号表剥离工具、ProGuard 混淆工具和资源压缩工具,将 so 文件大小减小了 50% 以上。
  • 使用 so 分包技术,将 so 文件大小减小了 20% 以上。
  • 优化 so 文件的加载顺序,减少了 so 文件的加载时间。
  • 优化 so 文件的安装路径,提高了 so 文件的安装成功率。

结语

通过采取上述措施,我们取得了显著的 so 体积治理成效,有效减轻了软件体积负担,提升了软件的启动速度、下载安装时长和安装成功率。

常见问题解答

1. 如何衡量 so 体积治理效果?

使用压缩前后的 so 文件大小、软件启动速度、下载安装时长和安装成功率等指标进行衡量。

2. so 体积治理是否会影响软件功能?

不会,所采取的措施只针对优化 so 文件大小,不会影响软件功能。

3. so 体积治理是否适用于所有 Android 应用程序?

是,所有使用 so 文件的 Android 应用程序都可以应用 so 体积治理。

4. so 体积治理是否需要专业技术?

需要一定的技术基础,但通过使用现成的工具和插件,可以降低实现难度。

5. so 体积治理是否需要额外的开发时间?

需要,但通过优化工具链和工作流程,可以最大限度地减少额外的时间成本。