这段时间接到了一个开发集成广告SDK的任务,意思是集成现在市面上多家广告商的广告(例如广点通和穿山甲等),封装好接口打包出sdk发给游戏端的同学去接入,目的是游戏端的同学在调用的时候无需关心要展示的广告是哪个广告商的。例如我们会在管理后台配置出一套我们自己的广告id,这个id可以配置切换到具体广告商的具体某种广告的广告id,如banner广告或者是插屏广告。好了,了解需求之后一顿操作猛如虎,本地测试都没有问题的时候,以为临门一脚打个sdk出来就ok了,突然发现在打正式包的时候出现问题了。
问题:编译aar的时候一直报找不到相关的类。
分析:既然本地测试debug包都是正常能够运行的,那么报错报找不到的类肯定是存在,那么问题肯定是出在打正式包的配置相关,而打正式包当中就是对代码进行了混淆的操作,那么肯定是有某些类被混淆掉了导致找不到,只要保证这些类不被混淆问题应该就能解决了。
处理:找到项目中自己写的代码,把项目中那些model类和接口类等都配置到混淆文件中,相关的就不展开来说了,还有一部分就是我们接的第三方库的混淆配置了,我们只要去第三方的官网都可以查到他们的混淆配置,一般都会找到,后面我把混淆文件展示出来。
结果:检查对比完了整个混淆文件之后以为没问题了,再次编译的时候,还是不行,此时差点口吐芬芳了。
再次分析:屡了屡思路,突然想起之前在给游戏出渠道包的时候加了很多第三方的jar,为什么他们没有像我们这样包这些第三方的jar都打到aar里面呢,既然他们游戏能打出来,我们能不能反思维来想想呢,我们也不把这些第三方的jar打到aar里面,这样行不行呢。
操作:我们新建了一个单独的公共lib用来放第三方的包,这个lib里面不做任何的操作,只是用来存放三分的sdk包,然后在我们的sdk模块里面引用这个lib,就相当于把三方的包单独管理起来,我们只是引用,不把他们打入aar,但是混淆文件里面还是要包含三方包的混淆配置。
结果:再次编译之后,发现真的通过了,正解。
引用:当我们打出自己的广告aar之后,再发给游戏端的同学接入时,必须要把公共lib里面用到的aar和jar都要发给他们一起引用。
最后贴出混淆文件:
#---------------------------------基本指令区----------------------------------
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontpreverify
-verbose
-optimizations !code/simplification/cast,!field/*,!class/merging/*
-keepattributes *Annotation*,InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
#----------------------------------------------------------------------------
#---------------------------------默认保留区---------------------------------
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.support.multidex.MultiDexApplication
-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
-keep class android.support.** {*;}
-keep class android.support.v4.** { *; }
-keep public class * extends android.support.v4.**
-keep interface android.support.v4.app.** { *; }
-keep class android.support.v7.** { *; }
-keep public class * extends android.support.v7.**
-keep interface android.support.v7.app.** { *; }
-keep class android.support.v7.widget.RecyclerView{*;}
-dontwarn android.support.** # 忽略警告
#保持注解继承类不混淆
-keep class * extends java.lang.annotation.Annotation {*;}
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclassmembers class * extends android.app.Activity{
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
#不混淆资源类
-keepclassmembers class **.R$* {
public static <fields>;
}
-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);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
-keepclassmembers class * implements java.io.Serializable {
*;
}
-keep class **.R$* {
*;
}
-keepclassmembers class * {
void *(**On*Event);
void *(**On*Listener);
}
-keep public class com.ml.mladsdk.InitParams { private *; }
-keep public class com.ml.mladsdk.MLADParams{*;}
-keep public class com.ml.mladsdk.MLSDKParams{*;}
-keep public class com.ml.mladsdk.MLUserParams {*;}
-keep public class com.ml.mladsdk.MLADLoginParams {*;}
-keep public class com.ml.mladsdk.MLWithdrawalParams {*;}
-keep public class com.ml.mladsdk.MLShareParams {*;}
-keep public interface com.ml.mladsdk.AdInitListener {*;}
-keep public interface com.ml.mladsdk.AdLoginListener {*;}
-keep public interface com.ml.mladsdk.AdSdkListener {*;}
-keep class com.ml.mladsdk.config.** { *;}
-keep class com.ml.mladsdk.listener.** { *;}
-keep class com.ml.mladsdk.adapter.** { *;}
-keep class com.ml.mladsdk.dialog.** { *;}
-keep class com.ml.mladsdk.sign.** { *;}
-keep class com.ml.mladsdk.GDTDialodAdView{
public void init(android.app.Activity);
}
-keep class com.ml.mladsdk.MLADSDK {
public void init(android.app.Activity,Callback);
}
-keep class com.ml.mladsdk.MLAdCenterSDK {
*;
}
-keep class com.bytedance.sdk.openadsdk.TTFileProvider {
*;
}
-keep class com.bytedance.sdk.openadsdk.multipro.TTMultiProvider {
*;
}
-keep class com.ml.utils.PhoneIUtils {
public static void initMsaId(android.content.Context);
}
-keep class com.ml.mladsdk.PermissionManager {
public static void onRequestPermissionResult(int,java.lang.String[],int[]);
}
-dontwarn com.xdandroid.hellodaemon.**
-keepattributes Signature
# 穿山甲
-keep class com.bytedance.sdk.openadsdk.** { *; }
-keep class com.androidquery.callback.** {*;}
-keep public interface com.bytedance.sdk.openadsdk.downloadnew.** {*;}
-keep class com.ss.sys.ces.* {*;}
-dontwarn com.ss.android.socialbase.downloader.**
-dontwarn com.ss.android.crash.log.**
-dontwarn com.androidquery.**
-keep class com.androidquery.** { *;}
-dontwarn tv.danmaku.**
-keep class tv.danmaku.** { *;}
-dontwarn androidx.**
# 如果使用了tbs版本的sdk需要进行以下配置
-keep class com.tencent.smtt.** { *; }
-dontwarn dalvik.**
-dontwarn com.tencent.smtt.**
# 如果使用了微信OpenSDK,需要添加如下配置
-keep class com.tencent.mm.opensdk.** {
*;
}
-keep class com.tencent.mm.opensdk.openapi.WXAPIFactory{
*;
}
-keep class com.tencent.wxop.** {
*;
}
-keep class com.tencent.mm.sdk.** {
*;
}
-keep class com.bun.miitmdid.core.** {*;}
-dontwarn com.alibaba.fastjson.**
-keep class com.alibaba.fastjson.** { *; }
-keepattributes Signature
-keepattributes *Annotation*
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod