您的位置:首页 > 其它

AS 生成与混淆aar尝试经历

2018-03-01 14:34 696 查看
最近项目遇到提供sdk的情况,就想说直接生成个aar文件使用就可以了,但这个必须还要进行混淆,不然源码直接暴露了。然后就开始摸索尝试。
首先,AS 怎么生成与引用aar文件这个百度一下就会有了 就不多说了。这边就随便找了个
主要是如何生成混淆版的aar
首先要在生成aar的module中的gradle文件中将minifyEnabled 改为 true,改为true之后生成aar时就会去读取你配置的proguard-rules.pro文件根据需求进行混淆。proguard-rules.pro这个文件现在的AS新建项目一般都会自动生成在项目中,低版本的AS或者eclipse项目导入到AS的可能会缺少这个文件,自己在项目根目录下建一个就行。





混淆的内容主要就是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 <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(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 <fields>;
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 <methods>;
}
# 抛出异常时保留代码行号
-keepattributes SourceFile,LineNumberTable

-keepattributes InnerClasses
-dontoptimize

# 反射
-keepattributes Signature
-keepattributes EnclosingMethod
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: