Question

I'm trying to use a custom build to repackage my Android app. I want to create an internal beta version which I can install side-by-side with my production app.

This answer looks like exactly what I need, however it doesn't seem to work.

Here's the update to my build.xml:

<target
    name="-package-resources"
    depends="-crunch" >

    <echo>Repackaging AndroidManifest.xml to ${package.manifest.name} ${out.absolute.dir}/${resource.package.file.name}</echo>

    <exec executable="${aapt}" failonerror="true">
        <arg value="package" />
        <arg value="-f" />
        <arg value="--auto-add-overlay" />
        <arg value="-M" />
        <arg path="AndroidManifest.xml" />
        <arg value="-S" />
        <arg path="${resource.absolute.dir}" />
        <arg value="-S" />
        <arg path="${android.library.reference.1}/res" />
        <arg value="-A" />
        <arg path="${asset.absolute.dir}" />
        <arg value="-I" />
        <arg path="${project.target.android.jar}" />
        <arg value="-F" />
        <arg path="${out.absolute.dir}/${resource.package.file.name}" />
        <arg value="--rename-manifest-package" />
        <arg value="${package.manifest.name}" />
    </exec>
</target>

Running it seems to successfully run my new code:

ant debug -Dpackage.manifest.name=com.example.test    
...    
 -package-resources:    
      [echo] Repackaging AndroidManifest.xml to com.example.test /<mypath>/bin/<appname>.ap_
...    
BUILD SUCCESSFUL

However, when I use APKTool to inspect the APK, the package name in my AndroidManifest has not been changed to the new value. All that seems to have happened is that my relative activity paths ".MyActivity" have been expanded to my original package name.

apktool d --force bin/<appname>-debug.apk

Does anybody know what I'm doing wrong? I've looked at all the other Stackoverflow answers and most seem a little out of date. I am building with Android SDK Tools Revision 21.1.0, for minSdkVersion 8.

Update: As @athor comments below his answer, my assumption about inspecting the AndroidManifest.xml is wrong. To test this you actually need to try installing it rather than viewing the decompiled XML!

Was it helpful?

Solution

This is the way I do it (working)

 <target
        name="-package-resources"
        depends="-crunch" >

        <!-- only package resources if *not* a library project -->

        <echo message="Current Package name: ${app.custompackagename}" />

        <do-only-if-not-library elseText="Library project: do not package resources..." >

            <aapt
                androidjar="${project.target.android.jar}"
                apkfolder="${out.absolute.dir}"
                assets="${asset.absolute.dir}"
                buildType="${build.target}"
                command="package"
                debug="${build.is.packaging.debug}"
                executable="${aapt}"
                ignoreAssets="${aapt.ignore.assets}"
                libraryPackagesRefid="project.library.packages"
                libraryRFileRefid="project.library.bin.r.file.path"
                libraryResFolderPathRefid="project.library.res.folder.path"
                manifest="${out.manifest.abs.file}"
                manifestpackage="${app.custompackagename}"
                nocrunch="${build.packaging.nocrunch}"
                previousBuildType="${build.last.target}"
                resourcefilename="${resource.package.file.name}"
                resourcefilter="${aapt.resource.filter}"
                versioncode="${version.code}"
                versionname="${version.name}" >

                <res path="${out.res.absolute.dir}" />

                <res path="${resource.absolute.dir}" />
                <!-- <nocompress /> forces no compression on any files in assets or res/raw -->
                <!-- <nocompress extension="xml" /> forces no compression on specific file extensions in assets and res/raw -->
            </aapt>
        </do-only-if-not-library>
    </target>

The line manifestpackage="${app.custompackagename}" is the key.

OTHER TIPS

If you really want your changes to reflect in your AndroidManifest.xml, you could create a custom target that's something like this (I use a similar target to this myself):

<target name="repackage">
    <!-- Replaces all of the references to the old package name in files in the "src" directory -->
    <replace dir="src" value="${new.package}" token="${old.package}" summary="true"/>

    <!-- renames the src folders -->
    <move toDir="${new.package.dir}">
        <fileset dir="${old.package.dir}"/>
    </move>

    <!-- replaces the package name in the manifest -->
    <replace file="AndroidManifest.xml" value="${new.package}" token="${old.package}" summary="true"/>
</target>

You could do an ant build that repackaged to a debug package, deployed, and then repackaged back to the production package (or vice versa).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top