Android打包优化

Android混淆

http://www.jianshu.com/p/7436a1a32891“>Android 混淆从入门到精通

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

proguard-android.txt 

  1. jni方法不可混淆,因为这个方法需要和native方法保持一致;
  2. 反射用到的类不混淆(否则反射可能出现问题);
  3. AndroidMainfest中的类不混淆,所以四大组件和Application的子类和Framework层下所有的类默认不会进行混淆。自定义的View默认也不会被混淆;所以像网上贴的很多排除自定义View,或四大组件被混淆的规则在Android Studio中是无需加入的;
  4. 与服务端交互时,使用GSON、fastjson等框架解析服务端数据时,所写的JSON对象类不混淆,否则无法将JSON解析成对应的对象;
  5. 使用第三方开源库或者引用其他第三方的SDK包时,如果有特别要求,也需要在混淆文件中加入对应的混淆规则;
  6. 有用到WebView的JS调用也需要保证写的接口方法不混淆,原因和第一条一样;
  7. Parcelable的子类和Creator静态成员变量不混淆,否则会产生Android.os.BadParcelableException异常;
-keep class * implements Android.os.Parcelable { # 保持Parcelable不被混淆            
    public static final Android.os.Parcelable$Creator *;
}
  1. 使用enum类型时需要注意避免以下两个方法混淆,因为enum类的特殊性,以下两个方法会被反射调用,见第二条规则。
-keepclassmembers enum * {  
    public static **[] values();  
    public static ** valueOf(java.lang.String);  
}

打包提速

删除无用的module,lint清理资源文件,删除test模块,减少方法数,multidex最费时。

利用no-op加快debug的速度

剔除重复引用的包

exclude group: 'com.android.support', module: 'support-v4'

放弃lambda,谨慎使用AspectJ

利用MultiChannelPackageTool进行多渠道打包

原理是在zip文件的comment中加入渠道号,这样既可以写入渠道号又不会破坏zip的签名,因为apk本身就是一个zip文件,所以这个规则是可靠并完全适用的。

Android打包黑科技

http://geek.csdn.net/news/detail/76488

添加comments多渠道打包

首先解释什么是comments(注释或评论)的打包方式?

Android应用使用的APK文件就是一个带签名信息的zip文件,根据zip文件格式规范(请参见:https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT),
每个文件的最后都必须有一个叫Central Directory Record
(https://users.cs.jmu.edu/buchhofp/forensics/formats/pkzip.html)的部分,这个CDR的最后部分叫“End of Central Directory Record”,这一部分包含一些元数据,它的末尾是zip文件的注释。注释包含Comment Length和File Comment两个字段。前者表示注释的长度,后者是注释的内容,正确修改这一部分不会对zip文件造成破坏,利用这个字段,我们可以添加一些自定义数据。

简单来说就是:我们利用的是zip文件“可以添加comment(摘要)”的数据结构特点,在文件的末尾写入任意数据,而不用重新解压zip文件(apk文件就是zip文件格式);所以该工具不需要对APK文件解压缩和重新签名即可完成多渠道自动打包,可谓是高效、速度快,无兼容问题。

这种高效的方式是奇虎360的一位工程师公布的,他已经把相关工具的代码开放在GitHub上面了,地址为https://github.com/seven456/MultiChannelPackageTool。工具本身为命令行形式,一条命令即可生成一个多渠道包,并且非常高效。作者本人公布的性能数据是:5M的APK,1秒种能打300个。

可以在下载完了再添加渠道。

美团的Android多渠道打包

把一个Android应用包当作zip文件包进行解压,然后发现在签名生成的目录下添加一个空文件不需要重新签名。利用这个机制,该文件的文件名就是渠道名。这种方式不需要重新签名等步骤,非常高效。

首先把一个已经签名好的Android应用程序包解压缩,签名文件的目录为:META-INF,如图1所示。
分别为:assets目录和META-INF目录

豌豆荚Android多渠道打包

豌豆荚的多渠道打包方案和美团的所用的方式一样,都是添加一个文件,文件本身会带入渠道消息。但不同点在于它添加的是一个不为空的文件。之前已经提到过了,如果添加一个非空文件,就会破坏签名校验,需要重新签名。

加入渠道时主要有以下步骤:
1. 首先需要准备好渠道文件。在Android应用程序包的同级目录,新建一个assets目录,并且在该目录下放入一个channel.txt文件,文件内容是渠道信息,可以是wandoujia或360等。
2. 使用AAPT加入渠道文件:

aapt add wandoujia.apk asserts/channel.txt

3. 在渠道加入后,重新签名APK文件并且进行对齐。

重新签名相关的步骤就不再介绍了,如果感兴趣的话,推荐看一下calabash-android这个开源项目的resign相关部分实现,calabash的重新签名实现是我见过最严谨的。

从安全的角度看多渠道打包方案

在介绍篡改渠道之前,还是先简单介绍AAPT这个工具的一般使用方法。在AndroidSDK的build-tools中。
* 查看Android开发包的基本信息,例如:包名、版本等。以微信的Android版本为例:

```
'' INPUT  apt dump badging weixin.apk
'' OUTPUT package: name='com.tencent.mm' versionCode='740' versionName='6.3.13.49_r4080b63'
'' uses-permission:'com.tencent.mm.plugin.permission.READ'
'' uses-permission:'com.tencent.mm.plugin.permission.WRITE'
'' uses-permission:'com.tencent.mm.permission.MM_MESSAGE'
''  uses-permission:'com.huawei.authentication.HW_ACCESS_AUTH_SERVICE'
'' sdkVersion:'15'
'' targetSdkVersion:'23'
'' uses-feature-not-required:'android.hardware.camera'
'' uses-feature-not-required:'android.hardware.camera.autofocus'
'' uses-feature-not-required:'android.hardware.bluetooth'
'' uses-feature-not-required:'android.hardware.location'
'' uses-feature-not-required:'android.hardware.location.gps'
'' uses-feature-not-required:'android.hardware.location.network'
'' uses-feature-not-required:'android.hardware.microphone'
'' uses-feature-not-required:'android.hardware.telephony'
'' uses-feature-not-required:'android.hardware.touchscreen'
'' uses-feature-not-required:'android.hardware.wifi'
'' uses-permission:'android.permission.ACCESS_NETWORK_STATE'
'' uses-permission:'android.permission.ACCESS_COARSE_LOCATION'
'' uses-permission:'android.permission.ACCESS_FINE_LOCATION'
'' uses-permission:'android.permission.CAMERA'
'' .....
```

* 使用AAPT查看Android开发包的目录结构如下:

'' INPUT aapt list weixin.apk
'' OUTPUT META-INF/MANIFEST.MF
'' META-INF/COM_TENC.SF
'' META-INF/COM_TENC.RSA
'' assets/jsapi/wxjs.js
'' assets/avatar/default_nor_avatar.png
'' assets/avatar/default_meishiapp.png
'' assets/avatar/default_hd_avatar.png
'' assets/ipcall_country_code.txt
'' assets/merged_features.xml
'' assets/address
'' .....

* 使用AAPT添加一个文件:

'' INPUT aapt add wandoujia.apk assets/channel.txt

* 使用AAPT删除一个文件

'' INPUT aapt remove wandoujia.apk assets/channel.txt

在掌握了以上简单的四个命令行后,修改美团的渠道就已经非常简单了。先通过list命令找到渠道文件,然后直接删除文件,最后再加入自己的恶意渠道。但豌豆荚的渠道也可以通过相同的方式来进行篡改,但篡改之后需要重新签名。在没有官方的签名文件时,是没有办法完全伪造一个相同的签名的。

添加comments多渠道打包方式中虽然渠道信息不是明文显示,但也存在着被篡改的可能性。如果自己进行一些简单的加密可以杜绝大多数的恶意篡改,但由于不需要重新签名,这种方法还是存在着被篡改的机率的。

具体选择哪一种多渠道打包方式,还是由业务决定的。豌豆荚作为一个应用商店,需要有自己的渠道,渠道的安全性会很不好。如果是一个普通的App,一般都是在一些应用商店上发布新版本,应用商店本身会给开发者提供相对安全的环境。所以这也就是美团方案依然能够使用的关键。

美团Android自动化之旅—生成渠道包

你可能感兴趣的:(Android学习笔记)