我已经使用Android库项目编写了一个Android应用程序,该项目也是由我编写的。我必须发布应用程序的源代码,但我不想分发库的来源。该库定义了自定义视图等,因此它包含XML布局和资源。我正在考虑以二进制形式发布这个库(一个.jar也许?),以供主项目参考。我想通过Proguard对这个二进制库进行模糊处理。这是可行的吗?怎么样?从Android库项目生成混淆库
谢谢。
我已经使用Android库项目编写了一个Android应用程序,该项目也是由我编写的。我必须发布应用程序的源代码,但我不想分发库的来源。该库定义了自定义视图等,因此它包含XML布局和资源。我正在考虑以二进制形式发布这个库(一个.jar也许?),以供主项目参考。我想通过Proguard对这个二进制库进行模糊处理。这是可行的吗?怎么样?从Android库项目生成混淆库
谢谢。
我不认为你可以得到你想要的。 Android库项目是一个完整的Android项目,包含您提到的所有资源。如果你想混淆纯代码,只有你的API可见,那么你可以通过Proguard创建一个。然而,由于Proguard只能处理Java文件,因此它并不了解Android xml和需要Android SDK工具链打包到APK中的资源。所以简而言之,如果只是在外部jar中的Java代码(可能会调用Android API),那么您可以进行Proguard。如果您正在考虑其他Android资源文件,那么我不这么认为。
正如Morrison Chang所提到的,目前没有任何方法可以将jar库项目作为jar发布,也没有任何方法可以对java源代码之外的项目进行混淆。但是,有一种混淆源代码的方式,虽然这不是官方支持的。
您需要做的只是在库中运行“ant clean release”命令。混淆的源代码被写入“bin/proguard/obfuscated.jar”。只需将该jar文件放入导出的库项目的libs目录中,然后删除src目录的内容即可。
但是,上述方法有一个问题。它没有正确处理资源。为了解决这个问题,你应该从你的obfuscated.jar副本中去掉所有的资源类(R.class和R $ *。class)。这反过来将要求您禁用这些资源类的模糊处理。这可以通过加入以下的ProGuard-project.txt来完成:
-keep public class **.R {
public *;
}
-keep public class **.R$* {
public *;
}
供您参考,这里是我用它来构建一个模糊的,sourceless的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进行了测试。
混淆图书馆的代码是可以的。我怎样才能做到这一点? – Venator85
查看http://stackoverflow.com/questions/3188059/android-proguard –