一、开启minifyEnabled混淆代码
在app/build.gradle打开minifyEnabled:
android {
buildTypes {
release {
minifyEanbled : true
}
}
}
二、开启shrinkResources去除无用资源
在app/build.gradle打开shrinkResources:
android {
buildTypes {
release {
minifyEanbled : true
shrinkResources true
}
}
}
shrinkResources依赖于minifyEnabled,必须和minifyEnabled一起用,就是打开shrinkResources也必须打开minifyEnabled。
三、删除未使用到的xml和图片
如何知道哪些xml和图片未被使用到?使用Android Studio的Lint,步骤:
Android Studio -> Menu -> Refactor -> Remove Unused Resources
选择 Refactor 一键删除
选择 Perview 预览未使用到的资源
或者
点击菜单栏 Analyze -> Run Inspection by Name -> unused resources -> Moudule ‘app’ -> OK,这样会搜出来哪些未被使用到未使用到xml和图片,如下:
四、使用shape作为背景
很多点击效果可能会使用到图片,可以换成shape是实现,我查看了下,微言APP都是shape实现的,Good。
五、使用微信Android资源混淆工具
微信AndResGuard是一个帮助你缩小APK大小的工具,详情: Android资源混淆工具说明
使用方法:
Project/build.gradle
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.0'
}
}
app/build.gradle
apply plugin: 'AndResGuard'
def supportVersion = "25.0.0"
android {
...
signingConfigs {
release {
storeFile file('keystore/android.keystore')
storePassword '123456'
keyAlias 'android.keystore'
keyPassword '123456'
}
debug {
storeFile file('keystore/android.keystore')
storePassword '123456'
keyAlias 'android.keystore'
keyPassword '123456'
}
}
buildTypes {
release {
...
signingConfig signingConfigs.release
}
}
}
andResGuard {
// mappingFile = file("./resource_mapping.txt")
//mappingFile用于增量更新,保持本次混淆与上次混淆结果一致;
mappingFile = null
//uss7zip为true时,useSign必须为true;
use7zip = true
//useSign为true时,需要配置signConfig;
useSign = true
//打开这个开关,会keep住所有资源的原始路径,只混淆资源的名字;
keepRoot = false
//whiteList添加在代码内部需要动态获取的资源id,不混淆这部分;
whiteList = [
// for your icon
"R.drawable.icon",
// for fabric
"R.string.com.crashlytics.*",
// for umeng update
"R.string.umeng*",
"R.string.UM*",
"R.string.tb_*",
"R.layout.umeng*",
"R.layout.tb_*",
"R.drawable.umeng*",
"R.drawable.tb_*",
"R.anim.umeng*",
"R.color.umeng*",
"R.color.tb_*",
"R.style.\*UM\*",
"R.style.umeng*",
"R.id.umeng*",
// 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",
// umeng share for facebook
"R.layout.\*facebook\*",
"R.id.\*facebook\*",
// umeng share for messager
"R.layout.\*messager\*",
"R.id.\*messager\*",
// umeng share commond
"R.id.progress\_bar\_parent",
"R.id.webView"
]
//用来指定文件重打包时是否压缩指定文件;
compressFilePattern = [
"*.png",
"*.jpg",
"*.jpeg",
"*.gif",
"resources.arsc"
]
//sevenzip可使用artifacr或path,path指本地安装的7za(7zip命令行工具)。
sevenzip {
artifact = 'com.tencent.mm:SevenZip:1.2.0'
//path = "/usr/local/bin/7za"
}
}
AndResGuard打包命令行:gradlew resguardRelease,最终的混淆APK会生成在{App}/build/output/apk/AndResGuard目录下。