1. 程式人生 > >AndroidStudio中程式碼混淆以及打包操作

AndroidStudio中程式碼混淆以及打包操作

摸索了兩天,大概瞭解了在AndroidStudio中程式碼混淆和打包釋出的過程,在此記錄下。

程式碼混淆:

關於程式碼混淆的作用,就不多解釋了,整個過程大致如下:

  • 在app下的build.gradle檔案中新增如下程式碼(minifyEnabled 表示是否混淆,預設是false,這裡要記得設定成true):
    這裡寫圖片描述
    其中proguard-android.txt檔案是本地sdk/tools/proguard資料夾下的預設檔案;prguard-rules.pro檔案就是用來編寫混淆程式碼的;

  • 接下來就是在prguard-rules.pro檔案中編寫混淆程式碼:

    關於其中程式碼的理解,可以參考這篇文章:

    程式碼混淆詳解

編寫完混淆程式碼,混淆也就算完成了,接下來就是打包了,但是,混淆的時候可能會遇到各種問題,主要是混淆程式碼,因為涉及到有的類不需要混淆,混淆了就會報錯執行不了,所以在編寫混淆程式碼的時候一定要小心,其實一般注意這幾點就好了:

  • 不需要匯入第三方類庫的程式碼,如上圖註釋的部分:-libraryjars libs/BaiduLBS_Android.jar等,按照網上說的,需要在混淆檔案中匯入第三方類庫,防止混淆時讀取包內容出錯,但是如果那樣做的話,會報如下錯誤:
    這裡寫圖片描述
    是的,他說這個包被指定了兩次

    原因是,在build.gradle檔案中已經指定了第三方類庫,這裡再次指定,就會重複,所以,在此應該不需要導第三方包的程式碼

  • 過濾掉第三方包,也就是不需要混淆第三方包,比如常見的 android-support-v4.jar:

-ignorewarnings
-dontwarn android.support.v4.**    
-keep class android.support.v4.** { *; }  
-keep interface android.support.v4.app.** { *; }  
-keep public class * extends android.support.v4.**  
-keep public class * extends android.app.Fragment

下面是一個專案中我過濾掉的第三方包:

-keep class org.apache.**{*;}//過濾commons-httpclient-3.1.jar
-keep class com.fasterxml.jackson.**{*;}//過濾jackson-core-2.1.4.jar等
-keep class com.lidroid.xutils.**{*;}//過濾xUtils-2.6.14.jar
--keep class com.baidu.** {*;}//過濾BaiduLBS_Android.jar

通常關於第三方包的混淆程式碼,一般在其github主頁上或者simple中會有提示,比如 xUtils的混淆就建議不要混淆Annotation,即:`-keep class * extends java.lang.annotation.Annotation{*;}
還有百度地圖,在其官方文件中有說明,需要如下混淆程式碼:

-dontwarn com.baidu.**
-keep class com.baidu.**{*;}  
-keep class vi.com.**{*;} 
  • 接下來需要注意的就是一些固定格式的程式碼了,比如常見的Activity等不要混淆,Bean不要混淆等,看程式碼:
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Fragment 
-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

這裡的內容大致就是對一些Android元件保持原樣,不進行混淆

總結一下混淆

prguard-rules.pro檔案中寫的,其實就是混淆規則,規定哪些東西不需要混淆。自己編寫的程式碼中大致就是一些重要的類需要混淆,而混淆的本質就是精簡類名,用簡單的a,b,c等單詞來代替之前寫的如DataUtil等易懂的類名

所以,理解了這點,也就好理解這個混淆檔案該怎麼寫了,大致思路就是:不混淆第三方庫,不混淆系統元件,一般也可以不混淆Bean等模型類,因為這些對別人都是沒用的,畢竟都是開源的。。。

下面是整個混淆檔案的程式碼:

# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:\Users\sdt1\AppData\Local\Android\sdk/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 *;
#}

#-----------------混淆配置設定------------------------------------------------------------------------
-optimizationpasses 5                                                       #指定程式碼壓縮級別
-dontusemixedcaseclassnames                                                 #混淆時不會產生形形色色的類名
-dontskipnonpubliclibraryclasses                                            #指定不忽略非公共類庫
-dontpreverify                                                              #不預校驗,如果需要預校驗,是-dontoptimize
-ignorewarnings                                                             #遮蔽警告
-verbose                                                                    #混淆時記錄日誌
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*    #優化

#-----------------匯入第三方包,但是在當前版本中使用會報 input jar file is specified twice 錯誤,所以註釋掉
#-libraryjars libs/android.support.v4.jar
#-libraryjars libs/BaiduLBS_Android.jar
#-libraryjars libs/commons-httpclient-3.1.jar
#-libraryjars libs/jackson-annotations-2.1.4.jar
#-libraryjars libs/jackson-core-2.1.4.jar
#-libraryjars libs/jackson-databind-2.1.4.jar
#-libraryjars libs/xUtils-2.6.14.jar

#-----------------不需要混淆第三方類庫------------------------------------------------------------------
-dontwarn android.support.v4.**                                             #去掉警告
-keep class android.support.v4.** { *; }                                    #過濾android.support.v4
-keep interface android.support.v4.app.** { *; }
-keep public class * extends android.support.v4.**
-keep public class * extends android.app.Fragment

-keep class org.apache.**{*;}                                               #過濾commons-httpclient-3.1.jar

-keep class com.fasterxml.jackson.**{*;}                                    #過濾jackson-core-2.1.4.jar等

-dontwarn com.lidroid.xutils.**                                             #去掉警告
-keep class com.lidroid.xutils.**{*;}                                       #過濾xUtils-2.6.14.jar
-keep class * extends java.lang.annotation.Annotation{*;}                   #這是xUtils文件中提到的過濾掉註解

-dontwarn com.baidu.**                                                      #去掉警告
-dontwarn com.baidu.mapapi.**
-keep class com.baidu.** {*;}                                               #過濾BaiduLBS_Android.jar
-keep class vi.com.gdi.bgl.android.**{*;}
-keep class com.baidu.platform.**{*;}
-keep class com.baidu.location.**{*;}
-keep class com.baidu.vi.**{*;}

#-----------------不需要混淆系統元件等-------------------------------------------------------------------
-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.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService

-keep class com.classtc.test.entity.**{*;}                                   #過濾掉自己編寫的實體類


#----------------保護指定的類和類的成員,但條件是所有指定的類和類成員是要存在------------------------------------
-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

打包釋出

混淆程式碼編寫完成,就是打包釋出了,打包的時候需要注意,如果混淆程式碼編寫有疏漏,編譯打包可能會出錯,如上面的那個報錯一樣,就是在混淆的時候重複指定了第三方包,導致編譯打包出錯。
下面是打包的具體過程:

  • 如圖,在AndroidStudio中找到Build–>Generate Signed APK…
    這裡寫圖片描述

  • 在出現的視窗中選擇Create new (如果之前建立過,可以直接選擇,然後在下面輸入密碼即可):
    這裡寫圖片描述

  • 接下來編寫金鑰資訊視窗:
    這裡寫圖片描述

  • 填寫完金鑰資訊後回到之前的窗戶,點選Next,然後點選Finish就完成了,然後等待編譯完成,在資料夾下會多一個app-release.apk檔案,這個就是正式版的安裝包

到此,打包完成,當然,如果需要釋出到各大軟體市場,可能還需要渠道打包,這個就等以後做過了再回來總結

相關推薦

AndroidStudio程式碼混淆以及打包操作

摸索了兩天,大概瞭解了在AndroidStudio中程式碼混淆和打包釋出的過程,在此記錄下。 程式碼混淆: 關於程式碼混淆的作用,就不多解釋了,整個過程大致如下: 在app下的build.gradle檔案中新增如下程式碼(minifyEnabled

Android Stuido程式碼混淆以及打包

當代碼書寫完成之後,我們需要將程式碼打包,傳送到各個app市場,在這之前,我們通常需要將程式碼進行程式碼混淆,此文章將介紹程式碼混淆,並且給大家提供一個比較完成的混淆文件,可以直接拿來即用。 程式碼混淆部分 1.修改app/ build.gr

VS2010專案打包釋出和程式碼混淆的一起操作

1 把專案的生成路徑改成Release(通過專案的屬性-生成來修改) 2 把整個Release資料夾拷到另外一個地方,然後用防止反編譯軟體來生成新的exe,再覆蓋掉 3 在打包專案裡面把覆蓋完後的Release資料夾裡面內容新增進來,生成快捷方式以及解除安裝在此不詳細說明

檔案在系統的傳輸以及打包壓縮

檔案在系統中的傳輸 1.scp scp  file  [email protected]:/dir ##上傳 scp  [email protected]:/file  dir ##下載 2.rsync      ##遠端同步,速度快,預設會忽略,檔案屬性,連結檔案 #

關於《在AndroidStudio,使用Gradle打包aar到JCenter倉庫!完整版教程!填補各種坑》更新驗證

七.在JCenterLib這個Module中新建一個檔案,名為bintray.gradle 內容為: [javascript] view plain copy apply plugin: 'com.github.dcendents.android-mave

AndroidStudio,使用Gradle打包aar到JCenter倉庫!完整版教程!填補各種坑

環境 AndroidStudio 1.2.1.1正式版 本教程以我的一個測試倉庫作為DEMO,名為JCenterDemo。本教程只涉及如何打包aar至JCenter倉庫,如何使用git不在本教程涉及之內,所以本文只是單單在Github建立了一個同名倉庫而已,不過可以推薦一個

Android 微信支付 程式碼混淆打包,導致不能支付的原因

程式碼混淆: -libraryjars libs/libammsdk.jar -keep class com.tencent.** { *;} 如果您的專案中也引用了dom4j.jar,那麼就新增上下

Subversion(SVN)在AndroidStudio的使用以及忽略檔案的處理

1.Subversion(SVN)在AndroidStudio中的使用 (1)在AndroidStudio中開啟Settings,並在左側選單欄中選擇Version Control,然後將右側的VCS選項選為Subversion。點選Apply和OK。

AndroidStudio程式碼模板的使用

在使用AndroidStudio進行程式碼編寫的過程中,隨著使用時間的增加和各種外掛的使用,我們發現了很多快捷快速敲程式碼的方式。如: "somethind".log 可以直接打印出Log日誌的內容 Log.d("MainActivity", "som

【重構】AndroidStudio程式碼重構選單Refactor功能詳解

       程式碼重構幾乎是每個程式設計師在軟體開發中必須要不斷去做的事情,以此來不斷提高程式碼的質量。Android Stido(以下簡稱AS)以其強大的功能,成為當下Android開發工程師最受歡迎的開發工具,也是Android官方推薦使用的工具。如此優秀的工具,

AndroidStudio常用框架程式碼混淆配置

androidstdio中常用框架程式碼混淆配置: 1.OkHttp 版本: compile ‘com.squareup.okhttp3:okhttp:3.9.1’ 混淆配置: -dontwarn okhttp3.** -

利用POI操作不同版本號word文檔的圖片以及創建word文檔

exceptio paragraph 沒有 fileinput rest 輸出 throw com dsm 我們都知道要想利用java對office操作最經常使用的技術就應該是POI了,在這裏本人就不多說到底POI是什麽和怎麽用了。先說本人遇到的問題,不同於利用POI去

Python集合(set)的基本操作以及一些常見的用法

python set 集合 集合的一些常見用法 Python除了List、Tuple、Dict等常用數據類型外,還有一種數據類型叫做集合(set),集合的最大特點是:集合裏邊的元素是不可重復的並且集合內的元素還是無序的,所以一般情況下集合常用的兩個場景是:1.去重(如:列表去重);2.關

JS基礎--函數與BOM、DOM操作、JS的事件以及內置對象

對話框 回車 == 問題 tde tle ets fixed 訪問 前 言 絮叨絮叨 這裏是JS基礎知識集中講解的第三篇,也是最後一篇,三篇JS的基礎,大多是知識的羅列,並沒有涉及更難得東西,幹貨滿滿!看完這一篇後,相信許多正在像我一樣正處於初

git混淆操作

over enc .net fetch 遠程 操作 rebase quest 融合 1, git fetch 和 git pull 參考鏈接: https://stackoverflow.com/questions/292357/what-is-the-difference

springboot有用的幾個有用aware以及bean操作和數據源操作

pub art exception private exce 數據源 static ini sco 本文參考了: https://blog.csdn.net/derrantcm/article/details/76652951 https://blog.csdn.net/d

Android 打包 + 程式碼混淆

一:打包生成一個 Apk            生成一個 Apk 是比較簡單的,直接使用 Android Stuido 的打包工具就可以快速的生成一個 Apk 檔案,在這裡多插一句題外話吧,嘿嘿,就是關於使用多渠道打包和一套程式碼打

面試常見的陣列的操作:遍歷,最值,反轉,氣泡排序,二分查詢(附程式碼)

陣列:儲存同一種資料型別的多個元素的容器;陣列中的索引從0開始,最大編號是陣列的長度-1(減1); 下面給大家列出陣列常見的幾種操作:     A 遍歷   /** * 遍歷 */ public static void printArray(int

Python對檔案流的操作,以及對json和pickle的理解

1.關於Python對檔案流的操作: 格式:open( 檔名,模式,encoding=‘utf8’,buffering=-1 ) encoding->編碼 buffering->快取,預設-1 本人也是初學者,在Python官網上看到的相關的文件,說的不好還請諒解,指出。

vuenpm run build打包編譯的一系列操作

從package.json 中可以看出,npm run build,其實是執行了 node build/build.js,我們在build資料夾中找到build.js,build主要的工作是:檢測node和npm版本,刪除dist包,webpack構建打包,在終端輸出構建資訊