2013-06-24 8 views
11

Я пытаюсь использовать пользовательскую сборку для переупаковки моего приложения для Android. Я хочу создать внутреннюю бета-версию, которую я могу установить бок о бок с моим производственным приложением.Изменение имени пакета приложения в пользовательском шаге сборки Ant

This answer выглядит как раз то, что мне нужно, однако оно, похоже, не работает.

Вот обновление моей 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> 

Запуск, кажется, успешно запустить свой новый код:

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

Однако, когда я использую APKTool для проверки APK, пакет имя в моем AndroidManifest не было изменено на новое значение. Все, что, похоже, произошло, что мои относительные пути активности «.MyActivity» были расширены до моего исходного имени пакета.

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

Кто-нибудь знает, что я делаю неправильно? Я просмотрел все другие ответы Stackoverflow, и большинство из них немного устарели. Я в здании с Android SDK Tools Revision 21.1.0, для minSdkVersion 8.

Update: Как @athor комментарии ниже его ответ, мое предположение о проверке на AndroidManifest.xml неправильно. Чтобы проверить это, вам действительно нужно попробовать его установить, а не просматривать декомпилированный XML!

ответ

16

Это так, как я это сделать (рабочий)

<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> 

Линия manifestpackage = "$ {app.custompackagename}" является ключевым.

+0

Странно, это, похоже, не работает для меня :-(Те же симптомы, APK создается, но распаковка его показывает, что AndroidManifest.xml не имеет нового пакета. Я попытался запустить ant ant debug -Dapp .custompackagename = com.example.test ", и я попробовал сборку релизов тоже. Это сводит меня с ума ... –

+1

Я просто декомпилировал свое приложение. Пакетное имя в манифесте не меняется. таким образом, который не влияет на все импорт и т. д. в вашем приложении. Таким образом, имя_пакета в манифесте остается прежним, но фактическое имя пакета изменяется. Вы пытались установить обе версии приложения бок о бок? Если имя пакета не изменился, вы не сможете. – athor

+0

О, да, вы правы - он прекрасно устанавливается рядом с другим APK! Я довольно удивлен, что он ведет себя так ... Спасибо! –

1

Если вы действительно хотите, чтобы ваши изменения, чтобы отразить в вашем AndroidManifest.xml, вы можете создать собственную цель, что-то вроде этого (я использую подобную цель это сам):

<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> 

Вы могли бы сделать ant, который был упакован в пакет отладки, развернут, а затем повторно упакован обратно в производственный пакет (или наоборот).

+0

также rty для добавления если вы используете что-то вроде пользовательских представлений в макетах или пользовательские attrs –

Смежные вопросы