Android Studio多渠道批量打包及代碼混淆
一、批量打包
1、集成了友盟統(tǒng)計(jì),并在AndroidManifest.xml中添加了如下代碼
<meta-data
android:name="UMENG_CHANNEL"
android:value="${CHANNEL_VALUE}"/>
2、在app的build.gradle的android標(biāo)簽下添加如下代碼:
productFlavors {
myapp {}
_360 {}
appchina {}
hiapk {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [CHANNEL_VALUE: name]
}
3、檢查是否配置了gradle PATH環(huán)境變量,命令行下執(zhí)行g(shù)radle -v,如果不能識(shí)別則到AndroidStudio的安裝目錄下找到gradle目錄,把其下的bin目錄添加到Path中,然后執(zhí)行如下命令:
gradle assembleRelease
坐等編譯打包成功,不知道是不是我第一次用的原因,執(zhí)行完這個(gè)命令后一直在download什么東西,過了大概四五分鐘,開始打包不同渠道的apk了,最終如下圖所示:


以上這是通過命令行打包,當(dāng)然也可以直接通過UI方式,選擇菜單Build–>Generate Signed APK–>選擇創(chuàng)建好的密鑰keystore(沒有就創(chuàng)建一個(gè)),然后點(diǎn)擊Next就會(huì)彈出如下圖所示的對(duì)話框:
這里也可以選擇渠道或者build type,F(xiàn)lavors最少選擇一個(gè),點(diǎn)擊Finish同樣可以多渠道打包。
感慨一下:以前使用Eclipse多渠道打包的時(shí)候感覺好麻煩,現(xiàn)在AS的多渠道打包感覺好方便快捷。
二、代碼混淆
1、把build.gradle中的buildTypes下的 minifyEnable置為true
shrinkResources false
上面這行代碼是為了溢出未使用的不必要的資源文件以便減少最后安裝包的體積大小,在release模式下開啟為true,debug下不需要設(shè)置true,不然為報(bào)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 # 指定代碼的壓縮級(jí)別
-dontusemixedcaseclassnames # 是否使用大小寫混合
-dontpreverify # 混淆時(shí)是否做預(yù)校驗(yàn)
-verbose # 混淆時(shí)是否記錄日志
-ignorewarnings # 忽略警告
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆時(shí)所采用的算法
-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短信驗(yàn)證混淆Start---------------------
-keep class android.net.http.SslError
-keep class android.webkit.**{*;}
-keep class cn.sharesdk.**{*;}
-keep class cn.smssdk.**{*;}
-keep class com.mob.**{*;}
#----------------Mob短信驗(yàn)證混淆End---------------------
代碼雖然多,但也很容易明白,首先通用混淆一定要有(參考Android Studio實(shí)現(xiàn)代碼混淆),其他的就根據(jù)項(xiàng)目里添加了哪些第三方庫就到第三方開發(fā)者平臺(tái)下找到他們提供的混淆內(nèi)容即可
a.如果混淆打包成功后,應(yīng)用跑起來報(bào)了如下圖的錯(cuò)誤:
那肯定是因?yàn)闆]有添加Mob短信驗(yàn)證的混淆代碼,因?yàn)樵谒麄児俜降募晌臋n里沒提到,不過去論壇里倒是找到了解答,就如上面代碼最后一段。
b.如果數(shù)據(jù)的封裝用到了Gson,那么也要添加混淆,包括項(xiàng)目中所有的javaBean,也就是實(shí)體類,混淆代碼如下(可參考官方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.** { *; } # 保持項(xiàng)目中的實(shí)體類不被混淆
c.如果你的項(xiàng)目中集成了MPAndroidChart圖表,那么也得加上混淆,參考這里,代碼如下:
-keep class com.github.mikephil.charting.** { *; } # 確保MPAndroidChart加載動(dòng)畫可用
d.如果你的項(xiàng)目中使用了Webview并且自定義了Javainterface有js交互的,那么需要添加如下混淆代碼:
#----------------JS混淆Start---------------------
-keepclassmembers class com.xxxxx.xxx.xxxActivity$MyJavaScriptInterface {
public *;
}
-keepattributes *Annotation*
-keepattributes *JavascriptInterface*
#----------------JS混淆End---------------------
e.如果在生成apk失敗,報(bào)了很多警告,那么可以添加這行代碼忽略警告
-ignorewarnings # 忽略警告
等待生成apk成功后,看看是否異常,如果運(yùn)行到某一步崩潰了,那么再根據(jù)具體的崩潰信息去添加相應(yīng)的混淆規(guī)則即可,加了這句也是為了方便調(diào)試。
3、執(zhí)行打包即可
4、對(duì)打包所得apk用dex2jar以及jdgui反編譯后,查看java源碼,發(fā)現(xiàn)確實(shí)有很多文件被混淆了。
以上所述是小編給大家介紹的Android Studio多渠道批量打包及代碼混淆,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Android中關(guān)于遞歸和二分法的算法實(shí)例代碼
這篇文章主要介紹了Android中關(guān)于遞歸和二分法的算法實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-10-10
Android Studio真機(jī)無線連接USB設(shè)備調(diào)試運(yùn)行詳解流程
你在Android Studio寫app時(shí)是否也有想過如果可以不用數(shù)據(jù)線連接手機(jī)調(diào)試運(yùn)行就好了?如果需要取出數(shù)據(jù)線插接的話我肯定是嫌麻煩的,但是模擬器有時(shí)候需要測試一些需要硬件支持的功能時(shí)又不管用,所以最好的測試還是在真機(jī)上,本篇教你扔掉數(shù)據(jù)線來無線調(diào)試2021-11-11
Android熱更新開源項(xiàng)目Tinker集成實(shí)踐總結(jié)
最近項(xiàng)目集成了Tinker,開始認(rèn)為集成會(huì)比較簡單,但是在實(shí)際操作的過程中還是遇到了一些問題,本文就會(huì)介紹在集成過程大家基本會(huì)遇到的主要問題。下面跟著小編一起來看下吧2017-01-01
Jetpack?Compose?DropdownMenu手指跟隨點(diǎn)擊顯示
這篇文章主要為大家介紹了Jetpack?Compose?DropdownMenu手指跟隨點(diǎn)擊位置顯示實(shí)現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Android 數(shù)據(jù)庫打包隨APK發(fā)布的實(shí)例代碼
有些時(shí)候我們的軟件用到SQLite數(shù)據(jù)庫,這個(gè)時(shí)候怎么把一個(gè)做好的數(shù)據(jù)庫打包進(jìn)我們的APK呢2013-10-10
Android 開發(fā)系統(tǒng)自帶語音模塊應(yīng)用
本篇文章 主要介紹 Android 開發(fā)自帶語音模塊實(shí)例,在開發(fā)Android系統(tǒng)中會(huì)用到系統(tǒng)語音搜索模塊,這里給大家一個(gè)參考實(shí)例2016-07-07
Android Studio 報(bào)錯(cuò)failed to create jvm error code -4的解決方法
這篇文章主要介紹了Android Studio 在安裝后啟動(dòng)報(bào)錯(cuò)failed to create jvm error code -4的解決方法,需要的朋友可以參考下2014-05-05
Android 開發(fā)之Dialog,Toast,Snackbar提醒
這篇文章主要介紹了Android 開發(fā)之Dialog,Toast,Snackbar提醒的相關(guān)資料,需要的朋友可以參考下2017-03-03
Android編程實(shí)現(xiàn)屏幕禁止休眠的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)屏幕禁止休眠的方法,分析了Android的Manifest.xml設(shè)置與代碼實(shí)現(xiàn)兩種操作技巧,需要的朋友可以參考下2016-10-10

