代码打包签名
Android Studio为大家集成了代码打包混淆的功能,具体操作流程如下组图所示:
1、点击Android Studio上方工具栏的 Build -> Generate Signed APK 选项,弹出如下右图所示的对话框:
2、这里需要创建一个Key Store,如果你已经有了一个Key Store,那么Android Studio会让你输入密码直接进行签名打包;如果还没有key Store,那么就点击 Create New 按钮去创建一个Key Store,如下图:
3、在上图所示的框中填入信息(基本上随便填一个就行),后面几个空可以不填,填完后点击 OK 按钮继续,系统对Key Store进行保存后跳转回到前一个对话框:
4、在对话框中填入刚才申请的Key Store的信息,点击 Next 按钮继续,跳转到下图所示的对话框:
5、输入刚才设置的密码,点击 OK 按钮,跳转到下面的对话框:
6、APK Destination Folder选择的是Project或Module的路径,Build Type是release。Flavors因为是我配置了MultiDex,因此会有两个版本,保持默认就行,点击Finish,Andorid Studio就会开始签名打包,成功后会在右上角显示一个提示框:
7、点击 Show In Explorer 跳转到文件目录中,就可以看到刚才生成的APK文件了。
代码混淆
代码混淆是为了防止反编译。如果没有对APP进行代码混淆,那么其他人很容易就可以得到你的APP中的所有代码。而混淆之后,其他人就没那么容易获得了。
代码混淆主要是在一个叫做 proguard-rules.pro 的文件中进行的,这个文件在Module目录下。
要想设置代码混淆,我们需要先配置项目,让它支持混淆,方法是在主Module的build.gradle文件中将 minifyEnabled 设置为true即可,具体代码如下:
android { compileSdkVersion 24 buildToolsVersion "24.0.2" defaultConfig { applicationId "com.example.itgungnir.testmultidex" minSdkVersion 11 targetSdkVersion 24 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled true // 设置代码混淆 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:24.2.1' testCompile 'junit:junit:4.12' }
设置了代码混淆,接下来就是在 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 # 保持 native 方法不被混淆 -keepclasseswithmembernames class * { 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); } # 保持枚举 enum 类不被混淆 -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } # 保持 Parcelable 不被混淆 -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; }
以下是一些常见的框架的混淆代码:
Retrofit的混淆代码:
# Retrofit 混淆代码 -dontwarn retrofit.** -keep class retrofit.** { *; } -keepattributes Signature -keepattributes Exceptions
RxJava的混淆代码:
# RxJava 混淆代码 -dontwarn sun.misc.** -keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* { long producerIndex; long consumerIndex; } -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef { rx.internal.util.atomic.LinkedQueueNode producerNode; } -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef { rx.internal.util.atomic.LinkedQueueNode consumerNode; }
ButterKnife的混淆代码:
# ButterKnife 混淆代码 -keep class butterknife.** { *; } -dontwarn butterknife.internal.** -keep class **$$ViewBinder { *; } -keepclasseswithmembernames class * { @butterknife.* <fields>; } -keepclasseswithmembernames class * { @butterknife.* <methods>; }
Glide的混淆代码:
# Glide 混淆代码 -keep public class * implements com.bumptech.glide.module.GlideModule -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { **[] $VALUES; public *; }
EventBus的混淆代码:
# EventBus 混淆代码 -keepattributes *Annotation* -keepclassmembers class ** { @org.greenrobot.eventbus.Subscribe <methods>; } -keep enum org.greenrobot.eventbus.ThreadMode { *; } -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent { <init>(java.lang.Throwable); }
ORMLite的混淆代码:
# OrmLite 混淆代码 -keep class com.j256.** -keepclassmembers class com.j256.** { *; } -keep enum com.j256.** -keepclassmembers enum com.j256.** { *; } -keep interface com.j256.** -keepclassmembers interface com.j256.** { *; } -keepattributes *Annotation* -keepclassmembers class * { @com.j256.ormlite.field.DatabaseField *; }
GreenDao的混淆代码:
# GreenDao 混淆代码 -keepclassmembers class * extends org.greenrobot.greendao.AbstractDao { public static java.lang.String TABLENAME; } -keep class **$Properties # If you do not use SQLCipher: -dontwarn org.greenrobot.greendao.database.** # If you do not use Rx: -dontwarn rx.**
FastJson的混淆代码:
# FastJson 混淆代码 -dontwarn com.alibaba.fastjson.** -keep class com.alibaba.fastjson.** { *; } -keepattributes Signature -keepattributes *Annotation*
Fresco的混淆代码:
# Fresco 混淆代码 -keep class com.facebook.fresco.** {*;} -keep interface com.facebook.fresco.** {*;} -keep enum com.facebook.fresco.** {*;}
OkHttp的混淆代码:
# OkHttp 混淆代码 -dontwarn com.squareup.okhttp3.** -keep class com.squareup.okhttp3.** { *;} -dontwarn okio.** # Okio -dontwarn com.squareup.** -dontwarn okio.** -keep public class org.codehaus.* { *; } -keep public class java.nio.* { *; }
其他混淆代码请移步:【其他混淆代码】