bulid.gradle 文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 signingConfigs { renrenDebug { keyAlias 'test' keyPassword 'test' storeFile file('../tool/test.key' ) storePassword 'test' } } sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src' ] resources.srcDirs = ['src' ] aidl.srcDirs = ['src' ] renderscript.srcDirs = ['src' ] res.srcDirs = ['res' ] assets.srcDirs = ['assets' ] jniLibs.srcDirs = ['libs' ] } } lintOptions { abortOnError false ; } buildTypes { debug { signingConfig signingConfigs.debug shrinkResources false zipAlignEnabled false minifyEnabled false buildConfigField "boolean" , "TEST_ENV" , "true" manifestPlaceholders = [WECHATAPPID: "wxea2b67dxxxxxx" ] } release { signingConfig signingConfigs.release shrinkResources true zipAlignEnabled true minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt' ), 'proguard-rules.pro' buildConfigField "boolean" , "TEST_ENV" , "false" manifestPlaceholders = [WECHATAPPID: "wxb093774eaxxxxxx" ] applicationVariants.all { variant -> variant.outputs.each { output -> def outputFile = output.outputFile if (outputFile != null && outputFile.name.endsWith('.apk' )) { def fileName = "LOU_${releaseTime()}_V${defaultConfig.versionName}.apk" output.outputFile = new File(outputFile.parent, fileName) } } } } } } def releaseTime() { return new Date().format("yyyMMdd" , TimeZone.getTimeZone("UTC" )) }
proguard 混淆配置 为什么要过滤混淆
(http://blog.csdn.net/fengyuzhengfan/article/details/43876197) ProGuard 默认会对第三方库也进行混淆的,而第三方库有的已经混淆过了,有的使用了 Java 反射技术,所以我们在进行代码混淆的时候要排除这些第三方库。排除对第三方库的混淆需要在混淆规则文件(通常是:proguard-project.txt 或 proguard.cfg 或 proguard-rules.pro 或 proguard-rules.txt 也可以是其它的文件名只要在配置文件中将含有混淆规则的文件名配置进去就行了)中添加如下规则: 1.如果使用了 Gson 之类的工具要使 JavaBean 类即实体类不被混淆。 2.如果使用了自定义控件那么要保证它们不参与混淆。 3.如果使用了枚举要保证枚举不被混淆。 4.对第三方库中的类不进行混淆
proguard-rules.pro 文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 -keepclassmembers class fqcn.of.javascript.interface.for.webview { public * } -ignorewarning -assumenosideeffects class android.util.Log { public static *** d(...) public static *** i(...) public static *** w(...) }
参考资料
Avoid Maven dynamic dependency resolution. (such as 2.1.+
) this result in different and unstable builds or subtle, untracked difference in behavior between builds.
在配置 build.gradle
的时候,避免直接写入敏感信息(例如:密码),而是写入到版本控制工具 忽略的文件gradle.properties
中。
https://github.com/futurice/android-best-practices#gradle-configuration
针对测试版本和发布版本使用不同的 appId, 这样两个版本就可以同时存在在一个设备上了。 可以通过前缀或后缀的方式来区分。
https://github.com/futurice/android-best-practices#gradle-configuration
使用 Maven 依赖方案代替使用导入 jar 包方案 如果在你的项目中你明确使用率 jar 文件,那么它们可能成为永久的版本,如 2.1.1.下载 jar 包更新他们是很繁琐的, 这个问题 Maven 很好的解决了,这在 Android Gradle 构建中也是推荐的方法。你可以指定版本的一个范围,如 2.1.+,然后 Maven 会自动升级到制定的最新版本,例如:
1 2 3 4 5 6 7 8 9 dependencies { compile 'com.netflix.rxjava:rxjava-core:0.19.+' compile 'com.netflix.rxjava:rxjava-android:0.19.+' compile 'com.fasterxml.jackson.core:jackson-databind:2.4.+' compile 'com.fasterxml.jackson.core:jackson-core:2.4.+' compile 'com.fasterxml.jackson.core:jackson-annotations:2.4.+' compile 'com.squareup.okhttp:okhttp:2.0.+' compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.+' }
参考资料