14

私はオープンソースプロジェクトに取り組んでいます。誰でもソースをダウンロードして自分でビルドできるようにするため、ディレクトリ構造を含め、どこにもパッケージ名をハードコーディングしたくありません。

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

現在、Git リポジトリから直接コードをビルドするプロセスはかなり単純です。READMEファイルからの抜粋は次のとおりです。

$ 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私にとっては、パッケージ名をに入れるのは理にかなっています.gitignore。パッケージ名はどこにもないため、これを行わないとビルドは失敗します。そのため、 には少なくとも 1 つの余分なステップが必要READMEですが、最小限に抑えたいと考えています。

編集:もちろん、別の要件は差分が意味を成すことです-パッケージ名を手動で名前変更した場合は意味がありません。

4

3 に答える 3

20

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="@CONFIG.APP_PACKAGE_NAME@"
      android:versionCode="@CONFIG.APP_VERSION_CODE@"
      android:versionName="@CONFIG.APP_VERSION@">


<!-- EVERYTHING ELSE GOES HERE -->


</manifest>

次に、通常のベアボーン build.xml ant スクリプトをいくつか変更するだけで使用できます (車輪を再発明せずに使用できるようにいくつかのフックが追加されているため、Android ビルド システムからスクリプト全体をコピーする必要はありません)。ビルド スクリプトは、デフォルトで local.properties を読み取る必要がありますが、そうでない場合は、次のような行を追加 (またはコメント解除) します。

<property file="local.properties" />

ビルド スクリプトに「-pre-build」というタスクが表示されます。次のように変更します。

<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

マニフェストで、すべてのアクティビティ/サービス/ブロードキャスト リスナーなどを完全に修飾する必要があるだけです。つまり、常にソース コードの完全なパッケージを指定します。独自のソース コードのパッケージを動的にしたい場合は、各クラスの各プレフィックスを置き換えることができます..プロジェクトにソースまたは jar を含めるだけで、任意のプロジェクトから使用できます。

-- 更新 -- パッケージ名を定義する必要があることをユーザーに通知するためにできるもう 1 つのことは、ビルド xml で次のように失敗タグを使用することです。

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

local.properties ファイルを読み取る行の後にこれを置きます

于 2012-05-13T06:59:50.987 に答える
7

Matt Wolfe の助けに感謝し、これまでの努力で部分的な回答を投稿しています。

build.xmlデフォルトのベアボーンもインポートすることに気付きましたcustom_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>

これにより、すべてがセットアップされますbuild/ (これには、物事をきちんと整頓しておくという追加のボーナスがあります)。現在の目的は、sdk ツールをこのディレクトリbuild.xmlから実行することです。build/しかし、私は「する」方法を見つけることができませんcd

于 2012-05-13T17:59:51.483 に答える
1

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

  • aapt --rename-manifest-packageパッケージ名を変更するために使用できます

  • または、パッケージ名の置換を ant ビルド プロセスの一部にしたい場合は、-package-resourcesターゲットをオーバーライドできます。

    • -package-resourcesSDK の build.xml からターゲットをコピーします
    • manifestpackageパラメータを追加
于 2014-04-08T12:45:45.443 に答える