您的位置:首页 > 移动开发 > Android开发

Android Studio Gradle配置,代码混淆,多渠道一键打包

2017-01-09 11:37 686 查看
以前用eclipse的时候多渠道打包往往依赖于第三方插件,不是很方便也经常打包出错。有了android studio就方便多了。一、我们来先看看Gradle配置
apply plugin: 'com.android.application'
android {
compileSdkVersion 24 //编译的sdk版本
buildToolsVersion '24.0.3'
defaultConfig {
applicationId "com.android.google"//应用包名
minSdkVersion 14
targetSdkVersion 19
versionCode 1
versionName "5.1.0"
// 方法数突破64k的限制
multiDexEnabled true
vectorDrawables.useSupportLibrary = true
}

//配置签名信息,签名钥匙
signingConfigs {
release {
keyAlias 'keyalias'
keyPassword 'keypassword'
storeFile file('E:/Lee/keystore/keystore')//签名钥匙的文件目录
storePassword 'storepassword'
}
}

buildTypes {
release {
minifyEnabled true//这个值决定了打包时是否要执行代码混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//这个是代码混淆文件
signingConfig signingConfigs.release//指定使用的是signingConfigs里面的release配置进行打包
zipAlignEnabled true//是否进行压缩
}
}

useLibrary 'org.apache.http.legacy'//如果要使用apache的网络请求,要配置这个lib
sourceSets { main { assets.srcDirs = ['src/main/assets', 'src/main/assets/'] } }

//配置打包渠道
productFlavors {
bd{}
"360"{} //渠道不能以数字开头,否则会报错,所以加一个引号,可以打包,并且渠道名是360
yyb{}
}

productFlavors.all {
flavor -> flavor.manifestPlaceholders = [CHANNEL_NAME: name]//manifest里面的meta-data定义的友盟渠道名
//这里会用上面productFlavors里面的渠道名替换CHANNEL_NAME

}
}
//第三方依赖包
dependencies {
compile fileTree(include: ['*.jar'], dir: 'src/main/libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.0.0'
compile 'com.android.support:design:24.0.0'
compile 'com.jaredrummler:android-processes:1.0.3'
compile 'com.android.support:recyclerview-v7:24.0.0'
compile files('src/main/libs/libammsdk.jar')
compile files('src/main/libs/android-async-http-1.4.5.jar')
compile files('src/main/libs/litepal-1.3.0.jar')
compile files('src/main/libs/Msc.jar')
compile files('src/main/libs/jpush-android-2.1.5.jar')
compile files('src/main/libs/umeng-analytics-v6.0.1.jar')
compile files('src/main/libs/glide-3.6.1.jar')
compile files('src/main/libs/zbar.jar')
compile files('src/main/libs/gson-2.2.4.jar')
}
二、manifest的配置
在manifest里面配置友盟的渠道名称,打包的时候,会根据Gradle的配置,进行逐一替换。也就是在生成bd渠道包的时候会用bd替换CHANNEL_NAME,从而达到多渠道打包。三、代码混淆很多时候android 的代码很容易被反编译,所以为了保护我们的程序不被盗用,我们对他进行代码混淆,已增加反编译难度,或者说是就算反编译出来,也很难看的懂。代码混淆文件如下图
#类  一些系统自带的类可以不用混淆
-keepclassmembers class fqcn.of.javascript.interface.for.webview {
   public *;
}
-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.Preferenc

#第三方类库,第三方类库的代码也要避免混淆,不然在运行时会出现找不到类的错误
-keep class cn.sharesdk.** {*;}
-keep class cn.sharesdk.sina.weibo** {*;}
-keep class com.sina.weibo.sdk.** {*;}
-keep class com.sina.sso.** {*;}
-keep class com.nostra13.universalimageloader.** {*;}
-keep class com.loopj.android.http {*;}
-keep class com.google.gson.**{*;}
-keep class org.apache.http.entity.mime.**{*;}
-keep class org.apache.http.entity.mime.content.**{*;}
-keep class cn.jpush.a.a**{ *;}
-keep class cn.jpush.android.**{ *;}
-keep class com.tencent.mm.sdk.** {*;}
-keep class com.tencent.mm.a.** {*;}
-keep class com.tencent.wxop.stat.** {*;}
-keep class com.tencent.a.a.a.a**{*;}
-keep class com.tencent.stat.**{*;}
-keep class com.tencent.connect.**{*;}
-keep class com.tencent.connect.auth.**{*;}
-keep class com.tencent.connect.avatar.**{*;}
-keep class com.tencent.connect.common.**{*;}
-keep class com.tencent.connect.dataprovider.**{*;}
-keep class com.tencent.connect.share.**{*;}
-keep class com.tencent.tauth.**{*;}

-keepclassmembers class * {   public <init>(org.json.JSONObject);}
-keep public class [com.android.google].R$*{public static final int *;}
-keepclassmembers enum * {    public static **[] values();    public static ** valueOf(java.lang.String);}

#自定义布局
-keep class com.google.android.view.datepicker.**{*;}
-keep class com.google.android.view.switchButton.**{*;}
-keep class com.google.android.view.**{*;}
-keep class com.google.android.widget.**{*;}

-dontwarn com.tencent.**
-dontwarn uk.co.senab.photoview.**
-dontwarn cn.jpush.**
-dontwarn com.google.**
-keep class com.google.protobuf.**{*;}

-keep class **.R$* {
*;
}
#工程中含有第三方jar包,因为build,所以不用再配置

#内部实体类
-keepattributes Exceptions,InnerClasses,...
-keep class com.google.android.ectService$AppInfo{ *;}
-keep class com.google.android.QuickService//一些在别的app要调用的类也不能混淆
,否则被混淆之后再按照之前定义好的路径和类名就找不到了
-keepclasseswithmembers class *{
   public *;
}

-keepclasseswithmembernames class * {  # 保持 native 方法不被混淆
    native <methods>;
}
四、所有这些配置完了就可以进行混淆打包了
只要在Terminal里面输入打包指令 gradlew assembleRelease,直接回车就自动开始打包了

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息