android studio如何生成混淆代码的jar
今天,簡單講講android里如何在生成jar包時,同時對jar包的代碼進行混淆,避免別人看到核心代碼。
之前,我對領導說我打包生成的SDK,別人使用android studio導入后可以看所有的源碼。結果領導說這樣不可以,核心代碼不能給別人看到。于是在網上搜索如何不讓別人看到jar包里的代碼,最終發現混淆核心代碼就可以做到,不過最后發現混淆還是存在問題,這里記錄一下。
?
網上的這些內容很多,但是很容易使人看不明白。這里記錄我自己如何混淆jar包的過程。
1:首先修改指定模塊的build.gradle文件,在末尾加上下述代碼(網上的代碼)
task makeJar(type: proguard.gradle.ProGuardTask, dependsOn: "build") {//刪除之前編譯混淆jar包delete'build/outputs/jar/SystemInfo.jar'// 未混淆的jarinjars 'build/intermediates/bundles/release/classes.jar'// 混淆后的jar路徑outjars 'build/outputs/jar/SystemInfo.jar'// 混淆文件configuration 'proguard-rules.pro' }說明:AS會自動對模塊進行打包,即build/intermediates/bundles/release/classes.jar,只是未進行混淆工作而已;
簡單講講,這個其實是手動配置了使用proguard-rules.pro對生成的jar進行混淆,我自己這樣嘗試過,發現這樣編譯報錯,于是自己使用的其他代碼:
apply plugin: 'com.android.library'android {compileSdkVersion 23buildToolsVersion "25.0.2"defaultConfig {minSdkVersion 8targetSdkVersion 21}buildTypes {release {/** 不顯示LOG **//** 混淆 **/minifyEnabled trueproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}debug {/** 不顯示LOG **//** 混淆 **/minifyEnabled trueproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}}這里面主要是配置了Debug和release版本編譯的jar都使用proguard-rules.pro進行混淆,核心代碼是:
buildTypes {release {/** 不顯示LOG **//** 混淆 **/minifyEnabled trueproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}debug {/** 不顯示LOG **//** 混淆 **/minifyEnabled trueproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}proguard-android.txt是android自帶的文檔,我們不需要配置。這樣當我們編譯工程時,自動生成的jar包會進行混淆,但是我們需要配置proguard-rules.pro文檔,不然直接編譯會報錯。在和build.gradle同一目錄下新建一個txt文檔,修改文件名為proguard-rules.pro,接下來進行混淆的配置。
?
2:配置proguard-rules.pro文件
(1)把AS自帶的協議配置進來
# This is a configuration file for ProGuard. # http://proguard.sourceforge.net/index.html#manual/usage.html # Starting with version 2.2 of the Android plugin for Gradle, these files are no longer used. Newer # versions are distributed with the plugin and unpacked at build time. Files in this directory are # no longer maintained.#表示混淆時不使用大小寫混合類名 -dontusemixedcaseclassnames#表示不跳過library中的非public的類 -dontskipnonpubliclibraryclasses#打印混淆的詳細信息 -verbose# Optimization is turned off by default. Dex does not like code run# through the ProGuard optimize and preverify steps (and performs some# of these optimizations on its own). -dontoptimize##表示不進行校驗,這個校驗作用 在java平臺上的 -dontpreverify# Note that if you want to enable optimization, you cannot just # include optimization flags in your own project configuration file; # instead you will need to point to the # "proguard-android-optimize.txt" file instead of this one from your # project.properties file. -keepattributes *Annotation*-keep public class com.google.vending.licensing.ILicensingService-keep public class com.android.vending.licensing.ILicensingService# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native -keepclasseswithmembernames class * {native <methods>; }# keep setters in Views so that animations can still work. # see http://proguard.sourceforge.net/manual/examples.html#beans -keepclassmembers public class * extends android.view.View {void set*(***);*** get*();}# We want to keep methods in Activity that could be used in the XML attribute onClick -keepclassmembers class * extends android.app.Activity {public void *(android.view.View); }# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations-keepclassmembers enum * {public static **[] values();public static ** valueOf(java.lang.String);}-keepclassmembers class * implements android.os.Parcelable {public static final android.os.Parcelable$Creator CREATOR;}-keepclassmembers class **.R$* {public static <fields>;}# The support library contains references to newer platform versions. # Don't warn about those in case this app is linking against an older# platform version. We know about them, and they are safe. -dontwarn android.support.**# Understand the @Keep support annotation. -keep class android.support.annotation.Keep-keep @android.support.annotation.Keep class * {*;}-keepclasseswithmembers class * {@android.support.annotation.Keep <methods>;}-keepclasseswithmembers class * {@android.support.annotation.Keep <fields>;}-keepclasseswithmembers class * {@android.support.annotation.Keep <init>(...);}(2)引入依賴包路徑
#引入依賴包rt.jar(jdk路徑) -libraryjars 'D:\Program Files\Java\jdk1.8.0_101\jre\lib\rt.jar' #引入依賴包android.jar(android SDK路徑) -libraryjars 'E:\Android\AndroidSdk\platforms\android-25\android.jar' #如果用到其他包,需要引入#忽略警告 -ignorewarnings #保證是獨立的jar,沒有任何項目引用,如果不寫就會認為我們所有的代碼是無用的,從而把所有的代碼壓縮掉,導出一個空的jar -dontshrink #保護泛型 -keepattributes Signature這里注意一點,rt.jar在自己安裝的jdk的jre包下找,需要根據自己的路徑進行配置。android.jar也需要根據自己的安裝SDk的路徑進行配置。這前面的配置代碼直接拷到proguard-rules.pro文件里就可以了,不然無法編譯通過。但是僅僅這樣不夠,因為這樣會混淆所有的代碼,那么對外的接口也會被混淆為a,b這類函數名,導致使用者無法找到接口,所以需要對接口不進行混淆。
(3)加入自己不想混淆的配置
根據實際情況選擇性配置
#自己不想混淆的配置,保證com下的類名不被混淆 -keep class com.csdn.info.**{*;}簡單講講,這個其實就是告訴編譯器com.csdn.info包下的所以文件不要混淆,還可以這樣寫
-keep class com.csdn.info.**{public <fields>;public <methods>; }這個是告訴編譯器不要混淆com.csdn.info包下的所以文件的public變量和函數。
?
接著直接編譯工程,就會在生成混淆的jar包,在build/intermediates/bundles/release/classes.jar目錄里。關于怎么打包生成jar包,我之前寫過一篇博客,網上也很多資料,大家可以自己去看看。
?
android studio如何生成混淆代碼的jar就講完了。、
?
就這么簡單。
總結
以上是生活随笔為你收集整理的android studio如何生成混淆代码的jar的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 如何使用Parcelab
- 下一篇: android 如何使用LaunchMo