【Android

代码打包签名

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.* { *; }

其他混淆代码请移步:【其他混淆代码】

原文地址:https://www.cnblogs.com/itgungnir/p/6210920.html