2013-06-24 27 views
11

Tôi đang cố gắng sử dụng công cụ tùy chỉnh để đóng gói lại ứng dụng Android của mình. Tôi muốn tạo một phiên bản beta nội bộ mà tôi có thể cài đặt song song với ứng dụng sản xuất của mình.Thay đổi tên gói ứng dụng trong bước xây dựng Ant tùy chỉnh

This answer trông giống như chính xác những gì tôi cần, tuy nhiên nó có vẻ không hoạt động.

Dưới đây là bản cập nhật để build.xml của tôi:

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

Chạy có vẻ như để chạy thành công mã mới của tôi:

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

Tuy nhiên, khi tôi sử dụng APKTool để kiểm tra việc apk, gói tên trong AndroidManifest của tôi chưa được thay đổi thành giá trị mới. Tất cả những gì dường như đã xảy ra là đường dẫn hoạt động tương đối của tôi ". MyActivity" đã được mở rộng đến tên gói ban đầu của tôi.

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

Có ai biết tôi đang làm gì sai không? Tôi đã xem xét tất cả các câu trả lời Stackoverflow khác và hầu hết có vẻ hơi lạc hậu. Tôi đang xây dựng với Android SDK Tools Revision 21.1.0, cho minSdkVersion 8.

Cập nhật: Như @athor nhận xét bên dưới câu trả lời của mình, giả định của tôi về kiểm tra AndroidManifest.xml là sai. Để kiểm tra điều này, bạn thực sự cần phải thử cài đặt nó thay vì xem XML đã biên dịch!

Trả lời

16

Đây là cách tôi làm điều đó (làm việc)

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

Dòng manifestpackage = "$ {app.custompackagename}" là chìa khóa.

+0

Lạ lùng, điều này dường như không hoạt động đối với tôi :-(Các triệu chứng tương tự, APK được tạo, nhưng giải nén nó cho thấy AndroidManifest.xml không có gói mới. Tôi đã thử chạy "ant debug -Dapp .custompackagename = com.example.test ", và tôi đã cố gắng xây dựng bản phát hành quá. Điều này khiến tôi phát điên ... –

+1

Tôi vừa mới giải mã ứng dụng của mình. Packagename trong tệp kê khai không thay đổi. Tôi nghĩ kiến ​​sẽ thay đổi nó theo cách mà does't ảnh hưởng đến tất cả các hàng nhập khẩu, vv trong ứng dụng của bạn. Vì vậy, packagename trong tệp kê khai vẫn giữ nguyên, nhưng tên gói thực tế bị thay đổi.Bạn đã thử cài đặt cả hai phiên bản của ứng dụng cạnh nhau? không thay đổi, bạn sẽ không thể – athor

+0

Oh wow, bạn nói đúng - nó cài đặt tốt cùng với các APK khác! Tôi khá ngạc nhiên khi nó hoạt động theo cách này ... Cảm ơn! –

1

Nếu bạn thực sự muốn thay đổi để phản ánh trong AndroidManifest.xml của bạn, bạn có thể tạo một mục tiêu tùy chỉnh đó là một cái gì đó như thế này (tôi sử dụng một mục tiêu tương tự như sau bản thân mình):

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

Bạn có thể làm một xây dựng kiến ​​đóng gói lại cho một gói gỡ lỗi, được triển khai và sau đó đóng gói lại cho gói sản xuất (hoặc ngược lại).

+0

cũng cần thêm nếu u sử dụng một cái gì đó như chế độ xem tùy chỉnh trong bố cục hoặc tùy chỉnh attrs –

Các vấn đề liên quan