1.偷懒式导出Jar
task releaseMyLib(type: Copy, dependsOn: ['build']) {
from('build/intermediates/bundles/release/')
into('build/libs')
include('classes.jar')
rename('classes.jar', 'my-lib.jar')
}
运行项目后会在’build/intermediates/bundles/release/下生成一个classes.jar,我们将其拷贝到build/libs下并重命名,这种方式会将BuildConfig还有R.class等也打包进去
2.规范导出Jar包
task jarMyLib(type: Jar, dependsOn: ['build']) {
archiveName = 'my-lib.jar'
from('build/intermediates/classes/release')
destinationDir = file('build/libs')
exclude('com/scott/hellolib/BuildConfig.class')
exclude('com/scott/hellolib/BuildConfig\$*.class')
exclude('**/R.class')
exclude('**/R\$*.class')
manifest {
attributes(
'Implementation-Title': "${project.name}",
'Implementation-Version': "${version}",
'Built-Date': new Date().getDateTimeString(),
'Built-With':
"gradle-${project.getGradle().getGradleVersion()},groovy-${GroovySystem.getVersion()}",
'Created-By':
'Java ' + System.getProperty('java.version') + ' (' + System.getProperty('java.vendor') + ')')
}
}
其中涉及到上文说过的修改Manifest信息的方法。
3.混淆Jar
def androidSDKDir = plugins.getPlugin('com.android.library').sdkHandler.getSdkFolder()
def androidJarDir = androidSDKDir.toString() + '/platforms/' + "${android.compileSdkVersion}" + '/android.jar'
task proguardMyLib(type: proguard.gradle.ProGuardTask, dependsOn: ['jarMyLib']) {
injars('build/libs/my-lib.jar')
outjars('build/libs/my-pro-lib.jar')
libraryjars(androidJarDir)
configuration android.getDefaultProguardFile('proguard-android.txt')
configuration 'proguard-rules.pro'
dontshrink
}
proguard-rules.pro文件(较上一篇文章更详细一点,且执行完毕会导出mapping等文件)
-ignorewarnings # 忽略警告,避免打包时某些警告出现
-optimizationpasses 5 # 指定代码的压缩级别
-dontusemixedcaseclassnames # 是否使用大小写混合
-dontskipnonpubliclibraryclasses # 是否混淆第三方jar
-dontpreverify # 混淆时是否做预校验
-verbose # 混淆时是否记录日志
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆时所采用的算法
-dump class_files.txt #记录生成的日志数据,gradle build时在本项目根目录输出 apk 包内所有 class 的内部结构
-printmapping mapping.txt #混淆前后的映射 (我是在使用了这条语句后,就在build\outputs\mapping\你的项目名\release\文件夹下,出现了dump.txt, mapping.txt, seeds.txt, usage.txt)
-printseeds seeds.txt #未混淆的类和成员
-printusage unused.txt (dump.txt) #列出从 apk 中删除的代码
-dontwarn android.support.v4.** #缺省proguard 会检查每一个引用是否正确,但是第三方库里面往往有些不会用到的类,没有正确引用。如果不配置的话,系统就会报错。
-dontwarn android.os.**
-keep class android.support.v4.** { *; } # 保持哪些类不被混淆
-keep class com.baidu.** { *; }
-keep class android.os.**{*;}
-keep interface android.support.v4.app.** { *; }
-keep public class * extends android.support.v4.**
-keep public class * extends android.app.Fragment
-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.support.v4.widget
-keepclasseswithmembernames class * { # 保持 native 方法不被混淆
native <methods>;
}
-keepclasseswithmembers class * { # 保持自定义控件类不被混淆
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * { # 保持自定义控件类不被混淆
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity { #保持类成员
public void *(android.view.View);
}
-keepclassmembers enum * { # 保持枚举 enum 类不被混淆
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆
public static final android.os.Parcelable$Creator *;
}
-keep public class com.scott.hellolib.test.People{
public protected *;
}
混淆完毕
可以看到在混淆文件中增加如下语句
-keep public class com.scott.hellolib.test.People{
public protected *;
}
混淆后的jar指定类方法没有被混淆。
本文到此结束