AndroidStudio 多渠道批量打包及代码混淆
⼀、批量打包
1、集成了友盟统计,并在l中添加了如下代码
2、在app的adle的android标签下添加如下代码:
3、检查是否配置了gradle PATH环境变量,命令⾏下执⾏gradle -v,如果不能识别则到AndroidStudio的安装⽬录下到gradle⽬录,把其下的bin⽬录添加到Path中,然后执⾏如下命令:
坐等编译打包成功,不知道是不是我第⼀次⽤的原因,执⾏完这个命令后⼀直在download什么东西,过了⼤概四五分钟,开始打包不同渠
道的apk了,最终如下图所⽰:
<meta-data
android:name="UMENG_CHANNEL"
android:value="${CHANNEL_VALUE}"/>
productFlavors {
myapp {}
_360 {}
appchina {}
hiapk {}
}
productFlavors .all {
flavor -> flavor .manifestPlaceholders = [CHANNEL_VALUE: name] }
gradle assembleRelease
以上这是通过命令⾏打包,当然也可以直接通过UI⽅式,选择菜单Build–>Generate Signed APK–>选择创建好的密钥keystore(没有就
创建⼀个),然后点击Next就会弹出如下图所⽰的对话框:
这⾥也可以选择渠道或者build type,Flavors最少选择⼀个,点击Finish同样可以多渠道打包。
感慨⼀下:以前使⽤Eclipse多渠道打包的时候感觉好⿇烦,现在AS的多渠道打包感觉好⽅便快捷。
⼆、代码混淆
1、把adle中的buildTypes下的 minifyEnable置为true
上⾯这⾏代码是为了溢出未使⽤的不必要的资源⽂件以便减少最后安装包的体积⼤⼩,在release模式
下开启为true,debug下不需要设置true,不然为报Warnings 2、编辑app⽬录下的proguard-rules.pro⽂件如下:
shrinkResources false
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in E:\AndroiSdK/tools/
# You can edit the include path and order by changing the proguardFiles
# directive adle.
#
# For more details, see
# developer.android/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 * t.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>(t.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {# 保持⾃定义控件类不被混淆
public <init>(t.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
-
le.android.maps.**
-dontwarn android.webkit.WebView
-dontwarn com.umeng.**
-t.weibo.sdk.**
-dontwarn com.facebook.**
-keep enum com.facebook.**
-keepattributes Exceptions,InnerClasses,Signatureeclipse android
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable
-keep public interface com.facebook.**
-keep public t.**
-
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 t.** {*;}
-keep class com.umeng.socialize.sensor.**
-
keep class com.umeng.socialize.handler.**
-keep class com.umeng.socialize.handler.*
-keep t.delmsg.WXMediaMessage {*;}
-keep t.delmsg.** t.delmsg.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 t.** {*;}
-t.**
-keep public class com.umeng.soexample.R$*{
public static final int *;
}
-keep public class com.umeng.soexample.R$*{
public static final int *;
}
-keep t.open.TDialog$*
-keep t.open.TDialog$* {*;}
-keep t.open.PKDialog
-keep t.open.PKDialog {*;}
-keep t.open.PKDialog$*
-keep t.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.del.**{*;}
#搜索
-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
-le.**
-keep le.gson.** {*;}
#protobuf
-le.**
-keep le.protobuf.** {*;}
#----------------极光推送混淆End---------------------
#----------------Mob短信验证混淆Start----------------------keep class android.http.SslError
-keep class android.webkit.**{*;}
代码虽然多,但也很容易明⽩,⾸先通⽤混淆⼀定要有(参考),其他的就根据项⽬⾥添加了哪些第三⽅库就到第三⽅开发者平台下到他们提供的混淆内容即可
a.如果混淆打包成功后,应⽤跑起来报了如下图的错误:
那肯定是因为没有添加Mob短信验证的混淆代码,因为在他们官⽅的集成⽂档⾥没提到,不过去论坛⾥倒是到了解答,就如上⾯代码最后⼀段。
b.如果数据的封装⽤到了Gson,那么也要添加混淆,包括项⽬中所有的javaBean,也就是实体类,混淆代码如下(可参考):
c.如果你的项⽬中集成了MPAndroidChart图表,那么也得加上混淆,参考,代码如下:
d.如果你的项⽬中使⽤了Webview并且⾃定义了Javainterface有js交互的,那么需要添加如下混淆代码:
e.如果在⽣成apk失败,报了很多警告,那么可以添加这⾏代码忽略警告
等待⽣成apk成功后,看看是否异常,如果运⾏到某⼀步崩溃了,那么再根据具体的崩溃信息去添加相应的混淆规则即可,加了这句也是为了⽅便调试。-keep class cn .smssdk .**{*;}
-keep class com .mob .**{*;}
#----------------Mob 短信验证混淆End---------------------
##---------------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 .** { *; } # 保持项⽬中的实体类不被混淆
-keep class com .github .mikephil .charting .** { *; } # 确保MPAndroidChart 加载动画可⽤
#----------------JS 混淆Start---------------------
-
keepclassmembers class com .xxxxx .xxx .xxxActivity $MyJavaScriptInterface {
public *;
}
-keepattributes *Annotation *
-keepattributes *JavascriptInterface *
#----------------JS 混淆End---------------------
-ignorewarnings # 忽略警告
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论