AS 生成与混淆aar尝试经历

最近项目遇到提供sdk的情况,就想说直接生成个aar文件使用就可以了,但这个必须还要进行混淆,不然源码直接暴露了。然后就开始摸索尝试。

首先,AS 怎么生成与引用aar文件这个百度一下就会有了 就不多说了。这边就随便找了个

主要是如何生成混淆版的aar

首先要在生成aar的module中的gradle文件中将minifyEnabled 改为 true,改为true之后生成aar时就会去读取你配置的proguard-rules.pro文件根据需求进行混淆。proguard-rules.pro这个文件现在的AS新建项目一般都会自动生成在项目中,低版本的AS或者eclipse项目导入到AS的可能会缺少这个文件,自己在项目根目录下建一个就行。

AS 生成与混淆aar尝试经历_第1张图片

AS 生成与混淆aar尝试经历_第2张图片

混淆的内容主要就是proguard-rules.pro里面写的东西。百度一下也是有一堆关于混淆规则的编写这边也随便找一个

比较值得提的是之前混淆完arr文件后,调用时出现了 No Such Method 这样的错误,就排查了应该是底层so的问题,我猜应该是so也被混淆了,后来找到不混淆so的方法

#-libraryjars  ../XXX(此处为library名称)/src/main/jniLibs/armeabi/xxxxx.so

-libraryjars  ../lib_Recognize/src/main/jniLibs/armeabi-v7a/libCameraUse.so

so的问题就解决了

之后发现打包运行时可以正常运行但总是出现一堆警告

Error:warning: Ignoring InnerClasses attribute for an anonymous inner class类似这样的等等等等警告

之后找了网上找了一堆答案都是分包什么的,尝试了都不行

最后添加了

# 反射 
-keepattributes Signature

-keepattributes EnclosingMethod

反射不混淆,就解决了这个问题

以下是个人的项目所用的proguard-rules文件,请不要直接拿去用,仅供参考,按自己的需求去添加混淆规则(敏感的东西已用XXX替换掉了)

# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in F:\sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# 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
# hide the original source file name.
#-renamesourcefileattribute SourceFile

#-libraryjars  ../XXX(此处为library名称)/src/main/jniLibs/armeabi/xxxxx.so
-libraryjars  ../XXX/src/main/jniLibs/armeabi-v7a/XXX.so
-libraryjars  ../XXX/src/main/jniLibs/armeabi/XXX.so
-libraryjars  ../XXX/src/main/jniLibs/mips/XXX.so
-libraryjars  ../XXX/src/main/jniLibs/x86/XXX.so

# 保留了继承自Activity、Application这些类的子类
# 因为这些子类有可能被外部调用
# 比如第一行就保证了所有Activity的子类不要被混淆
-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 * extends android.view.View
-keep public class com.android.vending.licensing.ILicensingService
-keep public class com.XXX.XXX.BaseActivityCPListener
-keep public class com.XXX.engin.test
-keep public class com.serenegiant.usb.**
-dontwarn com.serenegiant.usb.**

# 如果有引用android-support-v4.jar包,可以添加下面这行
-keep public class com.null.test.ui.fragment.** {*;}

# 保留Activity中的方法参数是view的方法,
# 从而我们在layout里面编写onClick就不会影响
-keepclassmembers class * extends android.app.Activity {
    public void * (android.view.View);
}
-keepclassmembers class com.XXX.engin.BaseActivityCPListener {
    *;
}
-keepclassmembers class com.serenegiant.usb.** {
    *;
}
-keepclassmembers class com.XXX.engin.test {
    *;
}
-keepclassmembers class com.XXX.engin.BaseActivityCP {
    public *** * (***);
    public *** * ();
    public *** * ;
}


# 枚举类不能被混淆
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

# 保留自定义控件(继承自View)不能被混淆
-keep public class * extends android.view.View {
    public (android.content.Context);
    public (android.content.Context, android.util.AttributeSet);
    public (android.content.Context, android.util.AttributeSet, int);
    public void set*(***);
    *** get* ();
}

# 保留Parcelable序列化的类不能被混淆
-keep class * implements android.os.Parcelable{
    public static final android.os.Parcelable$Creator *;
}

# 保留Serializable 序列化的类不被混淆
-keepclassmembers class * implements java.io.Serializable {
   static final long serialVersionUID;
   private static final java.io.ObjectStreamField[] serialPersistentFields;
   !static !transient ;
   private void writeObject(java.io.ObjectOutputStream);
   private void readObject(java.io.ObjectInputStream);
   java.lang.Object writeReplace();
   java.lang.Object readResolve();
}


# 对R文件下的所有类及其方法,都不能被混淆
-keepclassmembers class **.R$* {
    *;
}

# 对于带有回调函数onXXEvent的,不能混淆
-keepclassmembers class * {
    void *(**On*Event);
}
# 一般第三方和自己的bean文件是不需要混淆的。
-keep class com.null.test.entities.** {
    *;
}

# WebView的处理
-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, java.lang.String);
}

#保持所有适配器类不被混淆,本应用中,不加这个将会导致适配器类加载失败,所有列表项没办法显示
-keep public class * extends android.widget.BaseAdapter
#假如项目中有用到注解,应加入这行配置
-keepattributes *Annotation*


#所有native的方法不能去混淆.
-keepclasseswithmembernames class * {
    native ;
}
# 抛出异常时保留代码行号
-keepattributes SourceFile,LineNumberTable

-keepattributes InnerClasses
-dontoptimize

# 反射 
-keepattributes Signature
-keepattributes EnclosingMethod

你可能感兴趣的:(Android学习)