Android studio 打包混淆

1.app文件夹下这个Module的gradle配置文件,也可以算是整个项目最主要的gradle配置文件

apply plugin: ‘com.android.application’

android {
compileSdkVersion 23
buildToolsVersion ‘23.0.1’

defaultConfig {
    applicationId "com.smm"
    minSdkVersion 14
    targetSdkVersion 23
    versionCode 0
    versionName "0.8"
}
buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

// repositories {
// flatDir {
// dirs ‘libs’
// }
// }
productFlavors {
huawei {}
xiaomi {}
_360 {}
baidu {}
tecent {}
wandoujia {}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
}

dependencies {
compile fileTree(include: [‘*.jar’], dir: ‘libs’)
testCompile ‘junit:junit:4.12’
compile files(‘libs/gson-2.4.jar’)
compile ‘com.zhy:percent-support-extends:1.0.1’
compile ‘com.android.support:appcompat-v7:23.1.1’
compile ‘com.android.support:design:23.1.1’
compile ‘org.litepal.android:core:1.3.1’
compile ‘com.mcxiaoke.volley:library:1.0.19’
compile ‘com.google.android.gms:play-services-appindexing:8.1.0’
compile ‘org.apache.httpcomponents:httpcore:4.4.2’
// compile(name:’socialsharelibrary’, ext:’aar’)
compile project(‘:socialsharelibrary’)
文件开头apply plugin是最新gradle版本的写法,以前的写法是apply plugin: ‘android’, 如果还是以前的写法,请改正过来。

buildToolsVersion这个需要你本地安装该版本才行,很多人导入新的第三方库,失败的原因之一是build version的版本不对,这个可以手动更改成你本地已有的版本或者打开 SDK Manager 去下载对应版本。

applicationId代表应用的包名,也是最新的写法,这里就不在多说了。

android 5.0开始默认安装jdk1.7才能编译
minifyEnabled(混淆)也是最新的语法,很早之前是runProguard,这个也需要更新下。

proguardFiles这部分有两段,前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,免去了我们很多事,这个文件的目录在 /tools/proguard/proguard-android.txt , 后一部分是我们项目里的自定义的混淆文件,目录就在 app/proguard-rules.txt , 如果你用Studio 1.0创建的新项目默认生成的文件名是 proguard-rules.pro , 这个名字没关系,在这个文件里你可以声明一些第三方依赖的一些混淆规则,后面会具体讲到。
compile project(‘:extras:ShimmerAndroid’)这一行是因为项目中存在其他Module,你可以理解成Android Library,由于Gradle的普及以及远程仓库的完善,这种依赖渐渐的会变得非常不常见,但是你需要知道有这种依赖的。

3.gradle目录下有个 wrapper 文件夹,里面可以看到有两个文件,我们主要看下 gradle-wrapper.properties 这个文件的内容:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https://services.gradle.org/distributions/gradle-2.2.1-all.zip

可以看到里面声明了gradle的目录与下载路径以及当前项目使用的gradle版本,这些默认的路径我们一般不会更改的,这个文件里指明的gradle版本不对也是很多导包不成功的原因之一

4.settings.gradle

这个文件是全局的项目配置文件,里面主要声明一些需要加入gradle的module

include ‘:recorder’
文件中recorder是项目的module,如果还有其他module按照相同的格式加上去。

代码混淆
下面是常见的的proguard-rules.pro配置项:

指定代码的压缩级别

-optimizationpasses 5

包明不混合大小写

-dontusemixedcaseclassnames

不去忽略非公共的库类

-dontskipnonpubliclibraryclasses

#优化 不优化输入的类文件
-dontoptimize

#预校验
-dontpreverify

#混淆时是否记录日志
-verbose

# 混淆时所采用的算法
-optimizations !code/simplification/arithmetic,!field/,!class/merging/

保护注解

-keepattributes Annotation

-obfuscationdictionary dictionary.txt

保持哪些类不被混淆

-keep public class * extends android.app.Fragment
-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

#忽略警告
-ignorewarning

记录生成的日志数据,gradle build时在本项目根目录输出

apk 包内所有 class 的内部结构

-dump class_files.txt

未混淆的类和成员

-printseeds seeds.txt

列出从 apk 中删除的代码

-printusage unused.txt

混淆前后的映射

-printmapping mapping.txt

-dontwarn com.mcxiaoke.volley.jar.**
-dontwarn android.support.**
-dontwarn org.json.**
-dontwarn com.google.gson.**

————— BEGIN: volley ———-

-keepattributes Signature
-keepattributes Annotation
-keep class com.mcxiaoke.volley.* { ; }
-keep class com.mcxiaoke.volley.toolbox.* {;}
-keep class com.mcxiaoke.volley.Response ;keepclasscom.mcxiaoke.volley.Request * { *; }
-keep class com.mcxiaoke.volley.RequestQueue ;keepclasscom.mcxiaoke.volley.toolbox.HurlStack * { *; }
-keep class com.mcxiaoke.volley.toolbox.ImageLoader$* { *; }

-keep interface com.mcxiaoke.volley.* { ; }

-dontwarn com.mcxiaoke.volley.**

-dontwarn com.android.volley.jar.**

-keep class com.android.volley.*{;}

————— END: volley ———-

Application classes that will be serialized/deserialized over Gson

-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.* { ; }
-keep class com.google.gson.* {;}
-keep class org.json.* {;}
-keep class com.google.gson.examples.android.model.* { ; }
-keep class com.smm.model.* {;}

-keep class org.apache.httpcomponents.*{;}
-dontwarn org.apache.http.**
-keep class org.apache.http.*{;}

————— BEGIN: okio ———-

-dontwarn java.nio.file.*
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
-dontwarn okio.**

————— END: okio ——-

屏蔽log

-assumenosideeffects class com.apkfuns.logutils {
public static void v(java.lang.Object);
public static void i(java.lang.Object);
public static void d(java.lang.Object);
public static void w(java.lang.Object);
public static void e(java.lang.Object);
public static void wtf(java.lang.Object);
public static void json(java.lang.Object);
}

-keep public class * extends android.view.View {
public (android.content.Context);
public (android.content.Context, android.util.AttributeSet);
public (android.content.Context, android.util.AttributeSet, int);
public void set*(…);
}

保持 native 方法不被混淆

-keepclasseswithmembernames class * {
native ;
}

保持自定义控件类不被混淆

-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet);
}

保持自定义控件类不被混淆

-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}

保持 Parcelable 不被混淆

-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}

保持 Serializable 不被混淆

-keepnames class * implements java.io.Serializable

保持 Serializable 不被混淆并且enum 类也不被混淆

-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient ;
!private ;
!private ;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}

model不混淆

-keepclassmembers class com.smm.model.**{
*;
}

-dontwarn android.support.**

混淆Glide

-keep public class * implements com.bumptech.glide.module.GlideModule

-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {

**[] $VALUES;

public *;

}

##########支付宝

-libraryjars libs/alipaySDK.jar

-keep class com.alipay.android.app.IAlixPay{*;}

-keep class com.alipay.android.app.IAlixPay$Stub{*;}

-keep class com.alipay.android.app.IRemoteServiceCallback{*;}

-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}

-keep class com.alipay.sdk.app.PayTask{ public *;}

-keep class com.alipay.sdk.app.AuthTask{ public *;}

umeng混淆

-dontwarn com.google.android.maps.**
-dontwarn android.webkit.WebView
-dontwarn com.umeng.**
-dontwarn com.tencent.weibo.sdk.**
-keep class com.umeng.* { ; }
-keep class com.umeng.analytics.* { ; }
-keep class com.umeng.common.* { ; }
-keep class com.umeng.newxp.* { ; }

-keep class com.baidu.* { ; }
-keep class vi.com.gdi.bgl.android.*{;}

-keepattributes Exceptions,InnerClasses,Signature
-keepattributes Annotation
-keepattributes SourceFile,LineNumberTable

-keep public interface com.tencent.**
-keep public interface com.umeng.socialize.**
-keep public interface com.umeng.socialize.sensor.**
-keep public interface com.umeng.scrshot.**

-keep public class com.umeng.socialize.* {*;}
-keep public class javax.**
-keep public class android.webkit.**

-keep class com.umeng.scrshot.**
-keep public class com.tencent.* {;}
-keep class com.umeng.socialize.sensor.**

-keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {*;}

-keep class com.tencent.mm.sdk.modelmsg.* implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {;}

-keep class im.yixin.sdk.api.YXMessage {*;}

-keep class im.yixin.sdk.api.* implements im.yixin.sdk.api.YXMessage$YXMessageData{;}

-keep public class [your_pkg].R$*{
public static final int *;
}

litepal混淆

-dontwarn org.litepal.*
-keep class org.litepal.* { ; }
-keep enum org.litepal.**
-keep interface org.litepal.* { ; }
-keep public class * extends org.litepal.**
-keepattributes Annotation
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}

-keepclassmembers class * extends org.litepal.crud.DataSupport{
private * ;
}
#

-keep public class com.tencent.bugly.*{;}

你可能感兴趣的:(gradle)