我使用Android Library项目编写了一个Android应用程序,也是由我编写的。我必须发布应用程序的源代码,但我不想分发库的源代码。这个库定义了自定义视图,因此它包括XML布局和资源。我正在考虑以二进制形式发布这个库(可能是.jar ?),以供主要项目参考。我希望这个二进制库通过Proguard进行混淆。这可行吗?如何?
谢谢。
正如Morrison Chang所提到的,目前没有任何方法可以将android库项目作为jar发布,也没有任何方法可以混淆除了java源代码之外的项目。但是,有一种方法可以混淆源代码,尽管官方不支持这种方法。
你所需要做的就是在你的库中运行"ant clean release"命令。经过混淆处理的源代码被写入"bin/proguard/obfusated .jar"。只需将该jar文件放在导出库项目的libs目录中,并删除src目录中的内容,就差不多完成了。
然而,上面的方法有一个问题。它不能很好地处理资源。要解决这个问题,您应该从obfusated .jar副本中删除所有资源类(R.class和R$*.class)。这反过来又要求您禁用这些资源类的混淆。这可以通过在proguard-project.txt中添加以下内容来完成:-keep public class **.R {
public *;
}
-keep public class **.R$* {
public *;
}
作为参考,这里是我用来构建一个模糊的,无源的android库项目的ant目标:
<?xml version="1.0" encoding="UTF-8"?>
<project name="library_rules" default="librelease">
<target name="librelease" depends="release"
description="Build a sourceless and obfuscated android library.">
<property name="libname" value="myProject" />
<property name="librelease.dir" location="bin/${libname}" />
<delete file="${librelease.dir}"/>
<mkdir dir="${librelease.dir}"/>
<mkdir dir="${librelease.dir}/libs"/>
<mkdir dir="${librelease.dir}/src"/>
<copy todir="${librelease.dir}/res">
<fileset dir="res"/>
</copy>
<copy file="AndroidManifest.xml" todir="${librelease.dir}" />
<copy file="ant.properties" todir="${librelease.dir}" />
<copy file="build.xml" todir="${librelease.dir}" />
<copy file="project.properties" tofile="${librelease.dir}/project.properties" />
<jar destfile="${librelease.dir}/libs/${libname}.jar">
<zipfileset src="bin/proguard/obfuscated.jar" excludes="**/R.class,**/R$$*.class"/>
</jar>
</target>
</project>
要导出的android库项目将位于bin/myProject中。这已经使用Android SDK工具v20.0.3和v21进行了测试。
我不认为你能得到你想要的。Android Library Project是一个完整的Android Project,包含了你提到的所有资源。如果你想混淆纯代码,这样只有你的API是可见的,那么你可以通过Proguard创建一个。然而,由于Proguard只能处理Java文件,它不了解Android xml和需要Android SDK工具链打包成APK的资源。所以简而言之,如果只有Java代码在外部jar中(可能调用Android api),您可以保护它。如果你在考虑其他Android资源文件,我不这么认为。