刚刚学会了使用gradle批量打包apk,接下来给apk签名、加混淆。
参考:http://my.oschina.net/sammy1990/blog/271306#OSC_h4_3
1. 签名
签名也就是给apk加密,1.防止被反编译;2.防止应用被其他同包名的应用覆盖。
在build.gradle中添加一下配置:
android {
……
//签名
signingConfigs {
myConfig {
storeFile file("签名文件所在路径/keystore") //签名文件
storePassword "12345"
keyAlias "12345"
keyPassword "12345" //签名密码
}
}
buildTypes{
release {
signingConfig signingConfigs.myConfig
}
}
}
然后执行gradle clean、gradle build,“BUILD SUCCESSFUL”后,在build\outputs\apk目录下带有unsigned字符的apk不见了,说明生成了签名的apk。
2.混淆
对代码进行混淆,会对代码中的变量、类名重命名,一般命名成无意义的字符;也会去除没有用到的代码,对程序进行优化和压缩,增加apk被他人反编译、盗取代码的难度。
buildTypes{
release {
signingConfig signingConfigs.myConfig
//混淆
runProguard true
proguardFile 'Android SDK所在路径/tools/proguard/proguard-android.txt'
//混淆
}
}
如上面代码所示,我们可以使用runProguard true开启混淆,并配置混淆文件。android的sdk中已经为我们提供了两个默认的配置文件,我们可以拿过来进行使用,proguard-android.txt和proguard-android-optimize.txt。
然后执行gradle clean、gradle build,“BUILD SUCCESSFUL”后,在工程build\outputs目录下生成proguard文件夹,该文件夹下是混淆文件:
如果release出去的版本出现了bug,调试的时候可能要用到这些文件,具体的调试方法参考文档里有详细描述。
加了签名配置和混淆配置的build.gradle文件内容如下所示:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.12.+'
}
}
apply plugin: 'android'
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
}
android {
compileSdkVersion 17
buildToolsVersion "22.0.1"
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
// Move the tests to tests/java, tests/res, etc...
instrumentTest.setRoot('tests')
// Move the build types to build-types/<type>
// For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
// This moves them out of them default location under src/<type>/... which would
// conflict with src/ being used by the main source set.
// Adding new build types or product flavors should be accompanied
// by a similar customization.
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
app1{
manifest.srcFile 'tests/AndroidManifest1.xml'
}
app2{
manifest.srcFile 'tests/AndroidManifest2.xml'
}
instrumentTest.setRoot('tests')
}
productFlavors {
useOldManifestMerger true
app1{
//这里可以配置不同的包名
applicationId="com.example.erase1"
}
app2{
applicationId="com.example.erase2"
}
}
//签名
signingConfigs {
myConfig {
storeFile file("../keystore") //签名文件
storePassword "12345"
keyAlias "12345"
keyPassword "12345" //签名密码
}
}
buildTypes{
release {
signingConfig signingConfigs.myConfig
//混淆
runProguard true
proguardFile '../../android-sdks/andrid-sdks/tools/proguard/proguard-android.txt'
//混淆
}
}
}