以前用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,直接回车就自动开始打包了