我已經使用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 –