快捷搜索:

【亚洲必赢官方登录】App瘦身最佳实践

2019-10-09 作者:儿童文学   |   浏览(191)

专访DroidPlugin小编张勇:安卓黑科学和技术是何等炼成的 - Android - 丹佛掘金(Denver Nuggets)

那二日,奇虎360在Github上揭发了一个Android开源项目DroidPlugin,那是三个落到实处动态加载的Android插件框架,可防止安装、免予修业改的运营第三方APK。有时间,它被誉为安卓黑科学技术,引起行当内的关心。 据其法定文档介绍,DroidPlu...

正文仲不定期更新,推荐watch下项目。如果喜欢请star,若是感觉有错误疏失请提交issue,假如你有更加好的枢纽能够交到pull request。
本文的演示代码主假诺凭借我的阅历来编排的,若你有其余的手艺和措施能够涉足进去一同完善那篇小说。

微信 Android 能源混淆打包工具-安装包立减1M - Android - 丹佛掘金

上一篇小说大家陈述了Android收缩设置包体量的一些tips,本文首要对前文提到的财富混淆做三个简练的剖析。微信中的能源混淆工具首要为了混淆能源ID长度(例如将res/drawable/welcome.png混淆为r/s/a.png),同一时间采用7z纵深压缩,...

本文固定连接:https://github.com/tianzhijiexian/Android-Best-Practices

Android Proguard 指南 - Android - 掘金

android 混淆配置指南乌Crane语版 自个儿只是个名不见经传翻译的搬运工 ,好啊,翻译是为了增长英语水准。 Android Proguard 指南 Android Proguard 混淆配置指南 ProGuard 这么些ProGuard工具得以经过删...

目标

业务方和支出都指望app尽量的小,本文子禽付给七个实用性的技能来援救开辟者举行app的减重工作。控食和减压虽好,但须要留意减脂对于项目可维护性的影响,提议依照本身的体系张开本领的精选。

「个人计算」APK 减重实践 - Android - 丹佛掘金队(Denver Nuggets)

因为推广的急需,公司必要把APK的尺寸再“减小”一下,4M之内!当抵达4M以内之后,公司提出说,能不可能再压压?2M哪些? 消脂前因为常常就思量到大小的界定,所以广大专门的学问早就做过了,如下列举今后的情景: 7.3M(Debug版本)和6.5M(Release版本...

浅析app组成结构

做减重以前必定要询问自个儿app的重组结构,然后要有指向的进展优化,并且要稳步记录比对,这样本事更加好的达成此项职业。近来as的2.2预览版中早已有了apk深入分析器,成效格外强劲,另外你仍可以运用nimbledroid来解析apk。nimbledroid是一个有力的工具,推荐一试。

亚洲必赢官方登录 1

image_1ar7h642m1v52g0p1r5c4fo1idc4e.png-79.1kB

笔者们都知情apk是由:

  • asserts
  • lib
  • res
  • dex
  • META-INF
  • androidManifest

这多少个部分构成的。上边我会利用as的深入分析工具,以微信、网易、Tmall为例实行描述。

亚洲必赢官方登录 2

image_1ar5097i31eqm12kp1ndlbilos59.png-36.3kB

初步深入分析后几分钟就会出口结果,你还足以看来实际类目占的比重,清晰明了。旁边的“相比较”按键提供了diff的功力,让您可以一本万利的举行apk优化前后的比较,差十分的少利器。

亚洲必赢官方登录 3

image_699net亚洲必赢 ,1ar50k0hl4ek1b8k8fd14bjg9d13.png-63.8kB

亚洲必赢官方登录 4

image_1ar50n9r11tha15la1gpi1uqs19d81t.png-90.8kB

新一代 Android 路子打包工具:一千 个门路包只须求 5 秒 - Android - 丹佛掘金(Denver Nuggets)

源码:https://github.com/mcxiaoke/packer-ng-plugin 最新版本 v1.0.4 - 二〇一四.01.19 - 完善获取APK路线的法子,增添MarketInfo v1.0.3 - 二〇一四.01.14 - ...

assets

assets目录能够寄存一些布署文件或财富文件,比方webview的本土html,react native的jsbundle等,微信的全方位assets占用了13.4M。要是你的利用对本地能源要求少之甚少的话,那一个文件应该不会太大。

亚洲必赢官方登录 5

image_1ar50vjva119s1abt9it64n1pbfm.png-120.2kB

App 减腹最好实行 - Android - 掘金队

正文少禽不定期更新,推荐watch下项目。就算喜欢请star,要是以为有错误疏失请提交issue,固然你有更加好的关节能够交到pull request。本文的演示代码主假诺依附小编的经验来编排的,若您有其余的技艺和方式能够参加进来一齐完善那篇小说。 本文固定连接:ht...

lib

lib目录下会有种种so文件,分析器会检查出档期的顺序和煦的so和各类库的so。和讯和微信同样只协助了arm三个阳台,天猫商城帮助了arm和x86多个平台。

亚洲必赢官方登录 6

image_1ar8g77ucuj7ffo14hs15a1lknm.png-36.4kB

淘宝:

亚洲必赢官方登录 7

image_1ar8gsi62hbg15711m1l1l1816oo2a.png-23.6kB

resources.arsc

本条文件是编写翻译后的二进制财富文件,里面是id-name-value的八个map。因为微信做了财富的混淆,所以那边能够见到财富名称都是不行读的。

亚洲必赢官方登录 8

image_1ar50ru80tkj165u1v5g90j1tte9.png-133.3kB

干脆放个今日头条的图,易于大家领略:

亚洲必赢官方登录 9

image_亚洲必赢官方登录 ,1ar8ggv1q4ac6m100pd4r7uo1g.png-80.1kB

META-INF

META-INF目录下贮存的是签订协议音信,用来确定保障apk包的完整性和系统的安全性,帮助客户防止安装由来不清楚的盗版apk。

亚洲必赢官方登录 10

image_1ar8gijsiudo1h99lc89leiic1t.png-28kB

res

res目录贮存的是财富文件。包罗图形、字符串。raw文件夹上面是音频文件,各样xml文件等等。因为微信做了财富混淆,图片名字都不行读了。

亚洲必赢官方登录 11

image_1ar5143g519urnco1tbt2f3158k1j.png-35.6kB

乐乎就一直不做能源混淆,所以可读性较好:

亚洲必赢官方登录 12

image_1ar8gefrd1anu1q5b5h170d1rie13.png-57.3kB

dex

dex文件是java代码打包后的字节码,一个dex文件最四只帮助65539个形式,那也是为啥微信有了三个dex文件的缘故。

亚洲必赢官方登录 13

image_1ar8g2r9keg21dn1s8grcur7v9.png-5.1kB

因为dex分包是不均匀的,你能够通晓为装箱,三个箱子的轻重是稳固的,但您代码的量是不明确的,微信把前八个箱子装满了,最终还剩了2m多的代码,这一个代码也占领了八个箱子,最后发生了上海教室不均匀的结果。

前些天,大家已经通晓了apk中相继文件的高低和它们占的百分比,下边就足以开头针对的扩充优化了。

优化assets

assets中会贮存能源文件,那几个目录中逐条app寄存的剧情都有所差别,所以优化也相比难。自从引入逍客N以来,那么些目录下还应该有jsbundle的音讯。如若你有地址采取的成效,这里还有或许会存放地方的炫丽文件(可参看全名k歌)。对于那块的能源,as是不交易会开主动的去除的,所以一切都是要求靠开辟者实行手动管理的。

全名k歌中的bundle文件:

亚洲必赢官方登录 14

image_1arn9rc731t40m3kgsa1md11ohg3u.png-126.1kB

去除无用字体

粤语字体是一对一大的,小编一向不建议将字体文件专断甩掉到assets中。偶然候叁个小成效急着上,开拓者为了追求速度,可以先放在这里图方便。但鲜明要驾驭那些隐患,并且一定要多和成品查处成效的需求性。另外,对于有个别只会用在logo中的字体,小编推荐将字体文件进行删减处理。
FontZip是叁个字体提取工具,readme中写到:

通过测量试验,已经把品种5MB的点子字体,按供给提取后,占用唯有20KB,而且可不荒谬使用。

亚洲必赢官方登录 15.gif)

gif2 (1).gif-204.5kB

减少icon-font的使用

icon-font和svg都能成功部分icon的呈现,但因为icon-font在assets中难以管理,并且职能和svg有所重叠,所以笔者提出裁减icon-font的选拔,利用svg举行代替,究竟三个不大的icon-font也比svg大吗。作者付出贰个提供各个格式icon的网址,方便我们进行测验:https://icomoon.io/app/

亚洲必赢官方登录 16

image_1ara1tf2ucmeetq14v510a21fob1d.png-16.1kB

亚洲必赢官方登录 17

image_1ara1mtufm781bbs1khag1k21ag.png-22.2kB

  • svg:549字节
  • png:375字节(单一分辨率)
  • ion-font:1.1kb

动态下载能源

字体、js代码这样的财富能动态下载的就做动态下载,就算这么会有出错的恐怕,复杂度也会升高,但这些对于app的瘦腿和顾客来讲是有久远的益处的。要是你用了中华VN,你就足以在app运转时动态去拉取最新的代码,将图片和js代码一并下载后解压使用。

调减少资本源文件

些微财富文件是绝对要一气浑成app一并发表的,对于这么的文书,能够行使压缩存款和储蓄的方法,在必要财富的时候将其解压使用,上边就是解压zip文件的代码:

public static void unzipFile(File zipFile, String destination) throws IOException {
        FileInputStream fileStream = null;
        BufferedInputStream bufferedStream = null;
        ZipInputStream zipStream = null;
        try {
            fileStream = new FileInputStream(zipFile);
            bufferedStream = new BufferedInputStream(fileStream);
            zipStream = new ZipInputStream(bufferedStream);
            ZipEntry entry;

            File destinationFolder = new File(destination);
            if (destinationFolder.exists()) {
                deleteDirectory(destinationFolder);
            }

            destinationFolder.mkdirs();

            byte[] buffer = new byte[WRITE_BUFFER_SIZE];
            while ((entry = zipStream.getNextEntry()) != null) {
                String fileName = entry.getName();
                File file = new File(destinationFolder, fileName);
                if (entry.isDirectory()) {
                    file.mkdirs();
                } else {
                    File parent = file.getParentFile();
                    if (!parent.exists()) {
                        parent.mkdirs();
                    }

                    FileOutputStream fout = new FileOutputStream(file);
                    try {
                        int numBytesRead;
                        while ((numBytesRead = zipStream.read(buffer)) != -1) {
                            fout.write(buffer, 0, numBytesRead);
                        }
                    } finally {
                        fout.close();
                    }
                }
                long time = entry.getTime();
                if (time > 0) {
                    file.setLastModified(time);
                }
            }
        } finally {
            try {
                if (zipStream != null) {
                    zipStream.close();
                }
                if (bufferedStream != null) {
                    bufferedStream.close();
                }
                if (fileStream != null) {
                    fileStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

姓名k歌中的assets目录下自家就意识了大气的zip文件:

亚洲必赢官方登录 18

image_1arn9mkkmm061j631b3f1ag7a3i3h.png-26.5kB

android上也会有三个7z库帮忙大家有益的应用7z。那一个库小编眼下没用到,有须要的同桌能够尝尝一下。

优化lib

配置abiFilters

一个硬件配备对应三个架构(mips、arm或然x86),只保留与设备架构相关的库文件夹(主流的架构都是arm的,mips属于小众,暗中认可也是永葆arm的so的,但x86的不帮衬)能够大大收缩lib文件夹的大小。配置格局也丰盛数之大约,直接配置abiFilters亚洲必赢 ,即可:

defaultConfig {
    versionCode 1
    versionName '1.0.0'

    renderscriptTargetApi 23
    renderscriptSupportModeEnabled true

    // http://stackoverflow.com/questions/30794584/exclude-jnilibs-folder-from-production-apk
    ndk {
        abiFilters "armeabi", "armeabi-v7a" ,"x86"
    }
}

然后生成的apk中就能够排出多余的平台文件了。armeabi就不要讲了,这几个是必需满含的,v7是三个图形坚实版本,x86是英特尔平台的协助库。

法定例子:

亚洲必赢官方登录 19

image_1arsrvqedh49dju1s7ulkf13du13.png-61.3kB

解析客户手机的cpu

咱俩在屏弃so以前需求开展客户cpu型号的总计,那样你本事放心大胆的开展操作。作者第一花了多少个本子的时刻总结了客户的cpu型号,然后去掉了未曾或少许客商才会用到的so,以到达塑体的指标。

@NonNull
public static String getCpuName() {
    String name = getCpuName1();
    if (TextUtils.isEmpty(name)) {
        name = getCpuName2();
        if (TextUtils.isEmpty(name)) {
            name = "unknown";
        }
    }
    return name;
}

private static String getCpuName1() {
    String[] abiArr;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        abiArr = Build.SUPPORTED_ABIS;
    } else {
        abiArr = new String[]{Build.CPU_ABI, Build.CPU_ABI2};
    }

    StringBuilder abiStr = new StringBuilder();
    for (String abi : abiArr) {
        abiStr.append(abi);
        abiStr.append(',');
    }
    return abiStr.toString();
}

private static String getCpuName2() {
    try {
        FileReader e = new FileReader("/proc/cpuinfo");
        BufferedReader br = new BufferedReader(e);
        String text = br.readLine();
        String[] array = text.split(":\s+", 2);
        e.close();
        br.close();
        return array[1];
    } catch (IOException var4) {
        var4.printStackTrace();
        return null;
    }
}

注意:

  1. 只要您和自个儿同一用到了renderscript那么你必得带有v7,不然会出现模糊非常的难题。
  2. 假定您用了迈凯伦570N,那么对于x86必要提心吊胆的保存,不然大概会油不过生顾客找不到so而崩溃的情状。毕竟rn是贰个大局的事物,稍有不慎就恐怕会现出开机崩的意况。
  3. so这些东西照旧相比危殆的,大家虽然能够经过总计cpu型号来下滑危害,但自身可能引入宣布app前走三回多量机型的云测,通过云测平台把危机更为回降。
  4. 小厂的品类或然会舍弃一些so,但随着公司范围的附加,你现在依然要再一次挂念那一个标题。所以笔者引入在崩溃系统中上传客商cpu型号的音讯,那样我们就足以在第临时间知道因找不到so引起的崩溃量,至于是还是不是需求追加so就看题指标不得了程度了。

制止复制so

so有个成年新界岛。在Android 6.0从前,so文件会削减到apk中。系统在安装使用的时候,会把so文件解压到data分区,那样同一个so文件会有两份存在,一个在apk里,三个在data中。那也形成多占用了一倍的空中,何况会现出种种奇异的失实。那个宗旨纵然和apk的消肉非亲非故,但它和app安装在顾客手机中的大小有关,因而我们也是内需多多留意的。

Starting from Android Studio 2.2 Preview 2 and newest build tools, the build process will automatically store native libraries uncompressed and page aligned in the APK.

在6.0+中,能够经过如下的秘籍举行表达:

<application
   android:extractNativeLibs=”false”
   ...
>

一旦想打听更加多消息还是想清楚这种安顿的界定,能够浏览下SmallerAPK(8)。

优化resources.arsc

resources.arsc中寄存了贰个应和关系:

id name default v11
0x7f090002 PopupAnimation @ref/0x7f040042, @ref/0x7f040041

我们在程序运营的时候确定要平常用到id,由此它在安装之后仍须求被频仍的读取。尽管将以此文件实行压缩,在每回读取前系统都不可能不开展解压的操作,那就能够有一对性质和内部存款和储蓄器的开销,综合考虑下那是神经过敏的。

除去无用的能源映射

resources.arsc的正确瘦腿方法是删除不供给的string entry,你能够借助 android-arscblamer 来检查出能够优化的某个,举个例子有的空的援用。

拓宽财富名称混淆

微信团队开源了贰个资源混淆工具,AndResGuard。它将能源的名号进行了歪曲,所以能够用它对resources.arsc进行优化,只是具体优化职能与编码情势、id数量、平均减少命名长度有关。

表1:

id name default v11
0x7f090001 Android @ref/0x7f040042, @ref/0x7f040041
0x7f090002 ios @ref/0x7f040042, @ref/0x7f040041
0x7f090003 Windows Phone @ref/0x7f040042, @ref/0x7f040041

表2:

id name default v11
0x7f090001 a @ref/0x7f040042, @ref/0x7f040041
0x7f090002 b @ref/0x7f040042, @ref/0x7f040041
0x7f090003 c @ref/0x7f040042, @ref/0x7f040041

咱俩一眼就能够清楚表2肯定比表1积存的字符要小,所以整个文件的大小显明也要小一些。

关于AndResGuard

其一压缩工具其实便是五个task,使用也非常总结,具体的用法请参照他事他说加以考察普通话文书档案。

原理介绍:设置包立减1M--微信Android能源混淆打包工具

andResGuard {
    mappingFile = null
    use7zip = true
    useSign = true
    keepRoot = false
    whiteList = [
        //for your icon
        "R.drawable.icon",
        //for fabric
        "R.string.com.crashlytics.*",
        //for umeng update
        "R.string.umeng*",
        "R.string.UM*",
        "R.layout.umeng*",
        "R.drawable.umeng*",
        //umeng share for sina
        "R.drawable.sina*"
    ]
    compressFilePattern = [
        "*.png",
        "*.jpg",
        "*.jpeg",
        "*.gif",
        "resources.arsc"
    ]
     sevenzip {
         artifact = 'com.tencent.mm:SevenZip:1.1.9'
         //path = "/usr/local/bin/7za"
    }
}

应用那些工具的时候必要小心一些坑,像友盟这种爱好用反射获取财富的SDK便是贰个坑(友盟的SDK正是坑王)!对于app运行Logo那样的icon能够不做混淆,推荐将其归入白名单里。

优化META-INF

META-INF文件夹中有三个文本,分别是MANIFEST.MF、CERT.SF、CERT.奥德赛SA。上面小编将会列出简约的剖析,若是您期望更详细的摸底原理,能够查阅《Android APK 具名文件MANIFEST.MF、CERT.SF、CERT.揽胜极光SA深入分析》。

MANIFEST.MF

亚洲必赢官方登录 20

image_1arn2sdp8ip3cj31j9m1vofcajm.png-81.6kB

每三个财富文件(res初步)上面都有二个SHA1-Digest的值。那些值为该公文SHA-1值举办base64编码后的结果。
假如要研讨原理,可以看下SignApk.java。那几个类中有一段main方法:

public static void main(String[] args) {
    //...

    // MANIFEST.MF
    Manifest manifest = addDigestsToManifest(inputJar);
    je = new JarEntry(JarFile.MANIFEST_NAME);
    je.setTime(timestamp);
    outputJar.putNextEntry(je);
    manifest.write(outputJar);

    //...
}

private static void writeSignatureFile(Manifest manifest, OutputStream out)
        throws IOException, GeneralSecurityException {
    Manifest sf = new Manifest();
    Attributes main = sf.getMainAttributes();
    main.putValue("Signature-Version", "1.0");
    main.putValue("Created-By", "1.0 (Android SignApk)");
    BASE64Encoder base64 = new BASE64Encoder();
    MessageDigest md = MessageDigest.getInstance("SHA1");
    PrintStream print = new PrintStream(
            new DigestOutputStream(new ByteArrayOutputStream(), md),
            true, "UTF-8");
    // Digest of the entire manifest
    manifest.write(print);
    print.flush();
    main.putValue("SHA1-Digest-Manifest", base64.encode(md.digest()));
    Map<String, Attributes> entries = manifest.getEntries();
    for (Map.Entry<String, Attributes> entry : entries.entrySet()) {
        // Digest of the manifest stanza for this entry.
        print.print("Name: " + entry.getKey() + "rn");
        for (Map.Entry<Object, Object> att : entry.getValue().entrySet()) {
            print.print(att.getKey() + ": " + att.getValue() + "rn");
        }
        print.print("rn");
        print.flush();
        Attributes sfAttr = new Attributes();
        sfAttr.putValue("SHA1-Digest", base64.encode(md.digest()));
        sf.getEntries().put(entry.getKey(), sfAttr);
    }
    sf.write(out);
}

通过代码咱们得以窥见SHA1-Digest-Manifest是MANIFEST.MF文件的SHA1并base64编码的结果。

CERT.SF

亚洲必赢官方登录 21

image_1arn41udjrb91fku103b193a2qe13.png-68.3kB

此间有一项SHA1-Digest-Manifest的值,那一个值正是MANIFEST.MF文件的SHA-1并base64编码后的值。前面几项的值是对MANIFEST.MF文件中的每项再一次SHA1并base64编码后的值。所以你会见到在manifest.mf中的资源名称在此间也出现了,举个例子abc_btn_check_material本条系统能源文件就涌出了几遍。

MANIFEST.MF:

亚洲必赢官方登录 22

image_1arn47aeq15qc40910rt1u4cvm11g.png-39.3kB

CERT.SF

亚洲必赢官方登录 23

image_1arn4bje01q921ih1plv15te1n871t.png-44kB

前面三个是:4XHnecusACTIgtImUjC7bQ9HNM8=,后面一个是YFDDnTUd6St4932sE/Xk6H0HMoc=。借使您把前二个文件展开在背后加上nr,然后开展编码,你就可以收获CERT.SF中的值。

 Map<String, Attributes> entries = manifest.getEntries();
 for (Map.Entry<String, Attributes> entry : entries.entrySet()) {
     // Digest of the manifest stanza for this entry.
     print.print("Name: " + entry.getKey() + "rn");
     for (Map.Entry<Object, Object> att : entry.getValue().entrySet()) {
         print.print(att.getKey() + ": " + att.getValue() + "rn");
     }
     print.print("rn");
     print.flush();

     Attributes sfAttr = new Attributes();
     sfAttr.putValue("SHA1-Digest", base64.encode(md.digest()));
     sf.getEntries().put(entry.getKey(), sfAttr);
 }

 sf.write(out);

CERT.RSA

CERT.ENCORESA饱含了公钥、所选取的加密算法等音信。它对前一步生成的MANIFEST.MF使用了SHA1-翼虎SA算法,用开采者的私钥进行签名,在安装时行使公钥解密它。解密之后,将它与未加密的摘要信息(即,MANIFEST.MF文件)进行自查自纠,假使相符,则评释内容未有被改造。那一点和app塑身就全盘非亲非故了,正是android的apk具名机制。那块笔者平常也未有稳重商讨过,就不误人子弟了。具体的具名进程能够参照他事他说加以考察:http://blog.csdn.net/asmcvc/article/details/9312123

优化提议

经过剖析得出,除了CERT.EvoqueSA没有减掉机遇外,其余的几个文件都可以因而混淆能源名称的点子开展压缩。

亚洲必赢官方登录 24

image_1arn6q7ip1p71c1q1kv3s9rigi2a.png-49.6kB

优化res

财富文件的优化向来是大家的侧入眼。假若要和它举办自己检查自纠,上文的META-INF文件的优化简直能够忽视不计。这里的优化会分成两块,二个是文本能源(shape、layout等)优化,还会有二个就是图表财富优化。

亚洲必赢官方登录 25

image_1arn8pmpn1ofkdnk14o11hfp15es34.png-116.3kB

说明:
上海教室中有-v4,-v21如此的文件有个别是app开辟者自身写的,但多数都以系统在包装的时候自动生成的,所以您只须要考虑本身项目中的drawable-mdpi、drawable-hdpi、drawable-xhdpi、drawable-xxhdpi就能够。

因而as删除无用财富

在as的别的文件中右击,选取清除无用财富就可以删除未有接纳的财富文件。

亚洲必赢官方登录 26

image_1arni457b1j7o1q3pu6f1gn62ju4b.png-57.2kB

无须勾选清除id!纵然排除了id,会潜濡默化databinding等库的施用(id相对占不了多少空间)

亚洲必赢官方登录 27

image_1arni765omt7bv01qrm1h2d19us4o.png-14.6kB

Tips:
做此操作此前,请必须发生三次commit,操作实现后肯定要透过git看下diff。那样既有襄协助调查看被删去的公文,又有啥不可运用git进行误删恢复生机。

包裹时去除无用财富

shrinkResources看名就能够知道意思————收缩财富。将它设置为true后,每一遍打包的时候就能够自行清除无用的财富(不唯有是图形)。有了它的扶持,纵然你忘掉手动删除无用的能源文件也清闲。

buildTypes {
    release {
        zipAlignEnabled true
        minifyEnabled true

        shrinkResources true // 是否去除无效的资源文件

        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        signingConfig signingConfigs.release
    }

    rtm.initWith(buildTypes.release)
    rtm {}

    debug {
        multiDexEnabled true
    }
}

剔除无用的言语

相当多利用其实并没有需求帮忙几十种语言的,微信也做了依附地点选用性下载语言包的效力。作为国内选用,大家得以只辅助中文。推荐在品种的build.gradle中进行如下配置:

android {

    //...

    defaultConfig {
        resConfigs "zh"
    }
}

那般在卷入的时候就能够免去私有项目、android系统库和第三方库中国和澳洲汉语的能源文件了,效果依然比较显明的。

调整raw中财富的高低

  • assets目录允许上边有多级子目录,而raw下差别意存在目录结构
  • assets中的文件不会发生景逸SUV文件映射,但raw会
  • 假设你app最低扶助的本子不是2.3的话,assets和raw应该都不会对能源文件的分寸进行界定
  • raw文件会生成Wrangler文件映射,能够被as的lint深入分析,而assets则不可能
  • raw缺乏子目录的欠缺让其无法产生存放多量文件的目录

日常raw文件下会放音频文件。要是raw文件夹下有音频文件,尽量不要选择无损(如:wav)的音频格式,能够考虑同等品质但文件更加小的音频格式。

ogg是一种较切合做音响效果的音频格式。当场本人初级中学做游戏的时候,小编全部都是用的VCD和png,最终游戏达到了2G。在换为ogg和jpg后,游戏收缩到了1G之内(因为游戏中音频和大图比较多,所以效果比较夸张)。移动端的音频主若是音响效果和短小的音频,所以天猫商城大批量选取了ogg格式,和讯的挑选格式比很多,有wav、mp5、ogg,小编越发推荐天猫商城的做法。当然,你依旧不要遗忘opus格式,opus也是一种有损压缩格式,假如感兴趣的话也得以尝尝一下。

亚洲必赢官方登录 28

image_1arn8i7lq1ub56r41a022mj11n32n.png-38.8kB

合并使用风格,减弱shape文件

一个运用的分界面风格是必供给合併的,那几个越早做越好,最主旨的就是联合颜色和按键的按压效果。无UI设计和扁平化风格流行后,倒是给选用塑身带来了巨大的的有益。分界面变得越朴实,大家能够用shape画的事物就越来越多。

亚洲必赢官方登录 29

image_1arnj7vjtn1mr74eql8781qjg5v.png-44.5kB

当你的app统一过每一个颜色对应的按下颜色后,接下去就供给统一按键的模样、开关的圆角角度、有无阴影的样子、阴影投射角度,阴影范围等等,最后还要思考是还是不是帮衬水波纹效果。

本身轻便将按键分为下列成分:

元素 属性01 属性02 属性03 属性04
形状 正方形 三角形 圆角矩形 圆形
颜色 绿
有无阴影
阴影大小 3dp 5dp
阴影角度 90° 120° 180°
水波纹效果

地方的相继要素会发生大量的咬合,shape和layer-list当然能够达成各类组合,但这么的话光按键的背景文件就有八个,比较差维护。
诚如为了开拓方便人民群众,都会把须要动用的各个selector图片事先定义好,做作业的时候只必要去调用就行。但那汪洋的selector文件对于事情开垦者来讲也有记念难度的,所以自身推荐使用SelectorInjection那么些库,它能够将方面包车型地铁各种成分举行各个组合,用最少的财富文件来实现大气的按压效果。

用库即使好,但库也会带来上学习开销用,所以引入者能够将上述的整合定义为按键的贰个个的style。因为style本人是支撑承袭的,对于如此的三结合形象来讲,承继差非常少是一大利器。当您的style有精美的命名后,调用者只需求了然引进什么style就行,至于你用了何等属性外人才不期待管吗。假若事情支出中有一部分极度新鲜的按压状态,未有其他复用的股票总值,那您就足以应用库提供的增加属性在layout文件中开展落实,再也不用手忙脚乱的中国人民解放军第四野战军定义selector文件了。

亚洲必赢官方登录 30

image_1arnkegaj1eug1dvsafj1ao71e7p6p.png-37.7kB

本人将不能够继续和不灵活的shape变成了一个个单一的习性,通过库将两性情格实行整合,接着利用支持承袭的style来将多少个属性定位成三个安插文件,最终对外产生强制的典型性约束,至此便成功了削减selector文件的行事。

使用toolbar,减少menu文件

menu文件是ActionBar时代的产物,as即使对于menu的支撑做的还不易,但自己很难爱上它。menu的规划初心是解耦和抽象,但因为过于的解耦和定制的不便利,比相当多门类已经不复利用menu.xml作为actionbar的美食做法了。
就现阶段的地貌来看,toolbar是android将来的自由化。笔者即便作为多少个对actionbar和actionbar的同盟管理特别通晓的人,但本人要么不得不承认actionbar的一世过去了。假让你不相信,笔者可以告知您天猫的menu文件就3个,天涯论坛的menu文件就9个,要是你照旧苦苦依恋着actionbar的配置格局,小编推荐一个库AppBar,它能够令你在用灵活的toolbar的还要也分享到布署menu的便利性。

亚洲必赢官方登录 31

image_1ars0g9partf41i1g1lnt8fogm.png-58.4kB

限制灵活性,裁减layout文件

压缩layout文件有八个措施:复用和融入(include)。

复用layout文件

把部分页面共用的布局收取来,那无论是对layout文件的管住仍旧减重都以极为有用的。就比方任何贰个app的list页面是比很多的,从布局层面来讲就是二个ListView大概RecyclerView,其背后还会有loading的view,空状态的view等等,所以作者的建议是确立三个list_layout.xml,别的的list页面能够复用可能include它,那样会从十分大程度上收缩layout文件的数量。

融合layout代码

对此能够被复用的layout大家能够做统一保管,不过对于不会被复用的layout咋办呢?假使一个页面是由五个区域组合而成的,fragment的做法是叁个页面中放八个container,然后再写三个layout,但实质上那三个layout常常是尚未别的复用价值的。笔者梦想找到一种艺术,在view区块还向来不复用需要的时候用二个layout化解,须要被复用的时候也能够高速、无痛的拆分出来。

1. UiBlock

UiBlock是多少个近乎于fragment的解耦库,它可认为同贰个layout中不一致区域的view进行逻辑解耦(因为layout可预览的特色,ui定位方面不是难点),它能帮大家尽大概少的确立layout文件。
一旦今后须要发生了转移,layout文件中的一块view须要收取成单身的layout文件的时候,UiBlock的逻辑代码差不离不用改动,你只必要把收取的layout文件include进来,然后在include标签上定义八个id就能够。而以此职业能够通过as的重构作用自动达成,绝不三翻四复。

亚洲必赢官方登录 32

image_1asesb6fq1dfu1df71iu0117ps8c9.png-142.6kB

<!-- 使用include -->
<include
    android:id="@+id/bottom_ub"
    layout="@layout/demo_uiblock"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    />

2. ListHeader

亚洲必赢官方登录 33

image_1arsqihk3bdg1p281ks0phricam.png-149.8kB

public void addHeaderToListView(ListView listView, View header) {
    if (header == null) {
        throw new IllegalArgumentException("Can't add a null header view to ListView");
    }
    ViewGroup viewParent = (ViewGroup) header.getParent();
    viewParent.removeView(header);

    AbsListView.LayoutParams params = new AbsListView.LayoutParams(
            header.getLayoutParams().width,
            header.getLayoutParams().height);
    header.setLayoutParams(params);

    listView.addHeaderView(header); // add
}

自己将listView和它的从未有过复用价值的header放到了同一个layout中,然后在activity中选择上述代码实行了操作,最后瓜熟蒂落了用三个layout文件给listView加头的行事。这段代码笔者非常久没动过了,有利有弊,放在此处笔者也只是是举例,希望能够扶持我们扩张下思路。

动态下载图片

做过滤镜和贴纸的同校应该会小心到贴纸、表情那类的东西是一对一大的,对于那类的图形能源笔者刚强提出通过在线商号举行获取。那样不只能够令你实在的卖贴纸,又有啥不可减去应用的轻重。这么做就算有肯定的复杂度和出错概率,但投入产出比依然很精确的。

亚洲必赢官方登录 34

image_1arnj0n951qd7ua1pl44uk16ak5i.png-103kB

分类一下放置不相同分辨率的图样

本条就算不算是app大小的优化,可是倘使你放错了图片,对于app运转时的内部存款和储蓄器大小会有早晚的熏陶:

观念一下,假设把贰个理所当然应该献身drawable-xxhdpi里面包车型地铁图形放在了drawable文件夹中会出现什么难题呢?
在xxhdpi设备上,图片会被加大3倍,图片内部存款和储蓄器占用就能够化为原本的9倍!

本国也会有为数不菲人说能够用一套图片来做,不用出多套图,借此来达到app瘦腿和给规划减低压力的指标。谷歌(Google)官方是建议为分歧分辨率出区别的图纸,为此国内也许有无数小说钻探过这件工作,这篇小结的不易推荐一读。

历次聊到那几个话题的时候总有为数不菲人有不一致的观点,何况很多人还不知道.9图也是须求切多份的,所以这里小编要么先剖判一下大厂的放图计谋,最终大家再批评下较优的方案。

1. 淘宝

mdpi:

亚洲必赢官方登录 35

image_1arnmbr6n2sji90tas1s0k1g7176.png-84.4kB

mdpi中存留了一部分android原始的icon,这些从命名和前缀就能够看出来。通过图片大小解析,那几个目录上边都以有的相当的小的icon,还有局部未有应用的icon(这一个launcher图片也很好的验证了Taobao的历史)。

hdp:

亚洲必赢官方登录 36

image_1arnmlnf92cv1oca1riu196t1j7o7j.png-93.2kB

hdp中分为两局地:表情和其他图片。f+数字的图样都以表情图片,Taobao仅只有一套表情图片,何况都位于那几个目录下。除了为数十分少的图纸和mdip的图纸同样(比方客商头像的place_holder)外,别的的图形和mdpi的图样完全两样。顺便说一下,此目录下除了表情之外,其他的都以局地小icon,相对属于尺寸一点都不大的那类。

xhdpi:

亚洲必赢官方登录 37

image_1arnn1tc416n1s0h58f1bnc1dpi80.png-98.4kB

xhdpi又和hdpi不一样了,它里面有多量的国家icon。除外就是有的对清晰度须要较高的icon。

xxhdpi:

亚洲必赢官方登录 38

image_1arnnj2f0k8v1moek63ggej1s97.png-58.1kB

xxhdpi就没怎么事物了,几张图而已。

其他:

亚洲必赢官方登录 39

image_1arnnptoucj31n4h1g4n13ft1b0v9k.png-17kB

有后缀的文书夹中除去5张左右的天猫商城自身的icon外,别的都以系统的图片,均以abc最初。笔者不明了天猫商城到底有未有使用到这一个图片,但自己得以明显地说当中具备冗余图片,大概有着进一步优化的方案。

总结:
天猫商城的停放图片战略是大批量的图样在hdpi,xhdpi中,举例表情图在hdpi中,国家图在xhdpi中,大比很多图片都独有一套,少数大局的icon是会有多张的状态(极少,揣测唯有十几张)。xxhdpi和mhdpi仅仅看做填补,未有太大的作用。

Taobao最令人侧目的点在于它的能源文件相当小,但是so文件十分的大:

亚洲必赢官方登录 40

image_1arnuhm0o1k6813581o0dg5m1jung4.png-47.3kB

2. 微博

和讯是三个规范的android风格的app,它的drawable全是有后缀的,完全符合安卓规范的暗中认可打包政策,它还应该有根据像素密度的图片,以至有ldpi的目录。

亚洲必赢官方登录 41

image_1arnoj1rl1h2m9trqiusqh5jva1.png-41.8kB

mdpi-v4

亚洲必赢官方登录 42

image_1arnopum9ogf121a68612ga4peae.png-94.7kB

mdpi中有恢宏的小icon,里面有个叫做share_wx的,从名字一下子就了然是微信共享的icon,但实则是博客园的logo,相比较有意思。别的的都是一对边边角角的Logo,量十分小,所以老马图确定不在这里。

hdpi-v4

亚洲必赢官方登录 43

image_1arnouv1n1cpgdqc1evj12gdmdoar.png-205.6kB

那是天涯论坛图片贮存的首要性目录,有多数大背景和表情,乐乎的表情图片和Taobao同样都是在hdpi中的,它以lxh,emoji等前缀开端,用来分裂不一样风格的神采。

xhdpi-v4和xxhdpi-v4*

亚洲必赢官方登录 44

image_1arnp6ag51jt7cka1b3d1slsal5b8.png-195.9kB

此间放了一部分背景大图,作者也发掘了大气和hdpi中平等的图片,所以能够大胆的举例搜狐是做了分化像素的图纸的。这也证实了本身的主见——和讯是很职业的android应用。

ldpi-v4

亚洲必赢官方登录 45

image_1arnpeog7cik19hsage4u020ibl.png-58.3kB

其一目录的确没什么用,网易本身也不会爱戴那几个目录,那清一色是第三方库和选择公司给的图形,和讯开采者只须求放进来就好。

sw400dp和sw32dp-400dp

亚洲必赢官方登录 46

image_1arnpip3j1iulg7ecio1gtcs1fc2.png-48.7kB

那个目录放了一些为不一样分辨率计划的长得千篇一律的icon,当然还或者有博客园本身的logo。

3. 微信

经过地点的剖析,我们是或不是能够得出有个别经历了吧?

  • 大气的图样都在hdpi和xdpi中
  • 表情图片在hdpi中
  • anim目录中都以xml文件
  • drawable目录中有恢宏的xml和少些的png和.9图
  • layout文件中是总体的xml
  • raw中放置音频
  • svg图片在raw、drawable或assets中
  • 最大的文本夹是图表文件
  • layout文件十分的小
  • 一律的图片,高分屏的分明比低分屏的大

ok,未来大家就足以来看微信的能源了,混淆怕啥,友盟混淆的abcd代码都能看懂,微信的adcd能源也理应轻巧。

raw(a9)

亚洲必赢官方登录 47

image_1arnqa3vfd76lrn78n3fsdfcf.png-64.3kB

以此目录中放置了多量的svg图片和mp5文书,从标准的角度来想,drawable目录下自然不会放DVD,所以这一个断定是raw文件了。那个目录下有大量的svg,所以能够观察微信已经完毕了全svg化,况且已经在线上平稳运维了。那点在微信前期的公众号上也足以收获佐证,详细请看Android微信上的SVG。

文中涉及了:

先是步,获得.svg后缀的能源文件(UI很容导出这种图片),放在raw目录下实际不是drawable目录。
第二步,把 R.drawable.xxx 换成 R.raw.xxx;把 @drawable/xxx 换成 @raw/xxx。

layout(f)

亚洲必赢官方登录 48

image_1arnqqs2fbl9j932ie1llt1tgacs.png-14kB

近期有了多少个线索,那么起首估值上边包车型地铁几个目录明确是我们广大的目录,不然不会那么大。

亚洲必赢官方登录 49

image_1arnr4ghkld6r0r1r9910e81ussd9.png-51.8kB

打开f后发觉这么些正是layout文件,所以任何的明显就是图表文件了。

hdpi(y)

亚洲必赢官方登录 50

image_1arnr8rn015lj3in76ou621tqadm.png-97.9kB

y是2.9m,里面有恢宏的神情,所以笔者判定它是hdpi,为了尤其证实这么些估摸,笔者找到了两卡瓦略样的图纸。

a2中:

亚洲必赢官方登录 51

image_1arnrkkh21ooi1mquuq9sh614hueg.png-101.4kB

y中:

亚洲必赢官方登录 52

image_1arnrng70t9s7vnpj36alf5het.png-61.4kB

y中图纸是11kb,a第22中学图纸是76kb,那明明表达y是hdpi,a2是xhdpi。

xhdpi(a2):

亚洲必赢官方登录 53

image_1arnrscp011v6ptk1r5q1tn01mudfa.png-95.8kB

xhdpi中的图片和hdpi中的图片一样的少之甚少,微信在这里放的是部分大图。

drawable(k)

亚洲必赢官方登录 54

image_1arns8oe9167th553bb66t857fn.png-72.5kB

drawable自身没啥能够说的,可是微信的drawable中.9图占有率比相当少,所以作者在想是还是不是svg可以在早晚的程度上做到部分.9的专门的学问呢?

总结:

  1. 微信的神情都在hdpi中,独有一套图片,这一点差相当少已经化为了正式
  2. 微信已经实现了svg化,svg图片在raw中
  3. 微信偏向于把极大的图样放在xhdpi中,仅出一套图
  4. 微信和天猫商城一样都以尽大概挑选一套图来产生须求

优化思路

由此剖判得出,古板的出几个分辨率图片的做法在大厂中已经发生了更换,Ali系、Tencent系的产品都利用了一套图走天下的门路。那样的做法依旧有利有弊的,权衡之下作者付出如下建议:

  • 聊天表情就出一套图,放在hdpi中
  • 纯色小icon用svg做
  • 背景等大图,出一套位于xhdpi中
  • logo等权重非常的大的图纸可针对hdpi,xhdpi做两套图
  • 要是有些图在真机中的确展现卓殊,这就用多套图
  • 一经超过奇葩机型,可针对的补图

成人不看黑白,只看利弊,所以还请大家权衡一二。

优化图片

对此图片的优化应该是献身优化res一节中开展批注的,不过因为图片这块比重太大了,所以小编让其单独成为一节。本节非常重要会从图片格式、复用图片和压缩图片几个地方拓宽教学。

使用VectorDrawable

想要做好图片的优化办事最重大的少数是理解应该选择怎样的图片格式,对于那点自个儿引入三个视频,方便大家举办深远的精通。

亚洲必赢官方登录 55

image_1ar7a260ogr2cldradmbl132o20.png-154.3kB

那是Google交付的建议,一句话来讲便是:VD->WebP->Png->JPG

  1. 假如是纯色的icon,那么用svg
  2. 设假若三种以上颜色的icon,用webp
  3. 假若webp不能达到规定的规范效果,选用png
  4. 倘若图片并未阿尔法通道,能够思量jpg

VD即VectorDrawable,android上的svg达成类。在经验了长达三个月的减缓包容之路后,以往毕竟被support库包容了,官方文书档案中付出了那般一个例子:

 // Gradle Plugin 2.0+  
 android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
    }  
 }  

 <ImageView  
      android:layout_width="wrap_content"  
      android:layout_height="wrap_content"  
      app:srcCompat="@drawable/ic_add" 
    />  

配置好后,大家就可以利用强劲的svg来替换纯色icon了。

svg转VectorDrawable

先去这里下载svg图片:https://icomoon.io/app/#/select

亚洲必赢官方登录 56

image_1as2a4ja5h64os6ujvtvj7gt13.png-39.4kB

下一场使用这一个在线工具转换成VectorDrawable。

亚洲必赢官方登录 57

image_1as29ve0pl661sn71po24df1cm09.png-60.8kB

svg的宽容性

support库的代码品质照旧不错的,不过svg毕竟是一个图片格式,所以使用svg前如故索要至极严谨的。作者写了二个demo,把用到的全数属性都做了演示,然后使用云测服务实行宽容性测验。

亚洲必赢官方登录 58

image_1as22vm0n1avk1bgvukv18561krt1g.png-199.2kB

测量检验svg也挺轻便的,首先看会不会崩溃,然后看种种分辨率、各样api下是还是不是会有彰显不健康的场所,假若都ok,那么就足以希图引入到项目里面了。
现实的测验代码在SelectorInjection,小编测量试验下来百分之百经过。

svg的选取技能

设置妥帖的宽高

svg图片是有默许宽高的,设计也会付出一个暗许宽高,设置一个适度的暗许宽高对今后的图片复用会有不小辅助。

亚洲必赢官方登录 59

image_1as915i10in41fqg71il71fifm.png-88.2kB

亚洲必赢官方登录 60

image_1as912sge1hkm1jkgm411j5favp9.png-96kB

TextView中drawableLeft等属性是不可能设置图片的宽高的,但ImageView能够。纵然您的图样会被复用,提出将图纸的宽高设置为TextView中的drawable宽高。

利用padding和scaleType属性

ImageView中的svg私下认可情状下是会趁机控件的大大小小而改造的,它不会像png那样保持和煦的原有大小。大家得以应用这一表征,再合营padding和scaleType属性来实现种种成效。

亚洲必赢官方登录 61

image_1as91pho95r229p14nd1siuhpt1g.png-4.7kB

  1. 图1:60x60,svg自动铺满控件
  2. 图2:30x30,svg被缩减到原有大小以下
  3. 图3:60x60,使用scaleType,让svg保持原本宽度
  4. 图4:60x60,使用padding,对svg进行随机比例的压缩
<ImageView
    android:layout_width="60dp"
    android:layout_height="60dp"

    android:tint="@color/blue"
    app:srcCompat="@drawable/facebook"
    />

<ImageView
    android:layout_width="30dp"
    android:layout_height="30dp"

    android:tint="@color/orange"
    app:srcCompat="@drawable/facebook"
    />

<ImageView
    android:layout_width="60dp"
    android:layout_height="60dp"

    android:scaleType="centerInside"
    android:tint="@color/red"
    app:srcCompat="@drawable/facebook"
    />

<ImageView
    android:layout_width="60dp"
    android:layout_height="60dp"

    android:padding="10dp"
    android:tint="@color/green"
    app:srcCompat="@drawable/facebook"
    />

svg的标题和缓和方案

svg有不计其数低价,但也免不了一些难点,本小节中写代码的猴子建议了一部分很实用的提议,多谢她的佑助。

轻便写错属性

svg的扶助是要通过app:srcCompat那性情子来做的,假使略微一不注意写成了src,那么就能够晤世低版本手提式有线电话机上不协作的主题素材。你能够尝尝通过配备Lint法规或是利用脚本举办文件的遍历等办法来制止出现因开拓写错属性而夭折的主题素材。

不兼容selector

将svg纳入selector中的时候恐怕会油然则生有的难点,stackoverflow上也付出了应用方案,就是下边这段代码放在Activity中。

static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

开启那几个flag后,你就可以平常的采纳Selector那样的DrawableContainers了。

不协理自定义控件

AppCompatActivity会自动将xml文件中的ImageView替换为AppCompatImageView,不过就算用了你的自定义控件,那么这种机制就不行了,所以自定义控件中尽量选择AppCompatImageView来代替ImageView,使用 setImageResource()来设置能源。假如您的自定义控件中须求获得drawable大概是有自定义要求,那么能够参谋AppCompatImageView中的svg的helper类来编排。

public class AppCompatImageHelper {

    private final ImageView mView;

    public AppCompatImageHelper(ImageView view) {
        mView = view;
    }

    public void loadFromAttributes(AttributeSet attrs, int defStyleAttr) {
        TintTypedArray a = null;
        try {
            Drawable drawable = mView.getDrawable();

            if (drawable == null) {
                a = TintTypedArray.obtainStyledAttributes(mView.getContext(), attrs,
                        R.styleable.AppCompatImageView, defStyleAttr, 0);

                // If the view doesn't already have a drawable (from android:src), try loading
                // it from srcCompat
                final int id = a.getResourceId(R.styleable.AppCompatImageView_srcCompat, -1);
                if (id != -1) {
                    drawable = AppCompatResources.getDrawable(mView.getContext(), id);
                    if (drawable != null) {
                        mView.setImageDrawable(drawable);
                    }
                }
            }

            if (drawable != null) {
                DrawableUtils.fixDrawable(drawable);
            }
        } finally {
            if (a != null) {
                a.recycle();
            }
        }
    }

    public void setImageResource(int resId) {
        if (resId != 0) {
            final Drawable d = AppCompatResources.getDrawable(mView.getContext(), resId);
            if (d != null) {
                DrawableUtils.fixDrawable(d);
            }
            mView.setImageDrawable(d);
        } else {
            mView.setImageDrawable(null);
        }
    }

    boolean hasOverlappingRendering() {
        final Drawable background = mView.getBackground();
        if (Build.VERSION.SDK_INT >= 21
                && background instanceof android.graphics.drawable.RippleDrawable) {
            // RippleDrawable has an issue on L+ when used with an alpha animation.
            // This workaround should be disabled when the platform bug is fixed. See b/27715789
            return false;
        }
        return true;
    }
}

不相称第三方库

市道上有为数不少美貌的图纸加载库,它们经常都会支持八种图形路线的加载,举个例子磁盘图片,互联网图片,res图片等等,对于svg那样的图片格式,它们是还是不是帮忙将在我们结合自己的图形框架举行调查钻探了。像glide最近(二〇一五.09.10)就不帮助加载本地的svg图片,详见: Vector drawable can't be used as error drawable 。

PS:因为第三方库更新特别一再,提议在用到svg的时候再应用研讨。

属性难点

关于动画和性格方面的题目,《Android Vector波折的匹配之路》中提交了现实的躬体力行和提出:

  1. Bitmap的绘图功效并不一定会比Vector高,它们有明确的平衡点,当Vector相比轻便时,其成效是必然比Bitmap高的,所认为了保证Vector的高作用,Vector要求越发简便易行,PathData越发正式、精简,当Vector图像变得特别复杂时,就需求利用Bitmap来替代了。
  1. Vector适用于icon、Button、ImageView的Logo等小的icon,也许是急需的卡通效果,由于Bitmap在GPU中有缓存成效,而Vector并未,所以Vector图像不可能做往往的重绘。
  2. Vector图像过于复杂时,不唯有要注意绘制功用,开端化功能也是需求思考的严重性元素。那一点能够参照微信中的svg。
  3. SVG加载速度会快于PNG,但渲染速度会慢于PNG,毕竟PNG有硬件加快,但平均下来,加载速度的晋级弥补了绘图的进程破绽。

不便于管理

svg是不能在文件目录下实行预览的,其放置的目录也和其他图片分裂,若无办好管理专门的学问,今后的drawable目录就能变得更为的目迷五色。其实,对于目录恐怕包内文件的保管有个很简短的尺度:同目录多类型文件,在此以前缀区分;不相同目录,同品种文件,以意义区分。

drawable目录下有多样类型的文书,大家应用塞尔维亚语排序的标准化将那些文件简单分为svg、.9图、shape、layer-list这几类。

亚洲必赢官方登录 62

image_1asbj36rs1k0a13rn1bmb2p01dumm.png-15.9kB

因此正规特定的前缀,就足以产生三个有益搜索和精通的目录树,以到达分类的目标。

亚洲必赢官方登录 63

image_1asbk0j4417s53ed9vphma1cea13.png-81.3kB

在特定前缀的标准下,次级分类的命名就足以根据职能或用途来做区分,比方button或share的icon就足以用不一致的前缀来标志。刚强提出开荒和布置定二个命名标准,那样开荒就毫无对设计出的图纸打开重命名了,而且还是可以够保险几个机构有一致的认识。

以此只是是二个粗略的归类方法,在实质上中供给灵活应用。假若部分文书都以用以某种特定项指标,那么能够自定义前缀。举例本身对此按键使用的形制就用了btn作为前缀,而忽略了它们本人的文件类型。

亚洲必赢官方登录 64

image_1ase39vaiud91foq188ilif1n219.png-13.8kB

不便于预览

svg是一个异样格式的公文,可预览性大大低于png等常用的图片格式,但幸亏win下得以平素在文件目录下预览svg图像,效果特别不错。

亚洲必赢官方登录 65

image_1asbld3ar1ptn1pne1l3hrgl12v51g.png-14.6kB

唯独vd是八个xml文件,预览器很难识别出那是何等格式,所以对于vd的预览才是多个难处。小编之后计划写五个as插件来减轻那几个难点。

使用WebP

webp作为一种新的图片格式,从Android4.0+初始原生帮忙,可是不支持包括光滑度,直到4.2.1+才支撑显得含发光度的webp,使用的时候要特别注意。
webp相比较于png最引人瞩指标主题材料是加载稍慢,可是未来的智能道具硬件配置进一步高,那点距离越来越小。Tencent事先有一篇对于webp的剖析文可怜科学,假使您企图要用webp了,那么它相对值得一看。

注意:一经您的门类最低协理到4.2.1,那么你能够继续读书了,若是项目还需求援助到4.0版本,作者提出临时不要上webp,开支太高。

png转webp

我们能够透过智图或者isparta将其余格式的图形调换到webP格式。

亚洲必赢官方登录 66

image_1asbgag1erb11i6b1pqg1gga18is9.png-1045.2kB

webp的问题

宽容性不好

合塞尔维亚共和国语档中说除非在4.2.1+以上的机型,手艺分析无损恐怕有光滑度调节的webp图片,4.0+才早先帮忙无光滑度的webp图片。小编通过云测发掘,在4.0~4.2.1的连串中,带有发光度的webp图片就算不会崩溃,然而完全不可能彰显。

亚洲必赢官方登录 67

image_1asbo6vvd1o9roku1keqa9r4om1t.png-33.5kB

《APK减重记,如何达成高达百分之二十的收缩效果》一文中也关乎有alpha值的jpg图片,经过webp调换后,不能够在4.0,4.1的Android系统上运维的主题素材,具体原因见合德文书档案:

亚洲必赢官方登录 68

image_1asbq6bejqva1mtuvaj3kc1al22n.png-14kB

除外包容性难题外,webp在少数机型和rom上或许会油然则生有的“玄妙”的主题材料。在Samsung的一对机型上,部分有阿尔法通道的图中会有一条很分明的黑线(三星(Samsung)的rom对于shape的阿尔法的协助也可能有题目,是红线)。在Motorola2刷成4.xx的无绳电话机上,系统不能够精确识别xml文件中叙述的webp图片,也会变成加载webp失利。

不便于预览

因为webp的图片格式是很难预览的,as也尚无艺术直接预览webp格式,作者日常是通过chrome浏览器张开webp,非常不低价。

亚洲必赢官方登录 69

image_1asbq487rk9b1ff514p7nrefe02a.png-115.1kB

大家掌握gradle在build时,有八个mergeXXXResource Task,它将品种的次第aar中负有的res能源统整到/build/intermediates/res/flavorName/{buildType}目录下。

webpConvertPlugin本条gradle插件能够在mergeXXXResource Task和processXXXResource Task之间插入二个task,那几个task会将上述目录下的drawable实行统一管理,将品种目录里的png、jpg图片(不包括.9图片,webp调换后显示效果倒霉)批量拍卖成webp图片,那样能够让我们在平凡支出时用png、jpg,正式发包时用webp。

复用图片

复用同样的icon

笔者们透过svg能够让一张图纸适用于不相同大小的容器中,以完毕复用的指标。最普遍的例证就是“叉”,除非您的x是有三种颜料的,那么这种代表关闭的icon可以复用到广大地点。

亚洲必赢官方登录 70

image_1arst9t8p1tq61k8117n31489eg22a.png-12.5kB

亚洲必赢官方登录 71

image_1as1sslhf1r0a10mr18rnccg1m6o9.png-24.5kB

上海体育场地中本人通过结合的法门将长得千篇一律的icon(facebook、renren等)复用到了分化的界面中,不唯有达成了职能,可维护性也没有错。

使用Tint

着色器(tint)是二个强硬的工具,我将其和shape、svg等整合后爆发了化学反应。TintMode共有6种,分别是:add,multiply,screen,srcatop,srcin(私下认可),src_over。下图是一篇小说中的总括,表明了其灵活性

亚洲必赢官方登录 72

image_1as22gvi1jdc16ji1p67a3dqu613.png-67.8kB

诚如用私下认可的格局就能够化解大多数须要了,使用到的控件首借使TextView和ImageButton。ImageButton官方已经付出了援救方案,TextView因为有多个Drawable,官方的tint属性在低版本又不可用,所以本身让SelectorTextView援助了一晃。如若您想要通晓具体的十分方法,可以参谋库代码或《Drawable 着色的后向宽容方案》。

ImageButton

android:tint="@color/blue"

SelectorTextView

app:drawableLeftTint="@color/orange"
app:drawableRightTint="@color/green"
app:drawableTopTint="@color/green"
app:drawableBottomTint="@color/green"

因为本人用了SelectorTextView和SelectorImageButton,所以作者对此背景的tint没有怎么须要,也就没做包容性测验,风乐趣的校友能够品味一下。假诺你说了算要采纳tint,绝对要由此云测等手腕做下宽容性测量试验,下图是本身对于上述性格的测量试验结果:

亚洲必赢官方登录 73

image_1as2382s1sfleismn21q991h8b1t.png-218.6kB

复用按压效果

贰个使用中的list页面都应该做一定水准的统一,对于个别长度的list,我们也许偏侧于用ScrollView做,对于极端长的list用RecyclerView做,但对于它们的按压效果本人刚毅提议选择同八个体制。

亚洲必赢官方登录 74

image_1arsu35djprokc73jpp3c1cj22n.png-75.1kB

以微信为例,它的有所列表都以反动的item,笔者的优化思路如下:

  1. 列表由LinearLayout、RecyclerView组成
  2. 分界线用联合的shape实行绘图,不用切图
  3. 整整列表背景设置为深绿
  4. item的背景是二个selector文件,正常时颜色是透明,按下后边世翠绿

由此旋转来复用

一旦二个icon能够经过另一个icon的旋转变换到获得,那么咱们就能够透过如下方法来达成:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/blue_btn_icon" // 原始icon
    android:fromDegrees="180" // 旋转角度
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="180" />

亚洲必赢官方登录 75

image_1art1llie1j2j1hac1hmtndbe1g9.png-28.3kB

这种情势虽好,可是不用滥用。须求看代码的人了解这种思路,不然会冒出糟糕维护的动静。当设计真正是以为四个图有诸如此比的涉嫌的时候才可这么完成,万不可耍小智慧。

减去图片

图表的削减计策是:

  1. 开始的一段时期压大图,后小图
  2. 不压.9图(svg在侠义上不算图)
  3. 对于开屏大图片的回退需集中力度,要和安排性确认后再做
  4. 对于体量特别大(超过50k)的图样能源得以考虑有损压缩

关于怎么样量化两张图片在视觉上的距离,Google提供了一个叫butteraugli的工具,有意思味的同窗能够品尝一下。

ImageOptim

mac上超好用的图纸压缩工具是ImageOptim,它集成了不计其数好用图形压缩库,非常多blog中的图片也是用它来收缩的。

亚洲必赢官方登录 76

image_1ar7a83kr1lrns861di8q3mm6p2q.png-639.7kB

值得一说的是,借助Zopfli,它能够在不更动png图像品质的状态下使图片大小分明变小。

pngquant

pngquant也是一款知名的压缩工具,对于png的医疗效果还不易,但它不自然就切合app中这种背景透明的小icon,所以相比较起tinypng来讲,优势不醒目。

亚洲必赢官方登录 77

image_1art6qlf812hk1c19l0h1te413u6m.png-56.6kB

上海体育场地的数码来自:http://www.jianshu.com/p/a721fbaa62ab

tinypng

tinypng是一款万分闻名的商用压缩工具,tinypng提供了开放接口供开采者开采属于自身的压缩工具(付费服务)。tinypng对于免开支户也算自个儿,每月能够无需付费压缩几百张图片。

我用gradle插件来行使tinypng,越发简便易行方便。我日常的做法是发版本前才做贰次图片压缩,每一次debug的时候是平昔跳过那几个task的,完全不影响普通的debug。

tinyinfo {
    apiKey = 'xxxxxxxxx'
    //编译时是否跳过此task
    skip = true
    //是否打印日志
    isShowLog = true
}

有些人会说tinypng的劣点是在缩减有个别含有过渡效果(带阿尔法值)的图纸时,图片大概会失真,对于这种图片你能够将png图片调换为webP格式。

注意事项

aapt暗中同意会在卷入时开展图纸的缩减工作(无论你知不知道道,它直接在默默的办事),假诺您曾经做了图片压缩了,那么指动手动制止这几个效能,不然“大概会”出现图片三次缩减后反而变大的情景,原因请看:Smaller PNGs, and Android’s AAPT tool。

亚洲必赢官方登录 78

image_1art7sk821fugmvh172i1tnkhi713.png-404.5kB

android {  
    defaultConfig {  
        //...
    }  

    aaptOptions {  
        cruncherEnabled = false 
    }  
} 

优化dex

dex本人的体量依然很可观的,虽说代码那东西不占用多少存储空间,不过微信那样的大厂的dex已经完毕了20多M。小编大致推测了须臾间,假如您从未到达方法数上限,那么您的dex的高低差没多少是10M。纵观应用商铺,未有用multiDex的又有几家啊?

笔录方法数和代码行数

dexcout

要优化那部分,首先供给对厂家的、android库的、第三方库的代码实行深切的刺探,作者用了dexcount来记录项目标方法数:

dexcount {
    format = "list"
    includeClasses = false
    includeFieldCount = true
    includeTotalMethodCount = false
    orderByMethodCount = false
    verbose = false
    maxTreeDepth = Integer.MAX_VALUE
    teamCityIntegration = false
}

亚洲必赢官方登录 79

image_1arpdkoh618hc5ss1ud51buhf79ho.png-172.9kB

通过深入分析你可见代码的具体景况了,举例某些第三方库是还是不是业已不用了、自个儿项目标哪位包的章程数最多、方今代码意况是或不是站得住等等。

statistic

本人是因而Statistic其一as插件来评估项目中开垦职员写的代码量的,它生成的表格也未可厚非:

亚洲必赢官方登录 80

image_1arpdsqips6jp323969fivcqi5.png-123.4kB

亚洲必赢官方登录 81

image_1arpduoqa107u8vn8cv1thm1nn0ii.png-145.2kB

今昔小编得以通晓:
什么类空行数太多,是或不是从未有过依据代码标准来;
什么样类的代码量少之又少,是不是有存在的必要;
什么类行数过多,是或不是未有遵守单一职务标准,是不是能够实行进一步的拆分

apk method

您还足以用apk-method-count其一工具来查阅项目中各种包中的法子数,它会生成树形结构的文档,十二分直观。

亚洲必赢官方登录 82

image_1arpedp5l1vrn191t1j7b1gkm7q2iv.png-258.2kB

动用Lint剖析无用代码

只要你想删掉未有应用的代码,能够借助as中的Inspect Code对工程做静态代码检查。

亚洲必赢官方登录 83

image_1arpbjnn0gq41604v1p82g1p4dgh.png-52.8kB

亚洲必赢官方登录 84

image_1arpbrhdp2221n1k7ob15ae1ijrgu.png-141.6kB

Lint是贰个一定强劲的工具,它能做的事体自然不限于检查无用能源和代码,它仍可以够检查测量试验遗失的品质、写错的单位(dp/sp)、放错像素目录的图形、会唤起内部存储器溢出的代码等等。从eclipse时期进步到前些天,lint真的是尤其方便了,我们前几日只必要点一点就行。

Lint的强有力也会带来相应的老毛病,缺点正是浮动的新闻量过多,不符合快捷稳定无用的代码。笔者引入的流程是到下图中的结果中央直属机关接看行不通的代码和方式。

亚洲必赢官方登录 85

image_1arpccgij2hjtgi1s7nuob8o5hb.png-160.3kB

注意:
这种删除无用代码的劳作急需频仍多次展开(举个例子二月一遍)。当您剔除了无用代码后,那么些代码中用到的能源也会被标志为无用,那时就足以透过上文提到的Remove Unused Resources来删除。

由此proguard来删除无用代码

手动删除无用代码的流程太繁杂了,要是是一一遍倒还恐怕会拉动删除代码的直爽感,但万一是专人机械性持续工作,那家伙肯定要疯的。为了有限接济每一回打包后的apk都含有尽大概少的不行代码,我们可以在build.gradle中举办如下配置:

android {
    buildTypes {
        release {
            minifyEnabled true // 是否混淆
        }
    }
}

就算如此这种艺术成果显著,但也须求相称正确的proguard配置能力起效果,推荐看下读懂 Android 中的代码混淆一文。

这种利用混淆来删除代码的诀要是一种保证措施,真正治本的章程依然在付出进度中随手删除无用的代码,毕竟开垦者才是最领会一段代码该不应该被删的。作者此前便是随手清理了下没用的代码,然后就莫明其妙的决不采纳mulitdex了。

去除测量检验代码

我们在测量试验的时候恐怕会随意写点测验方法,举例main方法之类的,并且还有或者会引入一些测量检验库。对于测量试验蒙受的代码gradle提供了很有利的androidTest和test目录来隔开分离生产条件。
对此测量试验时用到的大量库,能够展开test信任,那样就足以确定保障测验代码不会污染线上代码,也得防止御把测量检验工具、代码等发布到线上等不当(搜狐就干过那样的工作)。

// Dependencies for local unit tests
testCompile 'junit:junit:4.12'
testCompile  'org.hamcrest:hamcrest-junit:2.0.0.0'

// Android Testing Support Library's runner and rules
androidTestCompile 'com.android.support:support-annotations:24.1.1'
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'com.android.support.test:rules:0.5'

// Espresso UI Testing
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
})

PS:在layout中利用tools也是为了实现上述目标。

区分debug/rtm/release模式

debug方式是开采者的调节和测量试验形式,那些方式下log全开,何况会有部分助手调解的工具(例如:leakcanary,stetho),大家得以经过debugCompilereleaseCompile来做分化的正视,一时候也会必要no-op(关于no-op的剧情能够参照下开采第三方库最好实践)。

 dependencies {
   debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2'
   releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
   testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
 }

debug和release是android本人自带的三种生育情状,在实际上中大家可能要求有八个情况,例如提测意况、预发意况等,作者以rtm(Release to 马努facturing 也许 Release to Marketing的简称)遇到做例子。

先是在目录下开创rtm文件:

亚洲必赢官方登录 86

image_1arpi1tfq1dd5pga35j10ntuhjjc.png-12.3kB

复刻release的配置:

buildTypes {
    release {
        zipAlignEnabled true
        minifyEnabled true
        shrinkResources true // 是否去除无效的资源文件
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        signingConfig signingConfigs.release
    }
    rtm.initWith(buildTypes.release)
    rtm {}
    debug {
        multiDexEnabled true
    }
}

配置rtm依赖:

ext {
    leakcanaryVersion = '1.3.1'
}

dependencies {
    debugCompile "com.squareup.leakcanary:leakcanary-android:$leakcanaryVersion"
    rtmCompile "com.squareup.leakcanary:leakcanary-android-no-op:$leakcanaryVersion"
    releaseCompile "com.squareup.leakcanary:leakcanary-android-no-op:$leakcanaryVersion"
}

rtm情状自然也会有动态替换application文件的力量,笔者为着方便非开荒者区分app种类,作者做了开行icon的替换。

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.kale.example"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    >

    <application
        android:name=".RtmApplication"
        android:allowBackup="true"
        android:icon="@drawable/rtm_icon"
        tools:replace="android:name,android:icon"
        />

</manifest>

今天本身能够将情况的确要求的代码打包,无需的代码全体刨除,以高达塑身的目标。

行使拆分后的support库

Google目前特有将support-v4库实行拆分,可是没有办法v4被引述的地点太多了,但那真是二个好的起头。近期来看使用拆分后的support库是绝非什么长处的,所以自个儿也不提出现在就从头入手,当Google和第三方库小编都起先确实往那上头想的时候,你再起来吧。

减掉方法数,不用mulitdex

mulitdex会开展分包,分包的结果自然比原本的包要大学一年级些些,能不用mulitdex则不用。但假诺艺命理术数超了,除了插件化和CR-VN动态发包等奇淫巧技外自个儿也没怎么好点子了。

应用越来越小库或联合现存库

一样功效就用一个库,制止叁个app中有七个网络库、四个图片库的场合出现。倘使贰个库相当的大,而且申请了种种权力,那么就去思虑换掉他。

话人人都会说,但一旦三个种类是由三个体系成员同盟完结的,很难幸免重复引用库的标题,同一个功力用差别的库,大概贰个库用不一样版本的景况如拾草芥,那也是很难去解决的。笔者的化解方案是机构之间多交换,尽量做base层,base层由个别人进行敬重,正如微信在so库层面包车型大巴做法:

  1. C++运转时库统一使用stlport_shared
    事先微信中的C++运营库大多选用静态编写翻译形式,使用stlport_shared格局可减小APK包大小,也正是把大家公有的代码提抽出来放一份,收缩冗余。同期也会省掉一点内部存款和储蓄器,加载so的时候动态库只会加载三次,静态库则趁机so的加载被加载多份内部存款和储蓄器影像。
  1. 把公用的C++模块分红作用库
    实则与地点的思路是同等的,首要为了削减冗余模块。大家都用到的片段基础成效,应该分红基础模块。

总结

app的瘦腿是三个长久而且辛苦的行事,假使是小百货店提议二个月做一回。大集团的话日常都会对app的大小举办连发的计算和追踪,有余力的小商号也可以多多借鉴一下。希望我们阅读完本文后方可出手对项目举办优化办事,带来真正的入账。

亚洲必赢官方登录 87

developer_kale@foxmail.com

参考资料:
smaller apk种类文章:
https://medium.com/google-developers/smallerapk-part-1-anatomy-of-an-apk-da83c25e7003

本文由亚洲必赢官方登录发布于儿童文学,转载请注明出处:【亚洲必赢官方登录】App瘦身最佳实践

关键词: