一.相信有不少小伙伴還在為Apk上架應用市場而苦惱吧,現在就分享一下apk從代碼變為可上傳應用市場的安裝包的詳細流程,仔細閱讀,相信您會有收獲。
1.配置混淆文件(Android studio對應module下的 proguard-rules.pro文件):混淆文件主要分為三部分,一部分為固定的配置代碼,一部分為你不想要混淆的自定義Application類或者網絡請求基類,另一部分為你使用的所有第三方插件的混淆代碼。
----------------------------------------------------------------我是小坑分割線----------------------------------------------------------------------------
插播一則廣告,gson類也要防混淆,第三方實體類和自己的自定義控件類也要防混淆,切記~
----------------------------------------------------------------我是小坑分割線----------------------------------------------------------------------------
A.固定的配置代碼,同時要做禁LOG處理(即在你proguard-android.txt中一定不要加-dontoptimize才起作用):
# 代碼混淆壓縮比,在0~7之間,默認為5,一般不做修改
-optimizationpasses 5
# 混合時不使用大小寫混合,混合后的類名為小寫
-dontusemixedcaseclassnames
# 指定不去忽略非公共庫的類
-dontskipnonpubliclibraryclasses
# 這句話能夠使我們的項目混淆后產生映射文件
# 包含有類名->混淆后類名的映射關系
-verbose
# 指定不去忽略非公共庫的類成員
-dontskipnonpubliclibraryclassmembers
# 不做預校驗,preverify是proguard的四個步驟之一,Android不需要preverify,去掉這一步能夠加快混淆速度。
-dontpreverify
# 保留Annotation不混淆
-keepattributes *Annotation*,InnerClasses
# 避免混淆泛型
-keepattributes Signature
# 拋出異常時保留代碼行號
-keepattributes SourceFile,LineNumberTable
# 指定混淆是采用的算法,后面的參數是一個過濾器
# 這個過濾器是谷歌推薦的算法,一般不做更改
-optimizations !code/simplification/cast,!field/*,!class/merging/*
#############################################
#
# Android開發中一些需要保留的公共部分
#
#############################################
# 保留我們使用的四大組件,自定義的Application等等這些類不被混淆
# 因為這些子類都有可能被外部調用
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Appliction
-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 * extends android.view.View
-keep public class com.android.vending.licensing.ILicensingService
# 保留support下的所有類及其內部類
-keep class android.support.** {*;}
# 保留繼承的
-keep public class * extends android.support.v4.**
-keep public class * extends android.support.v7.**
-keep public class * extends android.support.annotation.**
# 保留R下面的資源
-keep class **.R$* {*;}
# 保留本地native方法不被混淆
-keepclasseswithmembernames class * {
native <methods>;
}
# 保留在Activity中的方法參數是view的方法,
# 這樣以來我們在layout中寫的onClick就不會被影響
-keepclassmembers class * extends android.app.Activity{
public void *(android.view.View);
}
# 保留枚舉類不被混淆
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
# 保留我們自定義控件(繼承自View)不被混淆
-keep public class * extends android.view.View{
*** get*();
void set*(***);
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
}
# 保留Parcelable序列化類不被混淆
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
# 保留Serializable序列化的類不被混淆
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient <fields>;
!private <fields>;
!private <methods>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
# 對于帶有回調函數的onXXEvent、**On*Listener的,不能被混淆
-keepclassmembers class * {
void *(**On*Event);
void *(**On*Listener);
}
# webView處理,項目中沒有使用到webView忽略即可
-keepclassmembers class fqcn.of.javascript.interface.for.webview {
public *;
}
-keepclassmembers class * extends android.webkit.webViewClient {
public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.webViewClient {
public void *(android.webkit.webView, jav.lang.String);
}
# 移除Log類打印各個等級日志的代碼,打正式包的時候可以做為禁log使用,這里可以作為禁止log打印的功能使用
# 記得proguard-android.txt中一定不要加-dontoptimize才起作用
# 另外的一種實現方案是通過BuildConfig.DEBUG的變量來控制
-assumenosideeffects class android.util.Log {
public static int v(...);
public static int i(...);
public static int w(...);
public static int d(...);
public static int e(...);
}
B.你不想混淆的實體類(注:doudou.soga.com.doudou為你的包名,bean為對應的文件夾名字,** { ; }代表該文件夾下的所有類):
#--------------------------2.實體類---------------------------------
-keep class doudou.soga.com.doudou.bean.* { ; } #實體類不參與混淆
-keep class doudou.soga.com.doudou.widget.* { ; } #自定義控件不參與混淆
-keep class doudou.soga.com.doudou.app.* { *; } #網絡請求和自定義Applicattion類不參與混淆
C.第三方控件混淆代碼(這些代碼都可以百度Copy到,為你使用的所有第三方插件的混淆代碼。我就隨便列一兩個):
#--------------------------3.第三方包-------------------------------
################gson##################
-keep class com.google.gson.** {*;}
#-keep class com.google.**{*;}
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
-keep class com.google.gson.examples.android.model.** { *; }
-keep class com.google.** {
<fields>;
<methods>;
}
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
-dontwarn com.google.gson.**
####################jpush##################
-keep class cn.jpush.** { *; }
-keep public class com.umeng.fb.ui.ThreadView { } #雙向反饋功能代碼不混淆
-dontwarn cn.jpush.**
-keepclassmembers class * {
public <init>(org.json.JSONObject);
}
-keep public class cn.jiguang.analytics.android.api.** {
*;
}
#不混淆R類
-keep public class com.jph.android.R$*{
public static final int *;
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
################ButterKnife###################
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
@butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
@butterknife.* <methods>;
}
2.接著,那么就要修改module下的build.gradle的minifyEnabled 為True
android{
buildTypes {
release {
minifyEnabled true //注意,在這里?。。。? proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
3.混淆文件配置好了,那么可以開始簽名打包了。若是多渠道打包,(我采用的是JPUSH),那么還要在清單文件AndroidManifest.xml最底層配置這一行代碼(meizu-market代表魅族應用市場,JPUSH統計代碼請參閱極光官方文檔):
<!-- JPUSH_CHANNEL 是為了方便開發者統計APK分發渠道。-->
<!-- 例如: -->
<!-- 發到 Google Play 的APK可以設置為 google-play; -->
<!-- 發到其他市場的 APK 可以設置為 xxx-market。 -->
<!-- 渠道統計報表位于控制臺頁面的 “統計”-“用戶統計”-“渠道分布” 中-->
<meta-data android:name="JPUSH_CHANNEL" android:value="meizu-market"/>
4.正式開始打包,首先Android Studio --Build -- Generate Signed APK ,然后配置你的簽名信息,下一步直接打包就行拉。附贈一張截圖
注釋:
Key store path:簽名文件配置的路徑+名字
Password:密碼(每次簽名都要輸入的,后面也可以記住密碼)
Confirm:確認密碼
Alias:別名
Validity:簽名有效時間
Certificate:證書
First and Last Name:開發者名字
Organizational Unit:組織單位
Organization:組織
City or Locality:城市或地區
State or Province:州或省
Country Code(xx):中國可填86
5.打包完成以后,在項目路徑下會生成一個.apk文件(注:DouDou為項目名,app為module名),然后可以直接下載360加固寶加固(注:加固完成以后需要重新簽名一次才能安裝!?。。。。?,360加固寶有自帶的簽名工具可以一鍵加固簽名
6.加固完成的.apk文件體積會略有增大,就能直接上傳應用市場了。隨手分享,喜歡的朋友可以關注微信公眾號MiHomes,后續會有更多更好的博客推送給您。
另:歡迎指出不足,會進行更正
末尾:移動互聯&人力資源交流群,可加微信zy666128入群交流。