Android Studio 混淆 相關
總結下 在Android Studio下作代碼混淆碰到的一些問題, 以及解決方法,其實就是總結下別人的經驗
一般流程:
1.首先開啟簽名混淆, 在module中的build.gradle中:
buildTypes { release { minifyEnabled true //開啟混淆 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release } }
2. 然后在module的目錄下找到proguard-rules.pro, 沒有就自己建一個,
在這里增加混淆規則, 先加上一些通用的規則:
-optimizationpasses 5 # 指定代碼的壓縮級別 -dontusemixedcaseclassnames # 是否使用大小寫混合 -dontpreverify # 混淆時是否做預校驗 -verbose # 混淆時是否記錄日志 -dontskipnonpubliclibraryclasses -keepattributes SourceFile,LineNumberTable -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 *; } #如果引用了v4或者v7包 -dontwarn android.support.** -dontwarn android.support.v4.** -keep class android.support.v4.** { *; } -keep public class * extends android.support.v4.** -keep public class * extends android.app.Fragment
如果使用了支付寶,
#支付寶 -dontwarn com.alipay.** -keep class com.alipay.**{*;} -dontwarn com.ta.utdid2.** -keep class com.ta.utdid2.**{*;} -dontwarn com.ut.device.** -keep class com.ut.device.**{*;}
如果加了友盟:
#友盟 -keep class com.umeng.**{*;}
如果使用了百度地圖:
-dontwarn com.baidu.** -keep class com.baidu.**{*;}
如果使用 nineoldandrois包
-dontwarn com.nineoldandroids.** -keep class com.nineoldandroids.**{*;}
如果使用了銀聯的
-dontwarn com.unionpay.** -keep class com.unionpay.**{*;}
如果使用了xutils:
-dontwarn com.lidroid.xutils.** -keep class com.lidroid.xutils.**{*;}
其他的引用到的第三方包大致上要添加取消混淆都類似上面的
問題:
1.===================================================================
, 因為xutils使用了apache的東西, 如果在
compileSdkVersion 23
則,需要單獨導入apache的東西,因為Android M版本刪除掉了apache的聯網包
在module的build.gradle中增加依賴
dependencies { compile 'org.apache.httpcomponents:httpcore:4.4.2' }
android { useLibrary 'org.apache.http.legacy' }
使用 useLibrary 需要在project的 build.gradle中設置gradle版本為1.3.0以上,否則gradle會爆找不到方法的錯
dependencies { classpath 'com.android.tools.build:gradle:1.3.0' }
然后在混淆規則中增加
-dontwarn org.apache.http.** -keep class org.apache.http.**{*;}
2.===================================================================
然后, 有些第三方包已經開始支持android M了 , 所以會爆一個錯,類似于這樣
Warning: u.aly.bt: can't find referenced method 'int checkSelfPermission(java.lang.String)' in library class android.content.Context Warning: there were 1 unresolved references to library class members.
因為調用了api 23的方法checkSelfPermission() , 都說要將 本地編譯環境設置成這樣,
compileSdkVersion 23
則,相應的其他的一些也要設置成 api23 的環境,如
buildToolsVersion "23.0.1"
以及
compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:recyclerview-v7:23.1.1' compile 'com.android.support:support-v4:23.1.1' compile 'com.android.support:appcompat-v7:23.1.1'
只是保留了
targetSdkVersion 22
,則可以不用管 android M新的 運行時權限問題了,
關于targetSdkVersion 相關的信息,可以參考
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0118/3881.html
貌似運行時權限問題也有開源庫解決方案了,也沒去搜