android 签名混淆-多渠道打包
概述:以前觉得混淆没那么重要现在那是因为没有什么重要的上线项目,现在依然没有(已哭),怕日后会用到所以在这里做个记录,看了之前的几篇博客访问量寥寥无几但是觉得也没啥,别人不看我就自己看呗是不是。
混淆
首先看不签名的混淆方式
在modle build.gradle中修改添加
buildTypes {
debug {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'debug-proguard-rules.pro'
}
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
在proguard-rules.pro中
-optimizationpasses 5 # 指定代码的压缩级别
-dontusemixedcaseclassnames # 是否使用大小写混合
-dontpreverify # 混淆时是否做预校验
-verbose # 混淆时是否记录日志
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆时所采用的算法
-keep public class * extends android.app.Activity # 保持哪些类不被混淆
-keep public class * extends android.app.Application # 保持哪些类不被混淆
-keep public class * extends android.app.Service # 保持哪些类不被混淆
-keep public class * extends android.content.BroadcastReceiver # 保持哪些类不被混淆
-keep public class * extends android.content.ContentProvider # 保持哪些类不被混淆
-keep public class * extends android.app.backup.BackupAgentHelper # 保持哪些类不被混淆
-keep public class * extends android.preference.Preference # 保持哪些类不被混淆
-keep public class com.android.vending.licensing.ILicensingService # 保持哪些类不被混淆
#如果引用了v4或者v7包
-dontwarn android.support.*
-keepclasseswithmembernames class * { # 保持 native 方法不被混淆
native <methods>;
}
-keepclasseswithmembers class * { # 保持自定义控件类不被混淆
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {# 保持自定义控件类不被混淆
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity { # 保持自定义控件类不被混淆
public void *(android.view.View);
}
-keepclassmembers enum * { # 保持枚举 enum 类不被混淆
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆
public static final android.os.Parcelable$Creator *;
}
#注解混淆
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
@butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
@butterknife.* <methods>;
}
签名打包
签名打包无非就是添加几个配置参数
signingConfigs {
release {
storeFile file("C:\\appkey.jks")
keyAlias "android"
keyPassword "android"
storePassword "android"
}
}
buildTypes {
debug {
minifyEnabled true
shrinkResources true
signingConfig signingConfigs.release
}
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
以上只是我的个人看法,在这里只是做个备忘录而已。
注解黄油刀的使用方式:8.4.0版本为例
project build.gradle:
dependencies {
……
classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0'
}
module.gradle
apply plugin: 'com.jakewharton.butterknife'
dependencies {
……
compile 'com.jakewharton:butterknife:8.4.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
}
多渠道打包
以友盟SDK为例,打包多渠道:GooglePaly,小米,友盟,360,豌豆荚,应用宝。
在AndroidManifest.xml中加入渠道区分标识
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
然后在build.gradle(Module: app)中加入渠道打包替换对应的UMENG_CHANNEL_VALUE代码
android {
……
……
productFlavors {
kuan {}
xiaomi {}
qh360 {}
baidu {}
wandoujia {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
apk名字
我们还可以指定不同渠道号生成的apk的名字,这样方便打包出来区别哪个apk是对应哪个渠道的。以下的例子生成的命名格式 app_v(版本号)打包时间渠道号.apk
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
File outputDirectory = new File(outputFile.parent);
def fileName
if (variant.buildType.name == "release") {
fileName = "app_v_${rootProject.ext.android.versionName}_${variant.productFlavors[0].name}.apk"
} else {
fileName = "app_v_${rootProject.ext.android.versionName}_${variant.productFlavors[0].name}_beta.apk"
}
output.outputFile = new File(outputDirectory, fileName)
}
}
}
打包apk
在终端窗口,或者可以使用AndroidStudio工具栏下面提供的终端 Terminal ,cd 到 项目根目录下执行:
// 打包出上面所有渠道apk
gradlew build
// 下面这行例子是单独打包wandoujia渠道的apk
gradlew assembleWandoujia