zoukankan      html  css  js  c++  java
  • 【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.* { *; }

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

  • 相关阅读:
    c语言中while((c=getchar())!=EOF)怎样才能输入EOF是循环中断
    Python学习笔记之装饰器原理
    Ubuntu中使用pip3报错
    Django配置xadmin后台模板之坑(一)
    ES6之字符串扩展
    Koa中设置中文Cookie值
    node中中间件body-parser的实现方式
    CSS笔记之Grid网格系统
    从0开始搭建vue+webpack脚手架(四)
    从0开始搭建vue+webpack脚手架(三)
  • 原文地址:https://www.cnblogs.com/itgungnir/p/6210920.html
Copyright © 2011-2022 走看看