使用gradle打包签名及混淆的apk

刚刚学会了使用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文件夹,该文件夹下是混淆文件:

  • dump.txt 描述apk文件中所有类文件间的内部结构。
  • mapping.txt 列出了原始的类,方法,和字段名与混淆后代码之间的映射。
  • seeds.txt 列出了未被混淆的类和成员
  • usage.txt 列出了从apk中删除的代码

如果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'
      //混淆
     }
    }

}

 

 

 

 

你可能感兴趣的:(android,加密,gradle,反编译)