2012-05-13 16 views
14

私はオープンソースプロジェクトに取り組んでいます。誰でもソースをダウンロードしてビルドすることができますので、パッケージ名はどこでも - ディレクトリ構造を含めてハードコードしたくありません。Android - オープンソースプロジェクトのビルド時に動的にパッケージ名を設定するにはどうすればいいですか?

私は建物のためにantを使用します。どうやら私はbuild.xmlを変更することができますが、これはandroid updateによって上書きされていると思います。何が使われても、Gitリポジトリにコミットされ、複雑すぎるべきではありません。

現在、Gitリポジトリから直接コードを作成するプロセスはかなり簡単です。ここでREADMEファイルからの抜粋です:これは.gitignore D」であるため、

$ cd ~/src/isokeys/IsoKeys 
$ android list targets # I build against API level 10. 
$ android update project --name IsoKeys --target 1 --path ./ # Only needed first time. 
$ ant debug && adb -d install -r bin/IsoKeys-debug.apk 

私にとっては、それは、local.propertiesにパッケージ名を置くことは理にかなっています。パッケージ名はどこにもないので、これをしないとビルドに失敗します。 READMEに少なくとも1ステップ余分に追加する必要がありますが、最小限に抑えたいと思います。

編集もちろん、別の要件として、差異が意味をなさないことがあります。これは、手動でパッケージ名の名前を変更しても意味がありません。

+0

これはかなりばかげているようです。私はこのようなフープを飛び越しているオープンソースのプロジェクトについては聞いていません。 –

+1

2つの主な動機は、名前を変更したディレクトリの差分は苦痛であり、これと他の多くのオープンソースプロジェクトは独自のドメインを持っておらず、sourceforge.netなどのコードホスティングサイトでホストされており、フォーク/マージは一般的です。 –

答えて

20

ビルド時にマニフェストを更新する必要があった(この理由ではありませんが)何か同様のことを行いました。私がこれを達成したのは、2番目のAndroidManifestを作成し、それをconfigという名前のディレクトリの下に置くことでした。

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="@[email protected]" 
     android:versionCode="@[email protected]" 
     android:versionName="@[email protected]"> 


<!-- EVERYTHING ELSE GOES HERE --> 


</manifest> 

は、その後、あなたがAndroidのビルドからスクリプト全体をコピーする(ちょうどいくつかの変更を必要とAntスクリプトbuild.xmlの定期的な裸の骨を使用することはできません: だから設定/ AndroidManifestにあなたはこのような何かを持っている可能性があり彼らは車輪を再発明せずに使用するためにいくつかのフックを追加しました)。 ビルドスクリプトはデフォルトでlocal.propertiesを読んでする必要がありますが、追加(またはコメント解除)しない場合は、このような行:ビルドスクリプトで

<property file="local.properties" /> 

あなたは「-pre-ビルド」と呼ばれる作業を確認する必要があり、このようにそれを変更します。

<target name="-pre-build"> 
    <copy file="config/AndroidManifest.xml" todir="." overwrite="true" encoding="utf-8"> 
     <filterset> 
      <filter token="CONFIG.APP_PACKAGE_NAME" value="${app.packagename}" /> 
      <filter token="CONFIG.APP_VERSION" value="${app.version}" /> 
      <filter token="CONFIG.APP_VERSION_CODE" value="${app.versioncode}" /> 
     </filterset> 
    </copy>   
</target> 

次に、あなたのlocal.propertiesはそうのようなバージョン名/コード、あなたはパッケージ名を置くファイル:

app.version=1.0 
app.versioncode=1 
app.packagename=com.mypackage.name 

は今、あなただけのyに確認する必要があります私たちがあなたの活動/サービス/放送リスナーなどのすべてを完全に修飾することを明示します。つまり、あなたはいつもあなたのソースコードの完全なパッケージを指定します。独自のソースコード用のパッケージを動的にしたい場合は、それぞれのプレフィックスを各クラスに置き換えることができます。しかし、それは愚かなようです。自分のパッケージ名でコードをパッケージ化するのは簡単ですプロジェクトにソースまたはjarを含めるだけで、どのプロジェクトからでも使用できます。

- UPDATE - ああ、あなたは彼らがパッケージ名を定義する必要があり、ユーザーに通知するために行うことができますもうひとつは次のようにビルドXMLで失敗したタグを使用している:

<fail message="app.packagename is missing. This must be defined in your local.properties file" unless="app.packagename" /> 

はこれを入れて地方を読んでいる行の後ろ。プロパティファイル

+0

ああ、私のビルドスクリプト(アンドロイド版で生成)、_is_ 'barebones'、 '$ import file =" $ {sdk.dir} /tools/ant/build.xml "/>'を含んでいます。だから私はいくつかの変更を加えてこのファイルをリポジトリにコミットすることができます。そうです、私に見せましょう... –

+0

何人かの人はその悪い考えを言っていますが、何も問題なく1年以上よくやっています。彼らは明らかにあなたのためにそれらのフックを残しますが、次のアンドロイドバージョンでは物事を変えることができるという保証はありません。 IIRC Eclipseでうまくいくようにするためにもう1つ必要だったことは、追加: 上記の変更は必要ありません。私はスクリプトの中のtools/ant/build.xml内のいくつかのターゲットを再利用できるように、それを必要としていました。それでは、アンドロイドビルドを使用しなければなりません。[targetname] –

+0

私には"as = androidbuild"セクションでは、Eclipseが最初にEclipseからAntスクリプトを使用していなかったにもかかわらず、Eclipseがターゲットが存在せず、Eclipseがプロジェクトをビルドできなくなると不満を持ちます。 –

6

Matt Wolfeの助けを借りて、私はこれまでの努力で部分的な回答を投稿しています。

私はデフォルトベアボーンbuild.xmlcustom_rules.xmlをインポートするだろうことに気づい:

<import file="custom_rules.xml" optional="true" /> 

は、だから私は、このファイルを作成し、いじり始めました。これは私がこれまでに出ているものです:

<?xml version="1.0" encoding="UTF-8"?> 
<project name="custom_rules" default="debug"> 
    <target name="-pre-build"> 
     <fail message="Please define app.packagename in your local.properties file." unless="app.packagename" /> 
     <taskdef resource="net/sf/antcontrib/antcontrib.properties"> 
      <classpath> 
       <pathelement location="/usr/share/java/ant-contrib.jar"/> 
      </classpath> 
     </taskdef> 
     <!-- How do I check for propertyregex? 
     <fail message="Depends on ant-contrib's propertyregex for app.packagename.path." unless="propertyregex" /> 
     --> 
     <propertyregex property="app.packagename.path" 
      input="${app.packagename}/" 
      regexp="\." 
      replace="/" 
      global="true" 
     /> 
     <copy todir="build/" overwrite="true" encoding="utf-8"> 
      <fileset dir="./"> 
       <include name="AndroidManifest.xml" /> 
       <include name="res/**" /> 
       <include name="lib/**" /> 
      </fileset> 
      <filterset> 
       <filter token="CONFIG.APP_PACKAGE_NAME" value="${app.packagename}" /> 
      </filterset> 
     </copy> 
     <copy todir="build/src/${app.packagename.path}" overwrite="true" encoding="utf-8"> 
      <fileset dir="./src/isokeys/"> 
       <include name="**" /> 
      </fileset> 
      <filterset> 
       <filter token="CONFIG.APP_PACKAGE_NAME" value="${app.packagename}" /> 
      </filterset> 
     </copy> 
    </target> 
    <target name="-pre-clean" description="Removes output files created by -pre-build."> 
     <delete file="build/AndroidManifest.xml" verbose="${verbose}" /> 
     <delete dir="build/res/" verbose="${verbose}" /> 
     <delete dir="build/lib/" verbose="${verbose}" /> 
     <delete dir="build/src/" verbose="${verbose}" /> 
    </target> 
    <!-- NOW CHANGE DIRECTORY TO build/ BEFORE HANDING BACK OVER TO build.xml!!! --> 
</project> 

これは今の意図は、SDKツールのbuild.xmlにある、(きちんと整頓物事を保つことの追加ボーナスを持っている)build/ですべてを設定しますこのbuild/ディレクトリから実行してください。しかし、私はcdの方法を見つけることができません。

+0

これまでのところ、良いニュースである 'README'のための余分なステップが1つしかありません:' $ echo 'app.packagename = your.package.name' >> local.properties' –

+0

これを最後に追加することをお勧めしますint xmlをビルドする際にエラーが発生しました。これはAndroidのifタスクが要素を必要とし、ant-contribのifタスクがそれをサポートしないためです。 Androidのビルドファイルは変更できないため、すべての場所でAndroidのifタスクを使用する必要があります。 Jack

+0

ディレクトリをどのように変更するかビルド/? – Jason

1

可能な限り遅く、パッケージ名を置き換えるのが最も簡単な方法です。この方法では、コードに触れる必要はありません。いい記事はRenaming the Android Manifest packagehttp://www.piwai.info/renaming-android-manifest-package/)です。概要:

  • あなたはAntビルド・プロセスの一部であるように、パッケージ名の置き換えをしたい場合、あなたは-package-resourcesターゲットを上書きすることができ、

  • 代わりにパッケージ名を変更するためにaapt --rename-manifest-packageを使用することができます。

    • manifestpackageパラメータを追加SDKのbuild.xml
    • から-package-resourcesターゲットをコピー
関連する問題