www.cftea.com

aar 文件打包与混淆

千一网络(原创)2018/6/14 13:53:23

一、为何使用 aar 的包,没使用 jar 的包?

因为 jar 的包无法将资源文件打入,如果实在要使用,则只现在引用包的项目中先加入包要使用的资源文件,然后再引用包,使用反射的方式来调用,容易照成冲突等问题。

下面是反射的使用方式:

Android Studio 打包混淆踩坑

二、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.** { * ;}
<<返回首页<<