android studio Jar 包制作以及混淆

需求

项目越来越大,需要对核心代码进行封装加密管理

Jar 包制作

  • 优点:简单,方便
  • 缺点:不能把资源文件都打进去 Jar 包里面,例如图片,布局文件等等

aar 制作

  • 优点:跟 Jar 一样,可以把资源文件都打包进去,AS可以直接引用,管理方便
  • 缺点:-

so 制作

  • 优点:增加反编译难度,核定代码可以放进去
  • 缺点:需要 C/C++基础,并不是所有都适合放到 so 里面去。

实现

制作

  • 新建一个 module,选择 Android Library
  • Finish
  • 把你需要封装的代码写在 module 里面去

打包

  • 在 module 里面的 build.gradle 文件加入一下 Task
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
task buildJar(type: Jar, dependsOn: ['compileReleaseJavaWithJavac']) { //  task buildJar(type: Jar, dependsOn: ['build'])
// 导出的 jar 文件的名称
archiveName = "testJar-debug.jar"

//需打包的资源所在的路径集
from('build/intermediates/classes/release')
destinationDir = file('../libs') // //导出的 jar 文件的存放目录(未指定则默认存放在 build/libs 下) destinationDir = file('D:/libs')

exclude "**/BuildConfig.class" //去掉不要的类
exclude('**/R.class')
exclude('**/R\$*.class')
include "**/*.*" //需要打包的类 如 // include('com/reginer/mytest/*.class')
}

task proguardJar(dependsOn: ['buildJar'], type: ProGuardTask) {
println('proguard '+project.name+' jar')
//Android 默认的 proguard 文件
configuration android.getDefaultProguardFile('proguard-android.txt')
//加载各模块 proguard 配置文件
configuration 'proguard-rules.pro'

String inJar = buildJar.archivePath.getAbsolutePath()
injars inJar
outjars inJar.substring(0, inJar.lastIndexOf('-')) + "-release.jar"

//设置不删除未引用的资源(类,方法等)
dontshrink

//运行时 jar 包不混淆
Plugin plugin = getPlugins().hasPlugin(AppPlugin) ?
getPlugins().findPlugin(AppPlugin) :
getPlugins().findPlugin(LibraryPlugin)
if (plugin != null) {
List<String> runtimeJarList
if (plugin.getMetaClass().getMetaMethod("getRuntimeJarList")) {
runtimeJarList = plugin.getRuntimeJarList()
} else if (android.getMetaClass().getMetaMethod("getBootClasspath")) {
runtimeJarList = android.getBootClasspath()
} else {
runtimeJarList = plugin.getBootClasspath()
}

for (String runtimeJar : runtimeJarList) {
libraryjars(runtimeJar)
}

}
}
  • 打开 Gradle 任务,执行 buildJar

  • 然后再执行 proguardJar 任务进行混淆

  • 最后你会发现在项目中出现 test-relase.jar

    注意buildJar里面archiveName名字必须有-,不然会执行错误的。原因在与在混淆的时候,需要把包名改成 relase.不喜欢的可以自行修改逻辑代码

    注意buildJar里面archiveName名字必须有-,不然会执行错误的。原因在与在混淆的时候,需要把包名改成 relase.不喜欢的可以自行修改逻辑代码

    注意buildJar里面archiveName名字必须有-,不然会执行错误的。原因在与在混淆的时候,需要把包名改成 relase.不喜欢的可以自行修改逻辑代码

-------------本文结束感谢您的阅读-------------
您的支持将是我最大的动力