안드로이드 APK 제한 압축의 성능 최적화 (더 많은 자원, 효과는 더 중요하다)

간략한 소개

프로젝트의 지속적인 반복으로, 리소스 파일과 코드의 양이 성장을 계속하고 있습니다. 어느 날 갑자기 당신이 APK 크기를 최적화하기 위해 당신의 상사 또는 리더를 호출하는 경우 APK 파일이 후, 점점 더 많은 패키지가있을 것입니다, 당신은 우리가 분석하고이 문서를 최적화하기 위해 함께 갈 것입니다, 그것은 정당화되지 않을 것이다 최적화하는 방법을 모른다 그것의 APK 볼륨 크기.

제 최적화도 모습 후에 적용

안드로이드 APK 제한 압축의 성능 최적화 (더 많은 자원, 효과는 더 중요하다)

APK 자원 소비 분석

안드로이드 APK 제한 압축의 성능 최적화 (더 많은 자원, 효과는 더 중요하다)
참고 :

필요한 경우 내가 오픈 소스 프로젝트의 GitHub의 상대적으로 높은 인기를 찾고 있었다, 당신은 클릭 할 수 있습니다 다운로드 스스로 뭔가를하려고합니다.

안드로이드 APK 제한 압축의 성능 최적화 (더 많은 자원, 효과는 더 중요하다)

빌드 분석 도구를 직접 사용하는 AS / APK 분석

자산을 그리기> classes.dex> 고해상도> 리소스 파일이 가장 차지하는 위의 그림 lib 디렉토리에서.

여기에서 우리는, 그것의 APK를 크기를 줄이는 방법에 대해 살펴

APK 여덟 큰 볼륨 최적화

1. 사진 형식 WebP 형식으로 변환

WebP 형식 개념

VP8 WebP 형식은 비디오 인코딩 형식으로부터 파생 된 이미지 파일 형식의 무손실 압축을 제공하면서 손실 압축이다. WebP 형식은 원래 2010 년에 발표, 네트워크에 이미지 파일의 전송 시간을 줄이기 위해 희망, 파일 크기를 줄일 수 있지만, 동일한 품질의 JEPG 포맷 이미지를 달성하는 것을 목표로하고있다. 2011년 11월 8일, 구글은 WebP 형식 지원 무손실 압축하고 투명한 컬러 기능을하기 시작했다.

그들은 처리 PNGCRUSH 및 PNGOUT에서 PNG 파일을 사용하는 경우에도 구글 이전 테스트, 네트워크에있는 PNG 파일의 파일 크기의 WebP 형식 무손실 압축 미만 45 %,에 따르면, WebP 형식은 여전히 ​​28 %로 파일 크기를 줄일 수 있습니다. 지금은 WebP 형식은 사진의 크기가 평균 70 % 감소를 만들 수 있습니다. WebP 형식의 이미지 형식의 미래 추세입니다.

PNG / JPG는 WebP 형식합니다

안드로이드 APK 제한 압축의 성능 최적화 (더 많은 자원, 효과는 더 중요하다)

형식을 WebP 형식에 이미지 또는 폴더를 마우스 오른쪽 단추로 변환을 선택 클릭 PNG / JPG 사진 압축 포맷은 WebP 형식 사진입니다.

안드로이드 APK 제한 압축의 성능 최적화 (더 많은 자원, 효과는 더 중요하다)

마지막으로, 우리는 약 미만 200 이상 KB 감소, 때문에 작은 그림에 이미 너무 많이, 많이하지를 이미지 리소스를 투사 할 수 있습니다.

시나리오 및 장점

  • 客户端软件,内嵌了基于 Chromium 的 webview,这类浏览器中应用的网页是可以完全使用WebP 格式,提升加载渲染速度,不考虑兼容。
  • 用 node-webkit 开发的程序,用 WebP 可以减少文件包的体积。
  • 移动应用 或 网页game ,界面需要大量图片,可以嵌入 WebP 的解码包,能够节省用户流量,提升访问速度优势:
  • 对于 PNG 图片,WebP 比 PNG 小了45%。

2. 去除多语言

在 app/build.gradle 添加

android{
    ...
    defaultConfig{
        ...
        //只保留英语
        resConfigs "en"
    }
}

안드로이드 APK 제한 압축의 성능 최적화 (더 많은 자원, 효과는 더 중요하다)

这里我们发现减少了大概 200 kb

3. 去除不必要 so 库

通过反编译 Android 微信版本 得知,微信也只适配了 armeabi-v7a 架构,那么我们删掉其它库的支持吧。

android{
    ...
    defaultConfig{
        ...
            ndk {
            //设置支持的SO库架构
            abiFilters "armeabi-v7a"
     }
}
}

안드로이드 APK 제한 압축의 성능 최적화 (더 많은 자원, 효과는 더 중요하다)

又优化了差不多 600 kb ,继续。

4. 去除无用资源 Link 检查(谨慎删除)

概念

Lint 是 Android Studio 提供的 代码扫描分析工具,它可以帮助我们发现代码结构 / 质量问题,同时提供一些解决方案,而且这个过程不需要我们手写测试用例。代码迭代版本一多,很容易会遗留一些无用的代码、资源文件,我们可以使用 Lint 进行清除。

怎么使用 Link 检查

打开 AS 工具,找到 Analyze > Run Inspection By Name > unused resources

优化

안드로이드 APK 제한 압축의 성능 최적화 (더 많은 자원, 효과는 더 중요하다)

发现我们 link 大概优化了 700 kb继续。

注意

因为 link 是检查有没有引用来做的判断是否使用了资源,那么如果是这种方式勒,所以在删除的时候一定要谨慎。

//动态获取资源 id , 未直接使用 R.xx.xx ,则这个 id 代表的资源会被认为没有使用过(类似不能混淆反射类)
int indetifier =getResources().getIdentifier("img_bubble_receive", "drawable", getPackageName()); getResources().getDrawable(indetifier);

5. 开启混淆

안드로이드 APK 제한 압축의 성능 최적화 (더 많은 자원, 효과는 더 중요하다)

优化了大概 1.7M 继续。

6.移除无用资源 shinkResource

  • 开启 shinkResource = true

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

안드로이드 APK 제한 압축의 성능 최적화 (더 많은 자원, 효과는 더 중요하다)

这个有可能 link 删除了无用资源,所以没有在优化了

7.开启删除无用资源 (严格模式和普通模式) - 这个我这里就不可测试,你们下来可以测试下效果

普通模式也就是自定义模式

如果您有想要保留或舍弃的特定资源,请在您的项目中创建一个包含 <resources> 标记的 XML 文件,并在 tools:keep 属性中指定每个要保留的资源,在 tools:discard 属性中指定每个要舍弃的资源。这两个属性都接受逗号分隔的资源名称列表。您可以使用星号字符作为通配符。

例如:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"
    tools:discard="@layout/unused2" />

将该文件保存在项目资源中,例如,保存在 res/raw/keep.xml。构建不会将该文件打包到 APK 之中。

指定要舍弃的资源可能看似愚蠢,因为您本可将它们删除,但在使用构建变体时,这样做可能很有用。例如,如果您明知给定资源表面上会在代码中使用(并因此不会被压缩器移除),但实际不会用于给定构建变体,就可以将所有资源放入公用项目目录,然后为每个构建变体创建一个不同的 keep.xml 文件。构建工具也可能无法根据需要正确识别资源,这是因为编译器会添加内联资源 ID,而资源分析器可能不知道真正引用的资源和恰巧具有相同值的代码中的整数值之间的差别。

严格模式

正常情况下,资源压缩器可准确判定系统是否使用了资源。不过,如果您的代码调用 Resources.getIdentifier()(或您的任何库进行了这一调用 - AppCompat 库会执行该调用),这就表示您的代码将根据动态生成的字符串查询资源名称。当您执行这一调用时,默认情况下资源压缩器会采取防御性行为,将所有具有匹配名称格式的资源标记为可能已使用,无法移除。

例如,以下代码会使所有带 img_ 前缀的资源标记为已使用。

String name = String.format("img_%1d", angle + 1);
res = getResources().getIdentifier(name, "drawable", getPackageName());

资源压缩器还会浏览代码以及各种 res/raw/ 资源中的所有字符串常量,寻找格式类似于 file:///android_res/drawable//ic_plus_anim_016.png 的资源网址。如果它找到与其类似的字符串,或找到其他看似可用来构建与其类似的网址的字符串,则不会将它们移除。

다음은 기본 압축 방식에 의해 보안이 사용의 예입니다. 그러나, 당신은 결정하는 데 사용 된 경우에만 자원을 유지하는이 "준비"접근하고, 지정된 자원 압축기를 사용하지 않도록 설정할 수 있습니다. 에,이를 수행하려면 keep.xml파일 shrinkMode로 설정 strict다음과 같습니다 :

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:shrinkMode="strict" />

당신이 실제로 있다면 엄격한 압축 모드가 활성화되며, 사용해야 동적으로 생성 된 문자열을 포함하는 (위 그림 참조) 또한 코드 리소스를 참조 tools:keep수동으로 자원을 유지하는 속성을.

AndResGuard 마이크로 채널 자원 압축 방식

AndResGuard 무엇입니까

AndResGuard이 APK의 크기를 줄일 수있는 도구이며, 그 원리는하지만 자원, 자바 Proguard와 유사하다. 이것은 그렇지 않으면 중복 자원 경로 / R / D 조해진다 위챗 예 입술 / 그리기 / 들면 짧게한다.

왜 AndResGuard

과거 개발, 우리는 보통 가독성 입술 너무 강한 모든 파일 이름을 폴더, 리소스 파일이 다른 사람의 앞에 노출, 코드를 혼동.

후 사용의 효과

안드로이드 APK 제한 압축의 성능 최적화 (더 많은 자원, 효과는 더 중요하다)

안드로이드 APK 제한 압축의 성능 최적화 (더 많은 자원, 효과는 더 중요하다)

AndResGuard 구성

  • Build.gradle 프로젝트 루트 디렉토리, 종속 플러그인을 추가 :

     dependencies {
            classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.16'
        }
  • 응용 프로그램 디렉토리에서 생성 and_res_guard.gradle 파일을
apply plugin: 'AndResGuard'

andResGuard {
    mappingFile = null
    use7zip = true
    useSign = true
    keepRoot = false
    compressFilePattern = [
            "*.png",
            "*.jpg",
            "*.jpeg",
            "*.gif",
            "resources.arsc"
    ]
    whiteList = [
            // your icon
            "R.drawable.icon",
            // for fabric
            "R.string.com.crashlytics.*",
            // for umeng update
            "R.string.tb_*",
            "R.layout.tb_*",
            "R.drawable.tb_*",
            "R.drawable.u1*",
            "R.drawable.u2*",
            "R.color.tb_*",
            // umeng share for sina
            "R.drawable.sina*",
            // for google-services.json
            "R.string.google_app_id",
            "R.string.gcm_defaultSenderId",
            "R.string.default_web_client_id",
            "R.string.ga_trackingId",
            "R.string.firebase_database_url",
            "R.string.google_api_key",
            "R.string.google_crash_reporting_api_key",

            //友盟
            "R.string.umeng*",
            "R.string.UM*",
            "R.layout.umeng*",
            "R.drawable.umeng*",
            "R.id.umeng*",
            "R.anim.umeng*",
            "R.color.umeng*",
            "R.style.*UM*",
            "R.style.umeng*",

            //融云
            "R.drawable.u*",
            "R.drawable.rc_*",
            "R.string.rc_*",
            "R.layout.rc_*",
            "R.color.rc_*",
            "R.id.rc_*",
            "R.style.rc_*",
            "R.dimen.rc_*",
            "R.array.rc_*"
    ]

    sevenzip {
        artifact = 'com.tencent.mm:SevenZip:1.2.10'
    }
}
  • 응용 프로그램 모듈 build.gradle 파일 추가

    apply from: 'and_res_guard.gradle'
  • 완료 포장 렌더링 후

안드로이드 APK 제한 압축의 성능 최적화 (더 많은 자원, 효과는 더 중요하다)

안드로이드 APK 제한 압축의 성능 최적화 (더 많은 자원, 효과는 더 중요하다)

자원 1M에 대해 압축

개요

  1. 큰 볼륨 프로젝트, 더 많은 자원, 더 눈에 띄는 결과.
  2. 링크 자원을 사용하여, 우리는 앞서 백업,주의해야합니다 삭제.
  3. 여기에 단지 M 10 프로젝트 자체가, 마지막으로 4.5 M 다운을 최적화 때문입니다. 그것은 여전히 ​​쉬운 일이 아니다.

당신이 문서는 매우 유용 느낀다면 글쎄, 기사 친구에게 추천 할 수 있습니다, 여기에 종료합니다.

~ 무료 모습을 받기 위해 887 084 983 : 마지막으로, 여기에 안드로이드 나 자신에 대한 학습, 인터뷰 문서, 대규모 비디오 컬렉션을 구성이며, 관심있는 파트너는 그룹에 추가 할 수 있습니다

안드로이드 APK 제한 압축의 성능 최적화 (더 많은 자원, 효과는 더 중요하다)

추천

출처blog.51cto.com/14332859/2443443