一、为何使用 aar 的包,没使用 jar 的包?
因为 jar 的包无法将资源文件打入,如果实在要使用,则只现在引用包的项目中先加入包要使用的资源文件,然后再引用包,使用反射的方式来调用,容易照成冲突等问题。
下面是反射的使用方式:
二、aar 包需要自己手动去创建吗?
项目生成的时候,自动会在 build/outputs/aar 文件夹中生成(Debug 版本的),如果需要生成 Release 版本的,需要在 Android Studio 控制台运行 gradlew assembleRelease。
三、如何引用 aar 包?
将 aar 放入需要引用的项目的 libs 目录下,并在该项目的 build.gradle 添加
repositories 与 dependencies平级,implementation(compile) 在 dependencies 中。
四、如何生成混淆的 aar 包?
在包项目的 build.gradle 的 android 中 添加:
并编写混淆规则文件 proguard-rules.pro
五、混淆规则文件 proguard-rules.pro 如何编写
这个编写的方法和规则比较,复杂具体可以参照这几篇文章:
https://blog.csdn.net/zhangping2015/article/details/78374699
https://www.jianshu.com/p/7436a1a32891
https://www.cnblogs.com/zhen-android/p/6014336.html
https://blog.csdn.net/redvalley/article/details/44265603
https://blog.csdn.net/lengqi0101/article/details/52242410
六、目前遇到的问题
要混淆的公共类需要按照一定的规则来编写,暴露的类用于给第三方调用不能混淆,其它类和方法混淆后打包aar就能给其他应用调用。
七、proguard-rules.pro
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# 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 *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# complete the original source file name.
#-renamesourcefileattribute SourceFile
-ignorewarnings
-dontoptimize
-dontpreverify #忽略与dex编译器和Dalvik VM不相干的预校验
-verbose #开启混淆记录日志,指定映射文件的名称
-printmapping proguardMapping.txt
-keepattributes *Annotation* #保留注释,RemoteViews通常需要annotations
-keepattributes Signature #保持泛型
-dontusemixedcaseclassnames # 混淆时不使用大小写混合,混淆后的类名为小写
-dontskipnonpubliclibraryclasses # 指定不去忽略非公共的库的类
-dontskipnonpubliclibraryclassmembers # 指定不去忽略非公共的库的类的成员
#如果有引用v4包可以添加下面这行
#-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.support.** { *; }
#如果引用了v4或者v7包
-dontwarn android.support.*
# 混淆算法
-optimizations !code/simplification/cast,!field/*,!class/merging/*
#忽略警告
-ignorewarning
#基本规则
#四大组件(AndroidManifest.xml清单文件中内容)等不混淆
-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
#自定义控件不混淆
-keep public class * extends android.view.View {
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
public void set*(...);
}
#包含特殊参数的构造方法及其类不混淆
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
#所有的Onclick操作不混淆
-keepclassmembers class * extends android.content.Context {
public void *(android.view.View);
public void *(android.view.MenuItem);
}
#保持 native 方法不被混淆
-keepclasseswithmembernames class * {
native <methods>;
}
# 对于R(资源)类中的静态方法不能被混淆
-keepclassmembers class **.R$* {
public static <fields>;
}
#Javascript接口中的方法不能混淆
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
# 枚举类
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
#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);
}
#序列化不能被混淆
-keep public class * implements java.io.Serializable {*;}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
#处理反射类 不能混淆
#处理js交互 不能混淆
#处理第三方依赖库 不能混淆
#自定义
-keep class com.cqyuntong.asource.components.** { * ; }
-keep class com.cqyuntong.asource.** { * ;}