2011-10-07 96 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進行了測試。