2010-07-29 20 views
9

मैं एक ऐप को 2 संस्करण, एक पेड, एक फ्री, में बनाना चाहता हूं और मुझे पता है कि एपेट के पास एक विकल्प है "--rename-manifest-package" मदद चाहिए, लेकिन मैं नहीं करता build.xml में इसका उपयोग कैसे करें। मुझे लगता है मैं संशोधित कर सकते हैं 2 जगह मिल:कस्टम एंड्रॉइड build.xml मैनिफेस्ट पैकेज का नाम बदलने के लिए

<!-- first --> 
<target name="-resource-src" depends="-dirs"> 
    <echo>Generating R.java/Manifest.java from the resources...</echo> 
    <exec executable="${aapt}" failonerror="true"> 
     <arg value="package" /> 
     <arg line="${v.option}" /> 
     <arg value="-m" /> 
     <arg value="-J" /> 
     <arg path="${gen.absolute.dir}" /> 
     <arg value="-M" /> 
     <arg path="AndroidManifest.xml" /> 
     <arg value="-S" /> 
     <arg path="${resource.absolute.dir}" /> 
     <arg value="-I" /> 
     <arg path="${android.jar}" />  
    </exec> 
</target> 



<!-- sencod --> 
<target name="-package-resources"> 
    <echo>Packaging resources</echo> 
    <aaptexec executable="${aapt}" 
      command="package" 
      manifest="AndroidManifest.xml" 
      resources="${resource.absolute.dir}" 
      assets="${asset.absolute.dir}" 
      androidjar="${android.jar}" 
      outfolder="${out.absolute.dir}" 
    basename="${ant.project.name}" > 
</aaptexec> 
</target> 

इस लेख (http://blog.uncommons.org/2010/07/19/building-two-versions-of-the-same-android-app/) ने कहा कि मैं दूसरे स्थान पर "--rename-प्रकट-पैकेज" जोड़ने चाहिए, लेकिन कैसे?

+1

आप इसके बजाय एंड्रॉइड लाइब्रेरी प्रोजेक्ट का उपयोग करने पर विचार करना चाहेंगे: http://developer.android.com/guide/developing/eclipse-adt.html#libraryProject – CommonsWare

+0

मुझे यहां समाधान मिला: http://stackoverflow.com/ प्रश्न/17287018/बदलते-एप्लिकेशन-पैकेज-नाम-इन-कस्टम-चींटी-बिल्ड-चरण –

उत्तर

8

विकल्प --rename-manifest-package का उपयोग एपटेक्सैक चींटी कार्य के साथ नहीं किया जा सकता है। यह एक ऐसा विकल्प है जिसे सीधे एएपी निष्पादन योग्य पर जाना होगा;

<exec executable="${aapt}" failonerror="true"> 
    <arg value="package" /> 
    <arg value="-f" /> 
    <arg value="-v" /> 
    <arg value="--version-code" /> 
    <arg value="${version.code}" /> 
    <arg value="--debug-mode" /> 
    <arg value="-M" /> 
    <arg path="AndroidManifest.xml" /> 
    <arg value="-A" /> 
    <arg path="${asset.absolute.dir}" /> 
    <arg value="-I" /> 
    <arg path="${android.jar}" /> 
    <arg value="-F" /> 
    <arg path="${out.absolute.dir}/${resource.package.file.name}" /> 
    <arg value="-S" /> 
    <arg path="${resource.absolute.dir}" /> 
    <arg value="--rename-manifest-package" /> 
    <arg value="com.example.pro" /> 
</exec> 

मैं एक फ़ाइल है कि वास्तव में जिस तरह से ग्रहण बनाता बदलता है संपादन का कोई रास्ता नहीं मिला। तो मैंने build.xml में कोड का वह टुकड़ा डाल दिया, इसे प्रोजेक्ट रूट में रखा, और कंसोल से टाइप करके बनाया;

ant debug 

और यदि आप किसी भी पुस्तकालय पर निर्भर करते हैं, तो उन्हें पैकेजिंग में भी जाना होगा। अपनी default.properties फ़ाइल में देखें और आप lib के संदर्भ देखेंगे। फिर इसे उपरोक्त नियम में जोड़ें, इस तरह;

<arg value="-S" /> 
<arg path="${android.library.reference.1}/res" /> 

यह एक हैक की तरह अधिक से अधिक महसूस करना शुरू कर देता है जो किसी भी प्लेटफॉर्म एसडीके अपडेट के साथ तोड़ सकता है।

+0

2.3 एसडीके में अपडेट करना पूरी बात को मारता है ... बहुत दुखी ... लेकिन अभी भी आपके उत्तर –

+0

के लिए धन्यवाद 2.3 चल रहा है और यह काम कर रहा है। –

+0

मैं पुष्टि करता हूं कि यह एक साधारण उदाहरण का उपयोग करके एसडीके के वर्तमान (आर 12) संस्करण के साथ काम करता है। ध्यान दें कि जिस लक्ष्य को ओवरराइड करने की आवश्यकता है वह "-पैकेज-संसाधन" है। यह है: ' पैकेजिंग संसाधन BoD

2

manifestpackage चींटी कार्य के लिए option "--rename-manifest-package" के लिए आर्ग मूल्य है। अपने ऐप के लिए अलग-अलग पैकेज बनाने के लिए इसका इस्तेमाल करें। चींटी स्क्रिप्ट

+0

मैं थोड़ी देर में हूं, और नहीं देख रहा हूं यह अभी तक करो ... सिर्फ उत्सुक था। क्या कोई इस विधि की पुष्टि कर सकता है? –

+0

हां, manifestpackage विशेषता r17 में पेश की गई थी - देखें [लिंक] (https://android-review.googlesource.com/#/c/32670/) –

2

मैं हाल ही में निर्माण समय किसी ऐप के पैकेज के नाम को बदलने में सक्षम होने की जरूरत से

target name="-package-resources" 

ओवरराइड। जब आपके पास एक ऐप का भुगतान और मुफ़्त संस्करण होता है तो यह एक आम आवश्यकता है। यह भी उपयोगी है अगर आप अपने फोन पर एक ऐप के कई संस्करणों को इंस्टॉल करने में सक्षम होना चाहते हैं, जैसे कि "dev" और "स्थिर" बिल्ड।

ऐसा करने का एक तरीका है संपूर्ण परियोजना को लाइब्रेरी प्रोजेक्ट के रूप में बदलने के लिए, और फिर प्रत्येक संस्करण के लिए एक अंतिम परियोजना बनाएं, जो लाइब्रेरी प्रोजेक्ट पर निर्भर करता है।

AAPT जादू

एक और तरीका है: aapt एक --rename-प्रकट पैकेज पैरामीटर है कि अंतिम APK में द्विआधारी AndroidManifest.xml फ़ाइल के पैकेज के नाम का पुनर्लेखन है।

यहाँ aapt मदद का कहना है:

--rename-manifest-package 
     Rewrite the manifest so that its package name is the package name 
     given here. Relative class names (for example .Foo) will be 
     changed to absolute names with the old package so that the code 
     does not need to change. 

बड़ा फायदा है कि अपने कोड में परिवर्तन नहीं होगा है, अनुसंधान वर्ग समान रहता है।

चींटी

R17 के बाद से, इस विकल्प manifestpackage विशेषता के माध्यम से, aapt चींटी कार्य में उपलब्ध है।

<target name="-package-resources" depends="-crunch"> 
    <do-only-if-not-library elseText="Library project: do not package resources..." > 
    <aapt executable="${aapt}" 
    manifestpackage="com.my.package" 
    > 
... 
    </aapt> 
    </do-only-if-not-library> 
</target> 

Maven

एंड्रॉयड:: आप -package-संसाधनों लक्ष्य, एसडीके build.xml से नकल ओवरराइड करने के लिए की आवश्यकता होगी android-Maven-प्लगइन का apk लक्ष्य एक renameManifestPackage है पैरामीटर।

एक आखिरी बात

आप रनटाइम पर कुछ संसाधन आईडी लोड हैं, तो आप अपना कोड अपडेट करना पड़ सकता है।

मैं यह करने के लिए इस्तेमाल किया:

String packageName = context.getPackageName(); 
Resources res = context.getResources(); 
int id = res.getIdentifier("my_drawable", "drawable", packageName); 

यह आमतौर पर अच्छा काम करता है, विशेष रूप से पुस्तकालय परियोजनाओं जहां पैकेज का नाम पता नहीं है में।

हालांकि, यहां समस्या यह है कि पैकेज नाम को अंतिम रूप से अद्यतन करने से पहले संसाधनों को संसाधित किया गया था। तो पैकेजनाम गलत है।

संसाधनों .getResourcePackageName() के साथ किसी अन्य संसाधन के पैकेज नाम को पुनर्प्राप्त करके, हालांकि यह ठीक करना आसान है।

के दशक में res/values ​​/ ids.xml उदाहरण के लिए एक संसाधन है कि उद्देश्य के लिए समर्पित आईडी बनाने, दो:

<?xml version="1.0" encoding="utf-8"?> 
<resources xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item name="used_for_package_name_retrieval" type="id"/> 
</resources> 

और अब हम सही पैकेज पाने:

Resources res = context.getResources(); 
String packageName = res.getResourcePackageName(R.id.used_for_package_name_retrieval); 
int id = res.getIdentifier("some_drawable", "drawable", packageName); 

निष्कर्ष

यह युक्ति एक ही ऐप के विभिन्न संस्करणों को बनाने में मदद करती है।

+0

आप बेहतरता के लिए लिंक से सारांश प्रदान करेंगे। – VahidNaderi

+1

यहां उल्लिखित आलेख इस टिप्पणी के कारण उपयोगी है कि निर्माण के दौरान पैकेज नाम हर तरह से नहीं बदला जाता है, और विधि resource.getIdentifier() अपेक्षित कार्य नहीं करता है। यदि आप फ़ोनगैप (कोर्वावा) प्रोजेक्ट के लिए एंटी से पैकेज नाम बदलना चाहते हैं तो यह आपको हिट करेगा। –

+0

केवल एक चीज जो मैं जोड़ूंगा वह यह है कि आप custom_rules.xml में अनुकूलन जोड़ सकते हैं जो एंड्रॉइड build.xml आयात – tik27

संबंधित मुद्दे