一、批量打包
1、整合了友盟統計,並在AndroidManifest.xml中添加了如下代碼
<meta-dataandroid: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源碼,發現確實有很多檔案被混淆了。
以上所述是小編給大家介紹的Android Studio多渠道批量打包及代碼混淆,希望對大家有所協助,如果大家有任何疑問請給我留言,小編會及時回複大家的。在此也非常感謝大家對雲棲社區網站的支援!