2011-10-07 94 views
1

我已经使用Android库项目编写了一个Android应用程序,该项目也是由我编写的。我必须发布应用程序的源代码,但我不想分发库的来源。该库定义了自定义视图等,因此它包含XML布局和资源。我正在考虑以二进制形式发布这个库(一个.jar也许?),以供主项目参考。我想通过Proguard对这个二进制库进行模糊处理。这是可行的吗?怎么样?从Android库项目生成混淆库

谢谢。

回答

1

我不认为你可以得到你想要的。 Android库项目是一个完整的Android项目,包含您提到的所有资源。如果你想混淆纯代码,只有你的API可见,那么你可以通过Proguard创建一个。然而,由于Proguard只能处理Java文件,因此它并不了解Android xml和需要Android SDK工具链打包到APK中的资源。所以简而言之,如果只是在外部jar中的Java代码(可能会调用Android API),那么您可以进行Proguard。如果您正在考虑其他Android资源文件,那么我不这么认为。

+0

混淆图书馆的代码是可以的。我怎样才能做到这一点? – Venator85

+0

查看http://stackoverflow.com/questions/3188059/android-proguard –

3

正如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进行了测试。