Android Studio多渠道批量打包及代码混淆

一、批量打包

1、集成了友盟统计,并在AndroidManifest.xml中添加了如下代码

        <meta-data
            android:name="UMENG_CHANNEL"
            android:value="${CHANNEL_VALUE}"/>

2、在app的build.gradle的android标签下添加如下代码:

 productFlavors {
        myapp {}
        _360 {}
        appchina {}
        hiapk {}
    }
    productFlavors.all {
        flavor -> flavor.manifestPlaceholders = [CHANNEL_VALUE: name]
    }

3、检查是否配置了gradle PATH环境变量,命令行下执行gradle -v,如果不能识别则到AndroidStudio的安装目录下找到gradle目录,把其下的bin目录添加到Path中,然后执行如下命令:

gradle assembleRelease

坐等编译打包成功,不知道是不是我第一次用的原因,执行完这个命令后一直在download什么东西,过了大概四五分钟,开始打包不同渠道的apk了,最终如下图所示:

以上这是通过命令行打包,当然也可以直接通过UI方式,选择菜单Build–>Generate Signed APK–>选择创建好的密钥keystore(没有就创建一个),然后点击Next就会弹出如下图所示的对话框:

这里也可以选择渠道或者build type,Flavors最少选择一个,点击Finish同样可以多渠道打包。

感慨一下:以前使用Eclipse多渠道打包的时候感觉好麻烦,现在AS的多渠道打包感觉好方便快捷。

二、代码混淆

1、把build.gradle中的buildTypes下的 minifyEnable置为true

shrinkResources false

上面这行代码是为了溢出未使用的不必要的资源文件以便减少最后安装包的体积大小,在release模式下开启为true,debug下不需要设置true,不然为报Warnings

2、编辑app目录下的proguard-rules.pro文件如下:

# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in E:\AndroiSdK/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

#----------------通用混淆Start---------------------
-optimizationpasses 5          # 指定代码的压缩级别
-dontusemixedcaseclassnames   # 是否使用大小写混合
-dontpreverify           # 混淆时是否做预校验
-verbose                # 混淆时是否记录日志
-ignorewarnings       # 忽略警告

-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    # 保持哪些类不被混淆

-keepclasseswithmembernames class * {  # 保持 native 方法不被混淆
    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);
}
-keepclassmembers enum * {     # 保持枚举 enum 类不被混淆
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆
    public static final android.os.Parcelable$Creator *;
}
#----------------通用混淆End---------------------

#----------------友盟5.0混淆Start---------------------
-dontshrink
-dontoptimize
-dontwarn com.google.android.maps.**
-dontwarn android.webkit.WebView
-dontwarn com.umeng.**
-dontwarn com.tencent.weibo.sdk.**
-dontwarn com.facebook.**

-keep enum com.facebook.**
-keepattributes Exceptions,InnerClasses,Signature
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable

-keep public interface com.facebook.**
-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.facebook.**
-keep class com.facebook.** { *; }
-keep class com.umeng.scrshot.**
-keep public class com.tencent.** {*;}
-keep class com.umeng.socialize.sensor.**
-keep class com.umeng.socialize.handler.**
-keep class com.umeng.socialize.handler.*
-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{*;}

-dontwarn twitter4j.**
-keep class twitter4j.** { *; }

-keep class com.tencent.** {*;}
-dontwarn com.tencent.**
-keep public class com.umeng.soexample.R$*{
    public static final int *;
}
-keep public class com.umeng.soexample.R$*{
    public static final int *;
}
-keep class com.tencent.open.TDialog$*
-keep class com.tencent.open.TDialog$* {*;}
-keep class com.tencent.open.PKDialog
-keep class com.tencent.open.PKDialog {*;}
-keep class com.tencent.open.PKDialog$*
-keep class com.tencent.open.PKDialog$* {*;}

-keep class com.sina.** {*;}
-dontwarn com.sina.**
-keep class  com.alipay.share.sdk.** {
   *;
}
-keepnames class * implements android.os.Parcelable {
    public static final ** CREATOR;
}
-keep class com.linkedin.** { *; }
-keepattributes Signature
#----------------友盟5.0混淆End---------------------

#----------------高德地图混淆Start---------------------
-dontwarn com.amap.api.mapcore2d.**
#定位
-keep class com.amap.api.location.**{*;}
-keep class com.amap.api.fence.**{*;}
-keep class com.autonavi.aps.amapapi.model.**{*;}

#搜索
-keep   class com.amap.api.services.**{*;}

#2D地图
-keep class com.amap.api.maps2d.**{*;}
-keep class com.amap.api.mapcore2d.**{*;}
#----------------高德地图混淆End---------------------

#----------------极光推送混淆Start---------------------
-dontoptimize
-dontpreverify

-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }
#gson
-dontwarn com.google.**
-keep class com.google.gson.** {*;}

#protobuf
-dontwarn com.google.**
-keep class com.google.protobuf.** {*;}
#----------------极光推送混淆End---------------------

#----------------Mob短信验证混淆Start---------------------
-keep class android.net.http.SslError
-keep class android.webkit.**{*;}
-keep class cn.sharesdk.**{*;}
-keep class cn.smssdk.**{*;}
-keep class com.mob.**{*;}
#----------------Mob短信验证混淆End---------------------

代码虽然多,但也很容易明白,首先通用混淆一定要有(参考Android Studio实现代码混淆),其他的就根据项目里添加了哪些第三方库就到第三方开发者平台下找到他们提供的混淆内容即可

a.如果混淆打包成功后,应用跑起来报了如下图的错误:

那肯定是因为没有添加Mob短信验证的混淆代码,因为在他们官方的集成文档里没提到,不过去论坛里倒是找到了解答,就如上面代码最后一段。

b.如果数据的封装用到了Gson,那么也要添加混淆,包括项目中所有的javaBean,也就是实体类,混淆代码如下(可参考官方Github说明):

##---------------Begin: proguard configuration for Gson  ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
#-keep class com.google.gson.examples.android.model.** { *; }
##---------------End: proguard configuration for Gson  ----------

-keep class com.xxx.xxxxxxxxx.bean.** { *; }    # 保持项目中的实体类不被混淆

c.如果你的项目中集成了MPAndroidChart图表,那么也得加上混淆,参考这里,代码如下:

-keep class com.github.mikephil.charting.** { *; }     # 确保MPAndroidChart加载动画可用

d.如果你的项目中使用了Webview并且自定义了Javainterface有js交互的,那么需要添加如下混淆代码:

#----------------JS混淆Start---------------------
-keepclassmembers class com.xxxxx.xxx.xxxActivity$MyJavaScriptInterface {
   public *;
}
-keepattributes *Annotation*
-keepattributes *JavascriptInterface*
#----------------JS混淆End---------------------

e.如果在生成apk失败,报了很多警告,那么可以添加这行代码忽略警告

-ignorewarnings # 忽略警告

等待生成apk成功后,看看是否异常,如果运行到某一步崩溃了,那么再根据具体的崩溃信息去添加相应的混淆规则即可,加了这句也是为了方便调试。

3、执行打包即可

4、对打包所得apk用dex2jar以及jdgui反编译后,查看java源码,发现确实有很多文件被混淆了。

说到底,批量打包和代码混淆在Eclipse和Android Studio两个IDE下都是差不多的。之前还写过两篇关于这方面的博客,Android代码混淆的使用Ant批量打包工具的使用,现在再看以前写的,还是有点用的。

时间: 2024-10-12 02:34:47

Android Studio多渠道批量打包及代码混淆的相关文章

Android多渠道批量打包

如若感觉排版不舒服,请移步Android多渠道批量打包 1.为什么要进行多渠道打包? 安卓应用商店(一个商店也叫做一个渠道,如豌豆荚,360手机助手,应用宝)众多,大大小小几百个,每当我们发新版本时,需要将Android客户端分发到各个应用市场,为了统计这些市场的效果(下载量.活跃数等),需要有一种方法来唯一标识它们,所以才有了多渠道打包. 2.如何统计各个渠道的下载量.活跃数? 现在有比较成熟的第三方应用帮我们实现统计功能(比如友盟),统计的本质就是收集用户信息传输到后台,后台生成报表,帮助我

Android studio 使用心得(四)—android studio 多渠道打包(二)

Android studio 使用心得(四)—android studio 多渠道打包 这篇文章讲了一种打包方式.是直接在android studio 里面可视化操作,结合配置文件.我个人觉得严格上来讲是不完全正确的操作,因为配置文件里面的签名文件根本没有用到.但是,打出来的包绝对没问题的.这篇主要是介绍直接在dos命令里面使用gradle命令打包.两行命令,简单gradle clean ,gradle build. 1,配置文件还是和之前的一样,我才贴一次代码 ? 1 2 3 4 5 6 7

Android studio 使用心得(十)---android studio 多渠道打包(三)

关于使用android studio 如何打包  大家可以看这两篇文章 Android studio 使用心得(四)---android studio 多渠道打包 Android studio 使用心得(四)---android studio 多渠道打包(二) 真正的项目开发,当然是建议 Android studio 使用心得(四)---android studio 多渠道打包(二) 其实,android studio 对上面这种打包方式还有更简单的方法,就是使用as 里面自带的Terminal

cocos2dx Android 使用ant 批量打包

参考文章: 例子:http://www.2cto.com/kf/201305/208139.html http://blog.csdn.net/ljb_blog/article/details/12709983 eclipse 如何支持ant:http://www.cnblogs.com/sw926/p/3238512.html 环境介绍: 引擎:cocos2dx2.2.2 开发平台:mac jdk 1.7 注:参考了以上文章,最后发现打包也不用自己下ant,也不用命令行, 而是设置 <proj

Android Studio配置SVN 以及使用代码管理

一.Android Studio配置SVN Android Studio关联配置SVN很简单,在Settings里面,找到Version Control->Subversion:在这个页面的控制面板中的General中将Use command line client打勾勾选上,然后浏览本地的SVN安装目录,选到"\svn.exe"即可: 在Use command line client下面还有一个Use system default Subversion configuratio

Android几种常见的多渠道(批量)打包方式介绍

多渠道打包,主要是为了统计不同的渠道上包的下载数量,渠道越多,我们需要打的包数量越多,这个时候,我们没法去使用单纯的手动打包去一个一个的生成不同的渠道包,我们需要更高效的打包方式. 声明渠道方式一: 通常我们区分渠道都是在我们manifest 文件的 application 用这样来定义渠道信息: <meta-data android:name="UMENG_CHANNEL" android:value="360"/> 然后在我们的Java 代码中,我们

android studio 多渠道打包

第一就是配置:在项目的build.gradle里面配置  先上图,再上代码. 第二步,就是打包.(网上有介绍用命令打包,可是我这人太懒,发现了个小窍门,直接在android studio 里面进行.)上图(另外,后面我还是补上了gradle命令打包的介绍.大家可以看看http://my.oschina.net/aibenben/blog/370985) 如果没有keystore,先创建一个,默认为.jks文件,一样的. 大家这里创建完后,可以再回头看看前面配置的build.gradle里面sig

[Android Studio] Android studio 多渠道打包(超简洁版)

转载:http://xuyazhou.com/archives/461 http://relex.me/using-manifestplaceholders/ 最近一直用android studio 进行开发,在开发和发版的时候,遇到一个多渠道打包的问题,由于公司里是有七个渠道的包进行分发,由于每次去AndroidManifest.xml修改渠道的值,甚是麻烦... 最后去google了一番,发现有些方法,是在gradle文件里切换各种不同的AndroidManifest.xml文件,感觉这样也

Android 使用Gradle加Android Studio 多渠道打包

转载请注明出处: http://blog.csdn.net/jjwwmlp456/article/details/45057067  ----------------- 匆忙拥挤repeat Gradle,这个东西好复杂,不过在Android中,我们知道它大概怎么用,它的依据何来,就够了. Gradle的DSL,领域特定语言(domain-specific languages,简称DSL),地址:http://gradle.org/docs/2.3/dsl/ Gradle的用户指南,地址:htt