গ্রেডল ব্যবহার করে কীভাবে একটি রিলিজ স্বাক্ষরিত এপিপি ফাইল তৈরি করবেন?


514

গ্র্যাডল ব্যবহার করে একটি রিলিজ স্বাক্ষরিত এপিপি ফাইল তৈরি করতে আমার গ্রেডল বিল্ড করতে চাই।

আমি কোডটি সঠিক কিনা তা নিশ্চিত নই বা করছি যখন আমি কোনও পরামিতি মিস করছি gradle build?

এটি আমার গ্রেড ফাইলের কিছু কোড:

android {
    ...
    signingConfigs {
          release {
              storeFile file("release.keystore")
              storePassword "******"
              keyAlias "******"
              keyPassword "******"
         }
     }
}

গ্রেড বিল্ডটি সফলভাবে শেষ করে এবং আমার build/apkফোল্ডারে আমি কেবল ফাইল ...-release-unsigned.apkএবং ...-debug-unaligned.apkফাইলগুলি দেখতে পাই ।

এটি সমাধান করার জন্য কোনও পরামর্শ?



গ্রেড ফাইল থেকে ভি 1 (জার স্বাক্ষর) বা ভি 2 (পূর্ণ এপিকে স্বাক্ষর) সংস্করণ দিয়ে সাইন ইন করবেন? এখানে সমাধান: stackoverflow.com/questions/57943259/...
user1506104

উত্তর:


429

পূর্ববর্তী উত্তরের চেয়ে সহজ উপায়:

এটি রাখুন ~/.gradle/gradle.properties

RELEASE_STORE_FILE={path to your keystore}
RELEASE_STORE_PASSWORD=*****
RELEASE_KEY_ALIAS=*****
RELEASE_KEY_PASSWORD=*****

আপনার সংশোধন করুন app/build.gradle, এবং android {কোড ব্লকের ভিতরে এটি যুক্ত করুন :

...    
signingConfigs {

   release {
       storeFile file(RELEASE_STORE_FILE)
       storePassword RELEASE_STORE_PASSWORD
       keyAlias RELEASE_KEY_ALIAS
       keyPassword RELEASE_KEY_PASSWORD

       // Optional, specify signing versions used
       v1SigningEnabled true
       v2SigningEnabled true
   }
}

buildTypes {
        release {
            signingConfig signingConfigs.release
        }
}
....

তাহলে আপনি চালাতে পারেন gradle assembleRelease


signingConfigsগ্রেডেল ডিএসএল এর জন্য রেফারেন্সও দেখুন


12
আপনি আমাকে জিজ্ঞাসা যদি সেরা পদ্ধতি। আমার প্রকল্প ফোল্ডারে / এসভিএন-তে কিছুই সংরক্ষণ করে না এবং আমি কীগুলির বিষয়ে চিন্তা না করেই আমার প্রকল্পের 10 টি সংস্করণ চেকআউট করতে পারি।
ফ্র্যাঙ্ক

8
আপনি যদি উইন্ডোজে গ্রেডলিউ ব্যবহার করেন তবে আপনার অবশ্যই নিশ্চিত হওয়া উচিত যে এই কাজটি করার জন্য GRADLE_USER_HOME পরিবেশের পরিবর্তনশীল হিসাবে সংজ্ঞায়িত হয়েছে। আমি এটিকে আমার প্রকল্প ডিরেক্টরিতে উপরে একটি ডিরেক্টরিতে রেখেছি এবং আমার কীস্টোরটি সেখানে রেখেছি। গ্রেডলে.প্রপ্রেটিসে আপনার কীস্টোরের পথটিতে উইন্ডোজ সিঙ্গল ব্যাকস্ল্যাশ নয়, ফরোয়ার্ড স্ল্যাশ (/) বা ডাবল ব্যাকস্ল্যাশ (\\) ব্যবহার করা উচিত। উইন্ডোজ কমান্ড প্রম্পট থেকে কীস্টোর তৈরি করতে, stackoverflow.com/questions/3997748/how-can-i-create-a-keystore দেখুন
অ্যানক্রোননিস্ট

3
বিল্ড.gradle ফাইলটি যেখানে অবস্থিত সেগুলির সাথে সম্পর্কিত, বা মেশিনের রুট ডিরেক্টরি সম্পর্কিত to
প্রেম

1
@ প্রেমে file()সর্বদা আপেক্ষিক পথ ধরে থাকে। new File(path)আপনি যদি এটিকে নিখুঁত হিসাবে বিবেচনা করতে চান তবে ব্যবহার করুন ।
আরস-লঙ্গা-ভিটা-ব্রাভিস

4
এটি আমার এবং সহজতমদের জন্য কাজ করেছিল। গ্রেডলে.প্রপ্রেটিসগুলিতে আপনার মডিউল বিল্ডড্র্যাডেলের তুলনায় স্টোরফিল নির্দিষ্ট করে RELEASE_STORE_FILE = .. / মাইকিস্টোর specify উদ্ধৃতিগুলি যোগ করুন না অন্য দিকে গ্রেডের পথটি
লক্ষ্মণ চিলুকুরি

263

আমি এই কোডটি যুক্ত করে এটির সমাধান করে পরিচালনা করেছি এবং এর সাথে বিল্ডিং করছি gradle build:

android {
    ...
    signingConfigs {
        release {
            storeFile file("release.keystore")
            storePassword "******"
            keyAlias "******"
            keyPassword "******"
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
}

এটি একটি স্বাক্ষরিত রিলিজ apk ফাইল উত্পন্ন করে।


33
এটি আমাকে পাসওয়ার্ডগুলির জন্য অনুরোধ করার কোনও উপায় আছে? বা পাসওয়ার্ডগুলি আমার গিট রেপোর বাইরে রাখার জন্য অন্যান্য পরামর্শ?
ব্যবহারকারী 672009

3
আমি আমার বিল্ডএগ্রাডলটিকে আপনার মতো দেখতে সম্পাদনা করি তবে "বিল্ট> স্বাক্ষরিত এপিডে জেনারেট করুন ..." চালানো এখনও আমার সেই ডায়লগটি দেয় ("আরও তথ্যের জন্য গ্রেডল ব্যবহারকারী গাইড দেখুন" "ইত্যাদি) এবং কোনও এপিপি নেই।
সেমেন্টার

3
@ সিমেন্টার এক্সিকিউট করুন gradle buildবা gradlew buildটার্মিনাল / প্রম্পট কমান্ডে
ফিলিপ

12
@ ইউজার 672009 আপনি কোনও বৈশিষ্ট্য ফাইলে পাসওয়ার্ড রাখতে পারেন এবং এটি .gitignore সহ রেপো থেকে বাদ দিতে পারেন। আপনি এই লিঙ্কটি দেখতে পারেন। gist.github.com/gabrielemariotti/6856974
গ্যাব্রিয়েল

1
@ গ্যাব্রেইলিয়ারিওটি ​​এখনও এটি একটি অসম্পূর্ণ সংগ্রহস্থল ছেড়ে যায়। একটি ভাল কঙ্কাল সাইন ইন.প্রোপার্টি তৈরি করা এবং "গিট আপডেট-ইনডেক্স - অ্যাসেমমেন্ট-অপরিবর্তিত সাইন ইন.প্রোপার্টি" প্রদান করার পরে আরও ভাল উপায় হ'ল। তবে এটি ফিউটুর সম্পাদনাগুলি প্রতিশ্রুতিবদ্ধ হতে বাধা দেয়। প্রথম বিকল্প sdqali এর মত কিছু আরও ভাল বলে মনে হয়।
ব্যবহারকারী 672009

67

নোট করুন যে @ এসডাকালির স্ক্রিপ্টটি (কমপক্ষে গ্রেডল ১.6 ব্যবহার করার সময়) আপনি যে কোনও গ্রেড টাস্কের জন্য আবেদন করলে যে কোনও সময় পাসওয়ার্ড জানতে চাইবে । যেহেতু আপনার কেবল এটির প্রয়োজন হয় gradle assembleRelease(বা অনুরূপ) তাই আপনি নিম্নলিখিত কৌশলটি ব্যবহার করতে পারেন:

android {
    ...
    signingConfigs {
        release {
            // We can leave these in environment variables
            storeFile file(System.getenv("KEYSTORE"))
            keyAlias System.getenv("KEY_ALIAS")

            // These two lines make gradle believe that the signingConfigs
            // section is complete. Without them, tasks like installRelease
            // will not be available!
            storePassword "notYourRealPassword"
            keyPassword "notYourRealPassword"
        }
    }
    ...
}

task askForPasswords << {
    // Must create String because System.readPassword() returns char[]
    // (and assigning that below fails silently)
    def storePw = new String(System.console().readPassword("Keystore password: "))
    def keyPw  = new String(System.console().readPassword("Key password: "))

    android.signingConfigs.release.storePassword = storePw
    android.signingConfigs.release.keyPassword = keyPw
}

tasks.whenTaskAdded { theTask -> 
    if (theTask.name.equals("packageRelease")) {
        theTask.dependsOn "askForPasswords"
    }
}

নোট করুন যে এটিকে কাজ করতে আমাকে নিম্নলিখিতগুলি (অ্যান্ড্রয়েডের অধীনে) যোগ করতে হয়েছিল:

buildTypes {
    release {
        signingConfig signingConfigs.release
    }
}

এটি বাস্তবায়নের পরে, installReleaseকার্যগুলির তালিকা থেকে অদৃশ্য হয়ে গেল ... কেন?
কারেল

1
@ ক্যাসপেসে আশা করি আমি সেই জাল "স্টোরপ্যাসওয়ার্ড" এবং "কীপ্যাসওয়ার্ড" সম্পর্কে আপনার মন্তব্যটি আরও গুরুত্বের সাথে নিয়েছি। এই বৈশিষ্ট্যগুলি (উদাহরণস্বরূপ) আরম্ভ না করে ("" উদাহরণস্বরূপ) স্বাক্ষরিত * -reLive.apk তৈরি করা হয়নি, কোনও ত্রুটি প্রদর্শিত হবে না এবং আপনার প্রোজেইসিএল / বিল্ড / এপিকে / ডিরেক্টরিতে কেবল * -রিলেজ-স্বাক্ষরিত.এপকে দিয়ে সম্পূর্ণ বিস্মিত হয়ে গেছে left । মানুষ ...: /
vizZ

বিল্ডটাইপস -> প্রকাশের অধীনে SignConfig যোগ করার বিষয়ে নোটের জন্য ধন্যবাদ Thanks এটি আমার জন্য স্বয়ংক্রিয় স্বাক্ষর সমাধান!
mm2001

1
আমি একটি সহজ গ্রেড প্লাগইন তৈরি করেছি যা রিলিজ এপিপি তৈরি করার সময় পাসওয়ার্ডগুলির জন্য জিজ্ঞাসা করে (এই পোস্টে বর্ণিত ম্যাথটি ব্যবহার করে, তবে আপনাকে জাল স্টোরপাসওয়ার্ড এবং কীপ্যাসওয়ার্ড সংজ্ঞায়নের প্রয়োজন হবে না)। এটি মাভেন সেন্ট্রালেও পাওয়া যায়। github.com/alexvasilkov/AndroidGradleSignPlugin
অ্যালেক্স

এটা অসাধারণ. সাবধান থাকুন যে পরিবেশের পরিবর্তনশীলটিকে KEYSTOREএমনকি ডিবাগ বিল্ডগুলির জন্য এবং অ্যান্ড্রয়েড স্টুডিওতে "গ্রেডল সিঙ্ক" এর জন্যও সংজ্ঞায়িত করা দরকার, অন্যথায় এটি পথটি শূন্য হওয়ার বিষয়ে ত্রুটি দেবে।
জেরি 101

63

আপনি আপনার কীস্টোর & পাসওয়ার্ড hardcoding এড়াতে চান তাহলে build.gradle , আপনি একটি বৈশিষ্ট্য ফাইল হিসাবে এখানে ব্যাখ্যা ব্যবহার করতে পারেন: হ্যান্ডলিং সাইন ইন করার configs সঙ্গে GRADLE

মূলত:

1) / home/mittedusername +/ এ একটি মাইপ্রজেক্ট.প্রোপার্টি ফাইল তৈরি করুন such এই জাতীয় সামগ্রীতে সাইন ইন করে:

keystore=[path to]\release.keystore
keystore.password=*********
keyAlias=***********
keyPassword=********

2) বিষয়বস্তু সহ গ্রেডেল.প্রপার্টি ফাইল (সম্ভবত আপনার প্রকল্প ডিরেক্টরিটির মূলের দিকে) তৈরি করুন:

MyProject.properties=/home/[username]/.signing/myproject.properties

3) এটির মতো আপনার বিল্ডপ্রেডগুলিতে এটি উল্লেখ করুন :

    if(project.hasProperty("MyProject.properties")
        && new File(project.property("MyProject.properties")).exists()) {

    Properties props = new Properties()
    props.load(new FileInputStream(file(project.property("MyProject.properties"))))

    signingConfigs {
        release {
            storeFile file(props['keystore'])
            storePassword props['keystore.password']
            keyAlias props['keyAlias']
            keyPassword props['keyPassword']
        }
    }
}

1
দুর্দান্ত কাজ! ধন্যবাদ. এই কোডটি বিল্ডটাইপস} বিভাগের আগে অবশ্যই যুক্ত করা উচিত এবং বিভাগটি অবশ্যই SignConfig SignConfigs.rere স্বাভাবিক হিসাবে ঘোষণা করতে হবে।
নভেম্বর

অবশেষে আমি এই সমস্যার সমাধান খুঁজে পেয়েছি। সত্যিই আমাকে সাহায্য করেছিল এমন একমাত্র জিনিস! এটি গ্রহণযোগ্য উত্তর
হ'ল

39

গিট ব্যবহার করার সময় গ্র্যাডলের সাথে স্বয়ংক্রিয় অ্যাপ্লিকেশন স্বাক্ষরকরণ

এটি করার জন্য কতগুলি বিভক্ত পদ্ধতি রয়েছে তা আশ্চর্যজনক। এখানে আমার নিজস্ব উপায়, যেখানে আমি গুগলসের নিজস্ব সুপারিশ মেনে চলার চেষ্টা করি । তবে তাদের ব্যাখ্যা পুরোপুরি পরিষ্কার নয়, তাই আমি লিনাক্সের পদ্ধতিটি বিস্তারিতভাবে বর্ণনা করব।


বর্ণনা:

ডিফল্ট গুগল নির্দেশাবলীআপনার অ্যাপ্লিকেশন বিকাশের (জিআইটি) পথে পাসওয়ার্ড এবং স্বাক্ষর ফাইলগুলি না রেখে বিল্ড করার সময় কোনও অ্যাপ্লিকেশনটিতে স্বয়ংক্রিয়ভাবে স্বাক্ষর করার জন্য বরং অস্পষ্ট। কীভাবে এটি করা যায় তা এখানে ধাপে ধাপে ধাপে নির্দেশাবলী instructions

প্রাথমিক অনুমান:

নিম্নলিখিত পথ দ্বারা প্রদত্ত একটি ডিরেক্টরিতে আপনার কাছে "মাই অ্যাপ" নামে একটি অ্যাপ রয়েছে $HOME/projects/mydev/MyApp। যাইহোক, মাই অ্যাপ্লিকেশন ডিরেক্টরিটি জিআইটি দিয়ে ব্যবহৃত এবং নিয়ন্ত্রণ করা হয়।

এখানে চিত্র বর্ণনা লিখুন

সমস্যা

আমরা স্বাক্ষর বা পাসওয়ার্ড ফাইলগুলি জিআইটি নিয়ন্ত্রিত ডিরেক্টরিতে কোথাও রাখতে চাই না, এমনকি যদি আমরা ব্যবহার করতে সক্ষম হয়ে থাকি .gitignore ইত্যাদি তবে এটি এখনও খুব ঝুঁকিপূর্ণ এবং ভুল হওয়া সহজ। সুতরাং আমরা আমাদের কীস্টোর এবং স্বাক্ষরের ফাইলগুলি বাইরে চাই।

সমাধান

আমাদের তিনটি (3) জিনিস করা দরকার:

  1. অ্যান্ড্রয়েড স্টুডিও দ্বারা ব্যবহার করার জন্য একটি পাসওয়ার্ড ফাইল তৈরি করুন
  2. স্বাক্ষর কী ফাইল তৈরি করুন
  3. build.gradle(1) এবং (2) ব্যবহারের জন্য মডিউল ফাইল সম্পাদনা করুন ।

এই উদাহরণের জন্য আমরা দুটি ফাইলের নামকরণ করেছি:

  1. keystore.properties
  2. MyApp-release-key.jks

আমরা এই দুটি ফাইল এখানে রাখতে পারি:

cd $HOME/projects/mydev/

(1) কীস্টোর পাসওয়ার্ড ফাইল তৈরি করুন

প্রথম ফাইলটিতে স্পষ্ট পাঠ্য পাসওয়ার্ড ব্যবহার করা হয়েছে; এবং রিলিজ-কী ফাইলের পথে (2)) এটিকে পূরণ করে শুরু করুন, কারণ এটি পরবর্তী পদক্ষেপের জন্য একটি অনুলিপি পেস্ট পরিচালনা সহজতর করবে।

cd $HOME/projects/mydev/

সম্পাদনা করুন keystore.propertiesযাতে এটি সামগ্রী হয়:

storePassword=myStorePassword
keyPassword=mykeyPassword
keyAlias=myKeyAlias
storeFile=myStoreFileLocation

এখানে শুধুমাত্র জটিল অংশ, হয় myStoreFileLocation। বিল্ড চলাকালীন এটি মডিউল ফাইল থেকে দেখা পথ build.gradle। সাধারণত তাদের পথ অনুরূপ এবং আপেক্ষিক অর্থ: $HOME/projects/mydev/MyApp/app/build.gradleMyApp-release-key.jks ফাইলটি নির্দেশ করার জন্য , আমাদের এখানে যা রাখা দরকার তা হ'ল:

../../../MyApp-release-key.jks

এখানে, আমরা কীটির জন্য "মাই্যাপ" নামটিও বেছে নিয়েছি। তারপরে চূড়ান্ত ফাইলটি দেখতে হবে:

storePassword=myStorePassword
keyPassword=mykeyPassword
keyAlias=myapp
storeFile=../../../MyApp-release-key.jks

(2) স্বাক্ষর ফাইল তৈরি করুন

আপনি স্বাক্ষর কী তৈরি করলে দ্বিতীয় ফাইলটি স্বয়ংক্রিয়ভাবে উত্পন্ন হয়। আপনার যদি অন্য কোনও অ্যাপস না থাকে এবং এটি আপনার একমাত্র কীস্টোর, তবে ফাইলটি তৈরি করুন:

cd $HOME/projects/mydev/
keytool -genkeypair -v -keystore MyApp-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias myapp

এটি আপনাকে দুটি পাসওয়ার্ড এবং একগুচ্ছ তথ্যের জন্য জিজ্ঞাসা করবে। (অ্যান্ড্রয়েড স্টুডিওতে একই জিনিস।) এখন আপনার পূর্বনির্ধারিত পাসওয়ার্ডগুলি অনুলিপি / আটকান।

(3) উপরেরটি gradle.buildব্যবহার করতে আপনার মডিউল ফাইলটি সম্পাদনা করুন

নিম্নলিখিত অ্যাপ্লিকেশনগুলিকে আপনার অ্যাপ্লিকেশন / মডিউলের গ্রেডল বিল্ড ফাইলটিতে উপস্থিত করা দরকার। প্রথমে আপনার ব্লকের বাইরে এবং এর আগে নিম্নলিখিত লাইনগুলি যুক্ত করুন android {}

//def keystorePropertiesFile = rootProject.file("$HOME/.android/keystore.properties")
def keystorePropertiesFile = rootProject.file("../../keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

তারপর, ভিতরেandroid {} ব্লক, যোগ করুন:

android {
    ...
    defaultConfig { ... }
    signingConfigs {
            release {
                keyAlias keystoreProperties['keyAlias']
                keyPassword keystoreProperties['keyPassword']
                storeFile file(keystoreProperties['storeFile'])
                storePassword keystoreProperties['storePassword']
            }
        }
    // Tell Gradle to sign your APK
    buildTypes {
        release {
            signingConfig signingConfigs.release
            ...
        }
    }
}

শেল থেকে এখন আপনি নিজের অ্যাপ্লিকেশনটি এটি দিয়ে পুনরায় তৈরি করতে পারবেন:

cd $HOME/projects/mydev/MyApp/app/
./gradlew clean build

এটি গুগল প্লেতে ব্যবহার করা যেতে পারে এমন একটি সঠিকভাবে স্বাক্ষরিত অ্যাপ্লিকেশন তৈরি করা উচিত।


আপডেট: 2019-04-02

আরও সাম্প্রতিক সংস্করণ keytoolএবং কিছু আপনাকে বলছে যে আপনি উপরে / পিডিএসসিএস 12 ভিত্তিক কীফিলটি ব্যবহার করবেন যা আমি উপরে ব্যবহার করব। তারপরে তারা আপনাকে বলছে যে আপনার নতুন ওপেন পিকেসিএস 12 ফর্ম্যাটে রূপান্তর করা উচিত। তবে, দেখে মনে হচ্ছে অ্যান্ড্রয়েড বিকাশ সরঞ্জামগুলি এখনও এর জন্য পুরোপুরি প্রস্তুত নয়, কারণ যদি আপনি এটি করেন তবে আপনি নিম্নলিখিত অদ্ভুত ত্রুটি পাবেন:

com.android.ide.common.signing.KeytoolException:"F: \ XXX \ XXX.jks" স্টোর থেকে কী কীএক্সএক্সএক্সএক্সটি পড়তে ব্যর্থ: কী পান ব্যর্থ: চূড়ান্ত ব্লকটি সঠিকভাবে প্যাডড নয় Give ডিক্রিপশন চলাকালীন কোনও খারাপ কী ব্যবহার করা হলে এই জাতীয় সমস্যা দেখা দিতে পারে।

সুতরাং একটি রূপান্তরিত কী ব্যবহার করবেন না!


SignConfigs এপিপির ভিতরে সংরক্ষণ করা হয়েছে এবং তারপরে পাসওয়ার্ড পেতে এটি কোনও ব্যবহারকারী দ্বারা দ্রবীভূত করা যেতে পারে বা এটি এপিকে প্রদর্শিত হয় না?
জাভিয়েরসেগোভিয়া কর্ডোবা

2
মোহন মত কাজ করে। ধন্যবাদ আপনাকে এই গৃহীত উত্তর হওয়া উচিত
প্রথম কেশারকর

আপনি যদি কেবল কোনও বিল্ড সার্ভারে কীস্টোর এবং পাসওয়ার্ড চান? টিমের প্রতিটি বিকাশকারীকে উপরের সমাধানের সাথে লোকাল মেশিনে কীস্টোর থাকা দরকার। অন্যথায় গ্রেডল প্রকল্প সিঙ্কটি ব্যর্থ হবে: কীস্টোর.প্রেপার্টি (এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই)।
ডায়ানা ফারিন

1
আপনি keystore.propertiesউত্স নিয়ন্ত্রণে একটি ডামি ফাইল প্রতিশ্রুতিবদ্ধ করতে পারেন , তাই ডেভ মেশিনে কাজ তৈরি করে। আমি এখানে একটি বিল্ড সার্ভার সেটআপ বর্ণনা করেছি ।
dskrvk

1
সম্পর্কে আপনার সর্বশেষ আপডেট একটি নোট keytoolএকটি PKCS12 কীস্টোর উৎপাদিত: আপনি পাস করতে পারেন -storetype JKSমধ্যে keytoolJKS যা অ্যান্ড্রয়েড সাধনী দ্বারা প্রয়োগকরণ প্রয়োজন হয় কীস্টোর টাইপ সেট করতে কমান্ড।
ট্রেভর হালভারসন

35

@ ডেস্টিলের মতো বলেছে তবে অন্যদের যাদের নির্মাণের চাবিকাঠি নেই তাদের অনুমতি দিন: আগের উত্তরের চেয়ে সহজ উপায়:

এটি রাখুন ~/.gradle/gradle.properties

RELEASE_STORE_FILE={path to your keystore}
RELEASE_STORE_PASSWORD=*****
RELEASE_KEY_ALIAS=*****
RELEASE_KEY_PASSWORD=*****

আপনার build.gradleমত এটি সংশোধন করুন :

...    
if(project.hasProperty("RELEASE_STORE_FILE")) {
    signingConfigs {    
       release {
           storeFile file(RELEASE_STORE_FILE)
           storePassword RELEASE_STORE_PASSWORD
           keyAlias RELEASE_KEY_ALIAS
           keyPassword RELEASE_KEY_PASSWORD
       }
    }
}

buildTypes {
    if(project.hasProperty("RELEASE_STORE_FILE")) {
        release {
            signingConfig signingConfigs.release
        }
    }
}
....

তারপরে আপনি gradle assembleRelease ওআর চালাতে পারেনgradle build


উইন্ডোজগুলিতে কীভাবে পথ নির্ধারণ করবেন: আপনার
কীস্টোরের

storeFile ফাইল ("সি: \\ ব্যবহারকারী \\ xxxx \\ নথি \\ yyyy \\ mykey.jks") ঠিক আছে কি?
রেজা_খালাফি

28

( ব্যবহারকারী 672009 এর উত্তরে উপরের ।)

এর থেকেও সহজ সমাধান, আপনি যদি নিজের পাসওয়ার্ডগুলি গিট সংগ্রহস্থলের বাইরে রাখতে চান; তবুও, এতে আপনার বিল্ড.gradle অন্তর্ভুক্ত করতে চান, এমনকি এটি পণ্য স্বাদে দুর্দান্ত কাজ করে তা হল পৃথক গ্রেড ফাইল তৈরি করা। আসুন একে 'Signing.gradle' বলুন (এটি আপনার .gitignore এ অন্তর্ভুক্ত করুন)। ঠিক যেমন এটি আপনার বিল্ড.gradle ফাইল মাইনাস এতে সাইন ইন সম্পর্কিত নয়।

android {
    signingConfigs { 
        flavor1 {
            storeFile file("..")
            storePassword ".."
            keyAlias ".."
            keyPassword ".."
        }
        flavor2 {
            storeFile file("..")
            storePassword ".."
            keyAlias ".."
            keyPassword ".."
        }
    }
}

তারপরে আপনার বিল্ড.gradle ফাইলটিতে "প্রয়োগ প্লাগইন: 'অ্যান্ড্রয়েড'" এর নীচে এই লাইনটি অন্তর্ভুক্ত করুন

 apply from: 'signing.gradle'

আপনার যদি একাধিক স্বাদ না থাকে বা ব্যবহার না করেন তবে উপরে "রিলিজ" করতে "flavore1" এর নাম পরিবর্তন করুন এবং আপনার সমাপ্তি হওয়া উচিত। আপনি যদি স্বাদ ব্যবহার করেন তবে চালিয়ে যান।

অবশেষে আপনার স্বাদগুলি আপনার বিল্ডড্র্যাডল ফাইলটিতে সঠিক স্বাক্ষরকরণফনটির সাথে যুক্ত করুন এবং আপনার সমাপ্ত হওয়া উচিত।

  ...

  productFlavors {

      flavor1 {
          ...
          signingConfig signingConfigs.flavor1
      }

      flavor2 {
          ...
          signingConfig signingConfigs.flavor2
      }
  }

  ...

আপনি কি আরও কিছু নির্দিষ্ট হতে পারেন। আমি এটি চালাতে পারি না: "প্রতীক স্বাক্ষরকারী কনফিগ সমাধান করতে পারে না"।
Amio.io

যদি আমি বিল্ড.gradle- এ 'সাইন ইন.gradle' অন্তর্ভুক্ত করি - আমাকে গিট সংগ্রহস্থল রাখতে বাধ্য করা হবে (অন্যথায় আমি ত্রুটি পেয়েছি 'সাইন ইন। অ্যাড্রেডেলের অস্তিত্ব নেই')। এবং যদি আমি 'Signing.gradle' গিটে রাখি তবে এটি উদ্দেশ্যকে হারাবে। আমি কীভাবে সাইন ইন.gradle অন্তর্ভুক্ত করতে পারি?
জাগুয়ার

21

আপনার কাছে ইতিমধ্যে কীস্টোর ফাইল থাকলে এটি আপনার বিল্ড কমান্ডে কয়েকটি পরামিতি যুক্ত করার মতো সহজ হতে পারে:

./gradlew assembleRelease \
 -Pandroid.injected.signing.store.file=$KEYFILE \
 -Pandroid.injected.signing.store.password=$STORE_PASSWORD \
 -Pandroid.injected.signing.key.alias=$KEY_ALIAS \
 -Pandroid.injected.signing.key.password=$KEY_PASSWORD

আপনার অ্যান্ড্রয়েড প্রকল্পে স্থায়ী পরিবর্তন দরকার নেই।

সূত্র: http://www.tinmith.net/wayne/blog/2014/08/gradle-sign-command-line.htm


18

এই একটি উত্তর user672009 প্রয়োজন এবং উপরন্তু sdqali এর পোস্ট (তাঁর কোড আইডিই এর "চালান" বাটনে দ্বারা ডিবাগ সংস্করণ নির্মাণের বিপর্যস্ত হবে):

আপনি নিম্নলিখিত কোড ব্যবহার করতে পারেন:

final Console console = System.console();
if (console != null) {

    // Building from console 
    signingConfigs {
        release {
            storeFile file(console.readLine("Enter keystore path: "))
            storePassword console.readLine("Enter keystore password: ")
            keyAlias console.readLine("Enter alias key: ")
            keyPassword console.readLine("Enter key password: ")
        }
    }

} else {

    // Building from IDE's "Run" button
    signingConfigs {
        release {

        }
    }

}

কিছু ডিফল্ট মান আছে কি আছে? আমার কীস্টোরটি সাধারণত একই থাকে। স্টোরপাসওয়ার্ড সাধারণত কীপ্যাসওয়ার্ড এবং কীআলিয়াস সাধারণত প্রকল্পের নাম নিম্ন ক্ষেত্রে হয়।
ব্যবহারকারী 672009

@ user672009 আপনি সর্বদা স্ক্রিপ্টের ভিতরে জাভা কোড ব্যবহার করতে পারেন।
এচেপ

1
আপনি এই জাতীয় কিছু ব্যবহার করতে চাইতে পারেন: keyPassword new String(console.readPassword("Enter key password: "))ইনপুট চলাকালীন আপনার পাসওয়ার্ড প্রদর্শিত হবে না তা নিশ্চিত করতে
Alex Semeniuk

এটি আর কাজ করে না, github.com/gradle/gradle/issues/1251 দেখুন
SqAR.org

16

নতুন অ্যান্ড্রয়েড স্টুডিওতে একটি জিইউআই উপায় রয়েছে যা খুব সহজ এবং এটি গ্রেডল ফাইলটিও জনপ্রিয় করে তোলে।

  1. File -> Project Structure

  2. Module -> প্রধান মডিউলটি ('অ্যাপ' বা অন্যান্য কাস্টম নাম) চয়ন করুন

  3. Signing ট্যাব -> প্লাস ছবিতে নতুন কনফিগারেশন যুক্ত করুন

  4. ডানদিকে ডেটা পূরণ করুন

  5. ঠিক আছে এবং গ্রেডল ফাইল স্বয়ংক্রিয়ভাবে তৈরি করা হবে

  6. আপনাকে ম্যানুয়ালি signingConfig signingConfigs.NameOfYourConfigভিতরে একটি লাইন যুক্ত করতে হবেbuiltTypes{release{}}

ছবি:

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

দুটি গুরুত্বপূর্ণ (!) নোট:

(সম্পাদনা 12/15)

  1. স্বাক্ষরিত APK তৈরি করতে আপনাকে অ্যান্ড্রয়েড স্টুডিওর (মূল ইন্টারফেসের নীচে) টার্মিনাল ট্যাব খুলতে হবে এবং একটি আদেশ জারি করতে হবে ./gradlew assembleRelease

  2. আপনি যদি ভুলে যান keyAlias(আমার কাছে প্রায়ই যা ঘটে), আপনাকে Build -> Generate Signed APKপ্রক্রিয়া শুরু করতে এবং আলিয়াস কীটির নাম দেখতে হবে।


2
এটি build.gradleফাইলগুলিতে আপনার পাসওয়ার্ডগুলিকে হার্ডকোড করে , যদিও তাই না?
জোশুয়া পিন্টার :19

16

আপনি যদি আমার মতো কমান্ড লাইনের মাধ্যমে এপিপি তৈরি করেন তবে আপনি আর্গুমেন্ট হিসাবে স্বাক্ষরকরণের কনফিগারেশন সরবরাহ করতে পারেন।

এটি আপনার যুক্ত করুন build.gradle

def getStore = { ->
    def result = project.hasProperty('storeFile') ? storeFile : "null"
    return result
}

def getStorePassword = { ->
    def result = project.hasProperty('storePassword') ? storePassword : ""
    return result
}

def getKeyAlias = { ->
    def result = project.hasProperty('keyAlias') ? keyAlias : ""
    return result
}

def getKeyPassword = { ->
    def result = project.hasProperty('keyPassword') ? keyPassword : ""
    return result
}

আপনার signingConfigsএই মত করুন

signingConfigs {
    release {
        storeFile file(getStore())
        storePassword getStorePassword()
        keyAlias getKeyAlias()
        keyPassword getKeyPassword()
    }
}

তারপরে আপনি gradlewএভাবে চালাবেন

./gradlew assembleRelease -PstoreFile="keystore.jks" -PstorePassword="password" -PkeyAlias="alias" -PkeyPassword="password"

কোনটি build.gradle? উপরের স্তর? দয়া করে আরও কোড যুক্ত করুন
ভ্ল্যাড

স্পষ্ট করতে, এই app/build.gradleফাইলটি আমি বলছি।
Egis

11
android {
    compileSdkVersion 17
    buildToolsVersion "19.0.3"

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 18
    }

    File signFile = rootProject.file('sign/keystore.properties')
    if (signFile.exists()) {
        Properties properties = new Properties()
        properties.load(new FileInputStream(signFile))
        signingConfigs {
            release {
                storeFile rootProject.file(properties['keystore'])
                storePassword properties['storePassword']
                keyAlias properties['keyAlias']
                keyPassword properties['keyPassword']
            }
        }
    }

    buildTypes {
        release {
            runProguard true
            zipAlign true
            proguardFile rootProject.file('proguard-rules.cfg')
            signingConfig signingConfigs.release
        }
        debug {
            runProguard false
            zipAlign true
        }
    }
}

অ্যান্ড্রয়েড স্টুডিও ০.০.১, গ্রেডল ১.১১ এবং গ্রেডল প্লাগইন ০.৯ ব্যবহার করে।
জেপি ভেন্টুরা

1
চাহিদার ভিত্তিতে সম্পত্তি তৈরি করা (ওরফে গতিশীল বৈশিষ্ট্য) অবনতিহিত হয়েছে এবং গ্রেডল ২.০
জে.পি. ভেনচুরা

10

সাইন ইন করতে সহায়তা করতে আপনি গ্রেডের -P কমান্ড লাইন বিকল্পটিও ব্যবহার করতে পারেন। আপনার বিল্ড.gradle এ, सिंगিংকনফিগগুলি এর মতো যুক্ত করুন:

signingConfigs {
   release {
       storeFile file("path/to/your/keystore")
       storePassword RELEASE_STORE_PASSWORD
       keyAlias "your.key.alias"
       keyPassword RELEASE_KEY_PASSWORD
   }
}

তারপরে গ্রেডেল বিল্ডকে এভাবে কল করুন:

gradle -PRELEASE_KEYSTORE_PASSWORD=******* -PRELEASE_KEY_PASSWORD=****** build

আপনি যদি পছন্দ করেন তবে স্টোরফিল এবং কীআলিয়াস সেট করতে আপনি পি ব্যবহার করতে পারেন।

এটি মূলত ডেসটিলের সমাধান তবে কমান্ড লাইনের বিকল্পগুলির সাথে।

গ্রেড বৈশিষ্ট্য সম্পর্কিত আরও তথ্যের জন্য, গ্রেডল ব্যবহারকারী গাইড পরীক্ষা করুন ।


7

@ ডেসটিল এর উত্তরটি ভাল যদি আপনি সমস্ত প্রকল্পে একই কনফিগারেশনটি পুনরায় ব্যবহার করতে পারেন। বিকল্পভাবে, অ্যান্ড্রয়েড স্টুডিও একটি সঙ্গে আসেlocal.properties ফাইল সম্ভবত পরিবর্তে ব্যবহার করা যেতে পারে, তবে এটি সম্ভবত আইডিই-উত্পাদিত এবং অ্যান্ড্রয়েড স্টুডিওর মধ্যে থেকে এটি প্রসারিত করার কোনও উপায় আমি পাই না।

এটি @ জঞ্জোর উত্তরের একটি প্রকরণ । এই উত্তরটি প্রকল্পের নির্দিষ্ট সেটিংসের অনুমতি দেয় তবে এটি কিছুটা বিকাশকারী ওভারহেডের সাথে আসে। বিশেষত, উল্লেখযোগ্য বয়লারপ্লেটটির signingConfigsসংজ্ঞাটি একটি পৃথক ফাইলে স্থানান্তরিত করা প্রয়োজন - বিশেষ করে যদি আপনাকে একাধিক প্রকল্পের জন্য এটি করা প্রয়োজন হয়, যা ডাস্টিলের চেয়ে এই সমাধানটি বাছাইয়ের একটি প্রধান কারণ। এই কিছুটা দ্বারা প্রশমিত করা যেতে পারে এছাড়া লাইন সহ

apply plugin: 'com.android.application'

শংসাপত্রের ফাইলটিতে এটি আইডিই সম্পূর্ণ করার অনুমতি দেবে।

অবশেষে, এখানে বেশিরভাগ সমাধানগুলি প্রকল্পটি ডিবাগ মোডে তৈরি করার অনুমতি দেয় না - যা ডিবাগ-সাইনটি স্বয়ংক্রিয়ভাবে পরিচালনা করে - সিনট্যাক্টিকালি সরবরাহ না করে যদি শব্দার্থগতভাবে বৈধ না হয়signingConfigs সংজ্ঞা । আপনার যদি কোনও প্রদত্ত মেশিন থেকে রিলিজ বিল্ড তৈরির প্রয়োজন না হয় তবে এই অতিরিক্ত পদক্ষেপটি একটি অপ্রয়োজনীয় বাধা হিসাবে দেখা যেতে পারে। অন্যদিকে, এটি অজ্ঞ বা অলস সহকর্মীদের বিরুদ্ধে একটি উত্পাদন হতে পারে ডিবাগ বিল্ড চলমান।

এই সমাধানটি শংসাপত্রগুলি সম্পর্কে মোটেও উদ্বেগ ছাড়াই ডিবাগ বিল্ডগুলিকে অনুমতি দেবে তবে রিলিজ বিল্ডগুলি তৈরি করতে বৈধ শংসাপত্রগুলির প্রয়োজন হবে এবং এটি খুব কম বয়লারপ্লেট লাগে। তবে, একটি খারাপ দিক হিসাবে এটি অন্যকে আসল শংসাপত্রগুলির সাথে ডামি মানগুলি প্রতিস্থাপন করতে উত্সাহিত করতে পারে এবং এর বিরুদ্ধে সুরক্ষার কোনও উপায় নেই।

// app/build.gradle
// Define this structure in signing.gradle to enable release builds.
ext.signing = [
        storeFilePath : 'path/to/keystore',
        storePassword : 'keystore password',
        keyAlias      : 'key alias',
        keyPassword   : 'key password',
]

if (file('signing.gradle').exists()) {
    apply from: 'signing.gradle'
}

android {
    ...
    signingConfigs {
        release {
            storeFile file(project.signing.storeFilePath)
            storePassword project.signing.storePassword
            keyAlias project.signing.keyAlias
            keyPassword project.signing.keyPassword
        }
    }
    buildTypes {
        debug { ... }
        release {
            signingConfig signingConfigs.release
            ...
        }
    }
}

এটি একটি ডামি সম্পত্তি তৈরি করে যা সিনট্যাক্টিক্যালি বৈধ বিল্ড ফাইল তৈরি করতে বিশুদ্ধভাবে পরিবেশন করে। ext.signingএর বৈশিষ্ট্যগুলিতে নির্ধারিত মানগুলি যতক্ষণ না ডিবাগ বিল্ড যায় তত অপ্রাসঙ্গিক। মুক্তি তৈরী করে, কপি সক্রিয় করার জন্য ext.signingপ্রবেশ signing.gradleএবং বৈধ শংসাপত্রের সঙ্গে ডামি মান প্রতিস্থাপন করুন।

// signing.gradle
ext.signing = [
        storeFilePath : 'real/keystore',
        storePassword : 'real keystore password',
        keyAlias : 'real key alias',
        keyPassword : 'real key password',
]

অবশ্যই, signing.gradleভিসিএস দ্বারা উপেক্ষা করা উচিত।


6

প্রায় সব প্ল্যাটফর্মই এখন কিছু প্রকারের কীরিংয়ের প্রস্তাব দেয়, তাই স্পষ্ট পাঠ্য পাসওয়ার্ড চারপাশে ছেড়ে যাওয়ার কোনও কারণ নেই।

আমি পাইথন কিরিং মডিউল (মূলত সহচর কনসোল স্ক্রিপ্ট keyring) এবং গ্রোভির ['do', 'something'].execute() বৈশিষ্ট্যটির চারপাশে একটি ন্যূনতম মোড়ক ব্যবহার করার একটি সহজ সমাধান প্রস্তাব করছি :

def execOutput= { args ->
    def proc = args.execute()
    proc.waitFor()
    def stdout = proc.in.text
    return stdout.trim()
}

এই ফাংশনটি ব্যবহার করে, signingConfigsবিভাগটি হয়ে যায়:

signingConfigs {
    release {
        storeFile file("android.keystore")
        storePassword execOutput(["keyring", "get", "google-play", storeFile.name])
        keyAlias "com.example.app"
        keyPassword execOutput(["keyring", "get", "google-play", keyAlias])
    }
}

চালানোর আগে gradle assembleReleaseআপনাকে একবার আপনার কীরিংয়ে পাসওয়ার্ড সেট করতে হবে:

$ keyring set google-play android.keystore # will be prompted for the passwords
$ keyring set google-play com.example.app

শুভ মুক্তি!


5

ডেভিড ভাভ্রা দ্বারা উত্তর প্রসারিত করা, একটি ফাইল তৈরি করুন। / .গ্র্যাডেল / গ্রেডেল.প্রোপার্টি এবং যুক্ত করুন

RELEASE_STORE_FILE=/path/to/.keystore
RELEASE_KEY_ALIAS=XXXXX
RELEASE_STORE_PASSWORD=XXXXXXXXX
RELEASE_KEY_PASSWORD=XXXXXXXXX

তারপরে build.gradle এ

  signingConfigs {
    release {
    }
  }

  buildTypes {
    release {
      minifyEnabled true
      shrinkResources true

    }
  }

  // make this optional
  if ( project.hasProperty("RELEASE_KEY_ALIAS") ) {
    signingConfigs {
      release {
        storeFile file(RELEASE_STORE_FILE)
        storePassword RELEASE_STORE_PASSWORD
        keyAlias RELEASE_KEY_ALIAS
        keyPassword RELEASE_KEY_PASSWORD
      }
    }
    buildTypes {
      release {
        signingConfig signingConfigs.release
      }
    }
  }

5

আমি এটিকে খুঁজে বের করতে বেশ মজা পেয়েছি। এখানে আমার হাঁটাচলা।

ইন্টেলিজজে গ্রেড বিল্ড ফাইল কীভাবে তৈরি করা যায় সে সম্পর্কে এ টু জেড ওয়াক-থ্রো (v.13.1.4) এই ওয়াক-থ্রুম ধরে নেওয়া যায় কী কী স্টোর ফাইল তৈরি করতে হয় তা আপনি জানেন। এই টিউটোরিয়ালটি কাজ করার জন্য আপনার অ্যাপের ফোল্ডারে আপনার কীস্টোর ফাইলটি থাকা দরকার এবং আপনার জিপালাইন.এক্সি ফাইলটি 'এসডিকে-রুট \ সরঞ্জামগুলিতে' থাকা উচিত। এই ফাইলটি সাধারণত 'এসডিকে-রুট \ বিল্ড-সরঞ্জামসমূহ' এ পাওয়া যায় এবং এই ফোল্ডারের নীচে এটি সর্বোচ্চ এপিআই ফোল্ডারে থাকবে (আলফা বা বিটা আমি আলফা সংস্করণের প্রস্তাব দিই)।

আপনারা যারা সরাসরি এখানে লাফিয়ে উঠতে চান তাদের জন্য গ্রেড বিল্ড ফাইল।

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.9.+'
    }
}
apply plugin: 'android'

repositories {
    mavenCentral()
}
android {
    compileSdkVersion 19
    buildToolsVersion '20.0.0'
    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    signingConfigs {
        playstore {
            keyAlias 'developers4u'
            keyPassword 'thisIsNotMyRealPassword'
            storeFile file('developers4u.keystore')
            storePassword 'realyItIsNot'
        }
    }
    buildTypes {
        assembleRelease {
            debuggable false
            jniDebugBuild false
            runProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            zipAlign true
            signingConfig signingConfigs.playstore
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:support-v4:20.0.0'
    implementation 'com.android.support:appcompat-v7:20.0.0'
}

আপনি মেনু অপশন থেকে এই বিল্ড ফাইলের (উপরের) অংশটি তৈরি করতে পারেন: ফাইল / প্রকল্প কাঠামো এখান থেকে ফেসবুকে নির্বাচন করুন এবং 'অ্যান্ড্রয়েড-গ্রেডল (অ্যাপ) ক্লিক করুন। এখান থেকে আপনি ট্যাবগুলি দেখতে পাবেন: 'সম্পত্তি', 'স্বাক্ষর', 'স্বাদ', 'বিল্ড প্রকারগুলি' এবং 'নির্ভরতা' এই পদক্ষেপের জন্য আমরা কেবল 'সাইনিং' এবং 'বিল্ড টাইপস' ব্যবহার করব। 'বিল্ড টাইপস' এর অধীনে (নাম বিভাগে) আপনার বিল্ড টাইপ কনফিগারেশন সনাক্ত করতে ইচ্ছুক যে কোনও নাম লিখুন এবং অন্যান্য 4 টি ক্ষেত্রে আপনার কীস্টোরের তথ্য প্রবেশ করুন (আপনার অ্যাপ ফোল্ডারের নীচে কীস্টোরের পথটি নির্ধারণ করে)।

'বিল্ড টাইপস' এর অধীনে নাম ক্ষেত্রের মধ্যে 'এসেম্বল রিলিজ' মানটি লিখুন, 'ডিবাজিবল' মিথ্যাতে সেট করা উচিত, 'জনি ডিবাগ বিল্ড' মিথ্যা হওয়া উচিত, 'প্রো প্রগার্ড' টি সত্যতে সেট করা এবং 'জিপ সারিবদ্ধ' সত্যে সেট করা উচিত। এটি বিল্ড ফাইল তৈরি করবে, তবে উপরের চিত্রের মতো নয়, আপনাকে পরে বিল্ড ফাইলটিতে কয়েকটি জিনিস যুক্ত করতে হবে। এখানে প্রোগুয়ার্ড ফাইলের অবস্থান গ্রেড বিল্ড ফাইলে ম্যানুয়ালি সেট করা হবে। (উপরে চিত্রিত হিসাবে)

পরে আপনাকে ডিএসএল পাত্রে যুক্ত করতে হবে:

android {
    ....
    compileSdkVersion 19
    buildToolsVersion '20.0.0'
    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    ....
}

আপনাকে যোগ করতে হবে:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:support-v4:20.0.0'
    implementation 'com.android.support:appcompat-v7:20.0.0'
}

এই ডিএসএল ধারকটির উপরে ('নির্ভরতা') কনফিগার ফাইলের নীচে থাকা উচিত তবে অ্যান্ড্রয়েড ডিএসএল ধারকটির ভিতরে নয়। ইন্টেলিজ মেনু থেকে নির্ভরতা ধারক তৈরি করতে, নির্বাচন করুন: ফাইল / প্রকল্প কাঠামো। সেখান থেকে আবার ফেসবুকে এবং তারপরে অ্যান্ড্রয়েড-গ্রেডল (অ্যাপ) নির্বাচন করুন। আপনি উপরে উল্লিখিত একই 5 টি ট্যাব দেখতে পাবেন। 'নির্ভরতা' ট্যাবটি নির্বাচন করুন এবং আপনার প্রয়োজনীয়তাগুলি নির্ভর করুন।

এই সমস্ত কাজ শেষ হওয়ার পরে আপনার এই ওয়াক-থ্রুটির শীর্ষে থাকা ফাইলের অনুরূপ গ্রেডল বিল্ড ফাইলটি দেখতে হবে। আপনার স্বাক্ষরযুক্ত জিপ প্রান্তিককরণ মুক্ত করতে আপনাকে গ্রেডল কার্যগুলি খুলতে হবে। ভিউ / টুল উইন্ডোজ / গ্রেডল নির্বাচন করে আপনি এই উইন্ডোটিতে যেতে পারেন। এখান থেকে আপনি 'এসেম্বলএসেম্বল রিলিজ' এ ডাবল ক্লিক করতে পারেন। এটি আপনার স্থাপনযোগ্য এপিএল তৈরি করা উচিত should

আপনার মুক্তির সংকলন করার সময় যে সম্ভাব্য সমস্যাগুলি দেখা দিতে পারে সেগুলি হ'ল (তবে সীমাবদ্ধ নয়): আপনার গ্রেডল বিল্ড ফাইলটি ভুল জায়গায় রয়েছে। দুটি গ্র্যাডল বিল্ড ফাইল রয়েছে; আপনার অ্যাপ্লিকেশন রুটের ফোল্ডারে একটি এবং অ্যাপ্লিকেশন রুটের অধীনে অ্যাপ ফোল্ডারে। আপনার অবশ্যই পরবর্তীটি ব্যবহার করা উচিত।

আপনারও লিন্টের সমস্যা হতে পারে। (দ্রষ্টব্য: অ্যান্ড্রয়েড বিকাশকারী স্টুডিও ইন্টেলিজিজের তুলনায় লিন্টের সমস্যাগুলি চিহ্নিত করার ক্ষেত্রে অনেক ভাল you

লিন্টের সমস্যাগুলি পেতে আপনাকে নীচের ডিএসএল ধারকটি অ্যান্ড্রয়েড পাত্রে রেখে দিতে হবে (উপরে):

android {
        ....
    lintOptions {
        abortOnError false
    }
    ....
}

এটি আপনার অ্যান্ড্রয়েড ডিএসএল ধারকটির ভিতরে রাখার ফলে বিল্ড ফোল্ডারে (সরাসরি আপনার অ্যাপ ফোল্ডারের নীচে) একটি ত্রুটিযুক্ত ফাইল তৈরি হতে পারে ফাইলটির নাম 'লিন্ট-ফলাফল-রিলিজ-ফ্যাটাল এইচটিএমএল'র মতো হওয়া উচিত যা এই ফাইলটি আপনাকে জানাবে ক্লাস যেখানে ত্রুটি ঘটেছে। আর একটি ফাইল তৈরি করা হবে যা একটি এক্সএমএল ফাইল যা লিঙ্ক ত্রুটির সাথে যুক্ত 'ইস্যু আইডি' ধারণ করে। ফাইলের নামটি 'lint-ফলাফল-রিলিজ-ফ্যাটাল.এক্সএমএল' এর মতো কিছু হওয়া উচিত। ফাইলটির শীর্ষের কাছাকাছি কোথাও আপনি একটি নোড 'ইস্যু' দেখতে পাবেন যার ভিতরে আপনি 'id = "IDOfYourLintProblem"' এর মতো কিছু দেখতে পাবেন

এই সমস্যার সমাধানের জন্য আপনার প্রকল্পের ফাইলটি খুলুন যা 'লিন্ট-ফলাফল-এসেম্বল রিলেজ-ফ্যাটাল.html' ফাইলটিতে তালিকাভুক্ত ছিল এবং শ্রেণীর নামের ঠিক উপরে জাভা ক্লাস ফাইলে নিম্নলিখিত কোডের লাইনটি প্রবেশ করান: @ সাপ্রেসলিঙ্ক ("আইডিওফিউরলিঙ্কপ্রব্লেম" ")। আপনাকে 'android.annotation.SuppressLint' আমদানি করতে হতে পারে;

সুতরাং আপনার জাভা ক্লাস ফাইলটি প্রদর্শিত হবে:

package com.WarwickWestonWright.developers4u.app.CandidateArea;

import android.annotation.SuppressLint;
... other imports

@SuppressLint("IDOfYourLintProblem")
public class SearchForJobsFragment extends Fragment {... rest of your class definition}

দ্রষ্টব্য যে লিন্টের ত্রুটিগুলি দমন করা সর্বদা সেরা আইডিইএ নয় আপনার লিখিত ত্রুটির কারণে আপনার কোড পরিবর্তন করা আপনার পক্ষে ভাল।

আর একটি সমস্যা যা সম্ভাব্যভাবে ঘটতে পারে তা হ'ল যদি আপনি গ্রেডল হোম এনভায়রনমেন্ট ভেরিয়েবলের জন্য পরিবেশ পরিবর্তনশীল সেট না করে থাকেন। এই ভেরিয়েবলটির নাম 'গ্রেডহোহোম' রাখা হয়েছে এবং গ্রেড হোম ডিরেক্টরিটির পথ নির্ধারণ করা উচিত, 'সি: \ গ্রেড -১.১২' এর মতো কিছু সময় আপনি 'এন্ড্রয়েডহোম'-এর জন্য পরিবেশের পরিবর্তনশীল সেট করতেও চাইলে এটি' আপনার নিজের- এ সেট করতে পারেন- SDK এর-রুট \ SDK '

এটি সম্পন্ন হওয়ার পরে গ্রেডল টাস্ক উইন্ডোতে ফিরে আসুন এবং এসেম্বলএসেম্বারিলিজ ডাবল ক্লিক করুন।

যদি সমস্ত সফল হয় তবে আপনি ফোল্ডার অ্যাপ্লিকেশন \ বিল্ড \ এপিকে যেতে এবং আপনার স্থাপনযোগ্য এপিএল ফাইলটি সন্ধান করতে সক্ষম হবেন।


প্রয়াসের জন্য +1 এবং: 'lintOptions {abortOnError মিথ্যা}'
রাজ ট্যুরগম্যান

4

তবুও একই সমস্যার আরেকটি পদ্ধতি। উত্স কোডের মধ্যে কোনও প্রকারের শংসাপত্র রাখার প্রস্তাব দেওয়া হয়নি, তাই আমরা কী স্টোর এবং কী ওরফে আলাদা পাসওয়ার্ড ফাইলের জন্য পাসওয়ার্ডগুলি নীচে সেট করার সিদ্ধান্ত নিয়েছি:

key.store.password=[STORE PASSWORD]
key.alias.password=[KEY PASSWORD]

আপনি যদি গিট ব্যবহার করেন তবে আপনি একটি টেক্সট ফাইল তৈরি করতে পারেন, উদাহরণস্বরূপ, Safe.properties। আপনার এটি অবশ্যই আপনার সংগ্রহশালা থেকে বাদ দেওয়া উচিত (যদি গিট ব্যবহার করে, .gitignore ফাইলে এটি যোগ করা হয়)। তারপরে, আপনাকে অন্যান্য উত্তরগুলির মতো কিছুতে একটি স্বাক্ষরকারী কনফিগারেশন তৈরি করতে হবে। পার্থক্য হ'ল আপনি কীভাবে শংসাপত্রগুলি লোড করবেন:

android {
    ...
    signingConfigs {
        ...
        release {
            storeFile file('[PATH TO]/your_keystore_file.jks')
            keyAlias "your_key_alias"

            File propsFile = file("[PATH TO]/secure.properties");
            if (propsFile.exists()) {
                Properties props = new Properties();
                props.load(new FileInputStream(propsFile))
                storePassword props.getProperty('key.store.password')
                keyPassword props.getProperty('key.alias.password')
            }
        }
        ...
    }

    buildTypes {
        ...
        release {
            signingConfig signingConfigs.release
            runProguard true
            proguardFile file('proguard-rules.txt')
        }
        ...
    }
}

ম্যানুয়ালি রিলিজ বিল্ড টাইপকে সাইনিংকনফিগ বরাদ্দ করতে ভুলবেন না (কোনও কারণে আমি কখনও কখনও ধরে নিই যে এটি স্বয়ংক্রিয়ভাবে ব্যবহৃত হবে)। এছাড়াও, অগ্রগতি সক্ষম করা বাধ্যতামূলক নয়, তবে এটি সুপারিশযোগ্য।

আমরা পরিবেশের ভেরিয়েবলগুলি ব্যবহার করা বা ব্যবহারকারীর ইনপুট অনুরোধ করার চেয়ে আমরা এই পদ্ধতির পছন্দ করি কারণ কমান্ড লাইনটি ব্যবহার না করে পুনরায় বিল্ড টাইপটিতে অ্যাপ্লিকেশন চালিয়ে আইডিই থেকে এটি করা যেতে পারে।


1
গ্রেডল এটি ব্যবহার করে সংকলন করে না: প্রপস = নতুন বৈশিষ্ট্য (); কেবলমাত্র পঠনযোগ্য সম্পত্তি '
প্রপস'

আপনি ঠিক @ m3n0R ঠিক আছে। আমাদের অ্যাপে আমাদের যে ফিক্সটি প্রবর্তন করতে হয়েছিল তা প্রতিফলিত করতে আমি আমার প্রতিক্রিয়াটির একটি লাইন সম্পাদনা করেছি যাতে এটি গ্রেডলের সর্বশেষতম সংস্করণগুলি ব্যবহার করে এখনও সংকলন করতে পারে। মূলত, প্রপসকে স্থানীয় ভেরিয়েবল হিসাবে ঘোষণা করতে হয়।
আরজেনকিউই

এটি কীভাবে ক্লাউড সিআই / সিডি সরঞ্জাম ব্যবহার করে গ্রহণযোগ্য হবে .... সেই পথ / টু / কীস্টোর এবং /পাথ / টো / সিকিউর.পড়গুলি আমাকে ছুঁড়ে ফেলছে .... যদিও এর জন্য ধন্যবাদ।
sirvon

4

অ্যান্ড্রয়েড স্টুডিও ফাইল -> প্রকল্পের কাঠামোতে যান বা Ctrl + Alt + Shift + S টিপুন

ছবিটি দেখুন

এখানে চিত্র বর্ণনা লিখুন

ওকে ক্লিক করুন

তারপরে SignConfigs আপনার বিল্ড.gradle ফাইলটিতে উত্পন্ন করবে।

এখানে চিত্র বর্ণনা লিখুন


এবং এটি হ'ল আপনি যা করতে চান না। এইভাবে আপনার সমস্ত পাসওয়ার্ডগুলি স্পষ্ট-পাঠ্যে এবং আপনার প্রকল্পের অংশে রয়েছে এবং এমনকি আপনার বিতরণকৃত বিল্ডেও দুর্ঘটনাক্রমে অন্তর্ভুক্ত করা খুব সহজ।
not2qubit

2

আমার বেশ কয়েকটি সমস্যা ছিল যা আমি নিম্নলিখিত লাইনে একটি ভুল জায়গায় রেখেছি:

signingConfigs {
    release {
        // We can leave these in environment variables
        storeFile file("d:\\Fejlesztés\\******.keystore")
        keyAlias "mykey"

        // These two lines make gradle believe that the signingConfigs
        // section is complete. Without them, tasks like installRelease
        // will not be available!
        storePassword "*****"
        keyPassword "******"
    }
}

নিশ্চিত করুন যে আপনি অ্যানড্রয়েড বিভাগের মধ্যে সাইন ইন কনফিগার অংশগুলি রেখেছেন:

android
{
    ....
    signingConfigs {
        release {
          ...
        }
    }
}

পরিবর্তে

android
{
    ....
}

signingConfigs {
   release {
        ...
   }
}

এই ভুল করা সহজ।


2

এটি 2019 এবং আমার ভিপি 1 (জারের স্বাক্ষর) বা ভি 2 (পূর্ণ এপিএল স্বাক্ষর) দিয়ে APK সাইন ইন করতে হবে। আমি "জেনারেটেড স্বাক্ষরিত এপিপি গ্রেডেল" গুগল করেছিলাম এবং এটি আমাকে এখানে এনেছে। তাই আমি এখানে আমার মূল সমাধানটি যুক্ত করছি।

signingConfigs {
    release {
        ...
        v1SigningEnabled true
        v2SigningEnabled true
    }
}

আমার আসল প্রশ্ন: বিল্ডড্র্যাডল ফাইল থেকে ভি 1 (জার স্বাক্ষর) বা ভি 2 (সম্পূর্ণ এপিএল স্বাক্ষর) কীভাবে ব্যবহার করবেন


আধা-কলোন প্রয়োজন নেই; এটি আপনাকে একটি ত্রুটি দেবে।
তাকেশী কাগা

সেটা ঠিক. ধন্যবাদ। আমি উত্তর সম্পাদনা করেছি।
ব্যবহারকারী1506104

1

অন্যান্য উত্তরগুলির পরিপূরক হিসাবে, আপনি আপনার গ্রেড.প্রসারণ ফাইলটি আপনার নিজস্ব মডিউল ফোল্ডারে বিল্ট.gradle এর সাথেও রাখতে পারেন, যদি আপনার কীস্টোরটি কোনও প্রকল্পের সাথে সুনির্দিষ্ট হয়।


1

আমি উবুন্টু 14.04 এ কাজ করছি। Vim ~ / .bashrc এবং রফতানি যোগ করুন ANDROID_KEYSTORE = রফতানি ANDROID_KEYALIAS =

এবং তারপরে build.gradle সেটে।

    final Console console = System.console();
if (console != null) {

    // Building from console
    signingConfigs {
        release {
            storeFile file(System.getenv("KEYSTORE"))
            storePassword new String(System.console().readPassword("\n\$ Enter keystore password: "))
            keyAlias System.getenv("KEY_ALIAS")
            keyPassword new String(System.console().readPassword("\n\$ Enter key password: "))
        }
    }

} else {

    // Building from IDE's "Run" button
    signingConfigs {
        release {

        }
    }

}

আইএমএইচও যা সর্বোত্তম সমাধান বলে মনে হয়, তবে দুর্ভাগ্যক্রমে এটি গ্রেডল : System.console()রিটার্নের নতুন সংস্করণগুলিতে কাজ করা বন্ধ করে দিয়েছেnull
আন্তোনিও ভিনিসিয়াস মেনেজেস মেদেই

1

একটি বিকল্প হ'ল এমন কোনও কাজকে সংজ্ঞায়িত করা হয় যা কেবলমাত্র রিলিজ বিল্ডগুলিতে চলে।

android {
  ...
  signingConfigs {
     release {
        // We can leave these in environment variables
        storeFile file('nameOfKeystore.keystore')
        keyAlias 'nameOfKeyAlias'

        // These two lines make gradle believe that the signingConfigs
        // section is complete. Without them, tasks like installRelease
        // will not be available!
        storePassword "notYourRealPassword"
        keyPassword "notYourRealPassword"

     }
  }
  buildTypes {
     ...
     release {
        signingConfig signingConfigs.release
        ...
     }
  }
  ...
}

task setupKeystore << {
final Console console = System.console();
if (console != null) {
    //def keyFile = console.readLine(“\nProject: “ + project.name + “Enter keystore path: "))
    //def keyAlias = console.readLine(“Project: “ + project.name + “Enter key alias: ")
        def storePw = new String(console.readPassword(“Project:  + project.name + “. Enter keystore password: "))
        def keyPw  = new String(console.readPassword(“Project: “ + project.name + “.Enter keystore password: "))

    //android.signingConfigs.release.storeFile = file(keyFile);
    //android.signingConfigs.release.keyAlias = keyAlias
        android.signingConfigs.release.storePassword = storePw
        android.signingConfigs.release.keyPassword = keyPw
}
}

//Validate t
def isReleaseConfig = gradle.startParameter.taskNames.any {it.contains('Release') }
if (isReleaseConfig) {
    setupKeystore.execute();
}

নিম্নলিখিতটি আমার কাছে পছন্দনীয় বলে মনে হচ্ছে: stackoverflow.com/a/19130098/3664487 দুটি পদ্ধতির তুলনা কীভাবে হয়?
ব্যবহারকারী 2768

1

আপনি কমান্ড লাইন থেকে পাসওয়ার্ডের জন্য অনুরোধ করতে পারেন:

...

signingConfigs {
  if (gradle.startParameter.taskNames.any {it.contains('Release') }) {
    release {
      storeFile file("your.keystore")
      storePassword new String(System.console().readPassword("\n\$ Enter keystore password: "))
      keyAlias "key-alias"
      keyPassword new String(System.console().readPassword("\n\$ Enter keys password: "))
    } 
  } else {
    //Here be dragons: unreachable else-branch forces Gradle to create
    //install...Release tasks.
    release {
      keyAlias 'dummy'
      keyPassword 'dummy'
      storeFile file('dummy')
      storePassword 'dummy'
    } 
  }
}

...

buildTypes {
  release {

    ...

    signingConfig signingConfigs.release
  }

  ...
}

...

if-then-elseব্লক পাসওয়ার্ড জন্য অনুরোধ করতে বাধা দেয় যখন আপনি একটি রিলিজ তৈরি করছি। যদিও elseশাখাটি অ্যাক্সেসযোগ্য নয়, এটি গ্র্যাডলকে একটি install...Releaseটাস্ক তৈরি করতে কৌশল করে ।

গল্পেরHttps://stackoverflow.com/a/19130098/3664487 দ্বারা উল্লিখিত হিসাবে , " গ্রেডল স্ক্রিপ্টগুলি সিস্টেমের কনসোল () ব্যবহার করে রিডলাইন পদ্ধতি ব্যবহার করে ব্যবহারকারীদের ইনপুট দেওয়ার জন্য অনুরোধ জানাতে পারে ।" দুর্ভাগ্যক্রমে, গ্রেডল সর্বদা একটি পাসওয়ার্ডের জন্য অনুরোধ করবে, এমনকি আপনি যখন কোনও ডিবাগ রিলিজ তৈরি করেন তখনও (সিএফ । গ্রেডল ব্যবহার করে একটি রিলিজ স্বাক্ষরিত এপিপি ফাইল কীভাবে তৈরি করবেন? )। ভাগ্যক্রমে, এটি কাটিয়ে উঠতে পারে, যেমন আমি উপরে দেখিয়েছি।


আমার পূর্ববর্তী উত্তরগুলি stackoverflow.com/questions/33897802/… এর কারণে সমস্যার মধ্যে পড়েছিল । এই সমস্যাটি দূর করতে আমি আমার উত্তরটি সংশোধন করেছি।
ব্যবহারকারী 2768

@ হারুন, এটি 24 নভেম্বর '15-এ কাজ করেছে। সম্প্রদায়টি সম্ভবত আপনার সমস্যার সাথে সহায়তা করতে পারে তবে আপনাকে আরও বিশদ সরবরাহ করতে হবে।
ব্যবহারকারী 2768

আমি এই সমাধান যেহেতু এটি একটি টেক্সট ফাইল পরিষ্কার পাঠ্য হিসাবে পাসওয়ার্ড নির্বাণ এড়াতে কিন্তু কারণে System.console ()। ReadLine gradle কাজ করে না মত এই বিরক্তিকর সমস্যা।
মর্ফিয়াস

@ এমফিউস, আমার কখনও সমস্যা হয়নি। উপরেরটি আমার জন্য কাজ করছে।
ব্যবহারকারী 2768

আমি মনে করি আপনি কোনও আইডিই এর মধ্যে থেকে স্ক্রিপ্টটি চালান। স্ক্রিপ্টটি টার্মিনাল থেকে চালিত হলে আপনি ত্রুটিটি দেখতে পাবেন। তবে এই উত্তরের জন্য ধন্যবাদ। এই আমি খুঁজছিলাম ছিল।
মর্ফিয়াস

0

প্রতিক্রিয়া-নেটিভ -কনফিগার প্যাকেজ ব্যবহার করে প্রতিক্রিয়া- নেটিভ এ করার জন্য আমার উপায় যুক্ত করা ।
একটি .env ফাইল তৈরি করুন:

RELEASE_STORE_PASSWORD=[YOUR_PASSWORD]
RELEASE_KEY_PASSWORD=[YOUR_PASSWORD]

নোট করুন এটি সংস্করণ নিয়ন্ত্রণের অংশ হওয়া উচিত নয়।

আপনার build.gradle:

signingConfigs {
        debug {
            ...
        }
        release {
            storeFile file(RELEASE_STORE_FILE)
            storePassword project.env.get('RELEASE_STORE_PASSWORD')
            keyAlias RELEASE_KEY_ALIAS
            keyPassword project.env.get('RELEASE_KEY_PASSWORD')
        }
    }

0

আমার ক্ষেত্রে, আমি অন্য অ্যাপের রিলিজটিতে ভুল এপিপি আপলোড করছিলাম।


0

গ্রোভির জন্য (build.gradle)

আপনার নিজের স্বাক্ষর শংসাপত্রগুলি সরাসরি বিল্ডঅ্যাড্রেডল ফাইলটিতে রাখা উচিত নয় । পরিবর্তে শংসাপত্রগুলি সংস্করণ নিয়ন্ত্রণে নয় এমন একটি ফাইল থেকে আসা উচিত।

একটি ফাইল রাখুন signing.properties যেখানে মডিউল নির্দিষ্ট build.gradle পাওয়া যায়। এটি আপনার .gitignore ফাইলটিতে যুক্ত করতে ভুলবেন না !

signing.properties

storeFilePath=/home/willi/example.keystore
storePassword=secret
keyPassword=secret
keyAlias=myReleaseSigningKey

build.gradle

android {
    // ...
    signingConfigs{
        release {
            def props = new Properties()

            def fileInputStream = new FileInputStream(file('../signing.properties'))
            props.load(fileInputStream)
            fileInputStream.close()

            storeFile = file(props['storeFilePath'])
            storePassword = props['storePassword']
            keyAlias = props['keyAlias']
            keyPassword = props['keyPassword']
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
            // ...
        }
    }
}

0

কোটলিন স্ক্রিপ্টের জন্য (build.gradle.kts)

আপনার বিল্ড . gradle.kts ফাইলটিতে আপনার স্বাক্ষরকারী শংসাপত্রগুলি সরাসরি রাখা উচিত নয় । পরিবর্তে শংসাপত্রগুলি সংস্করণ নিয়ন্ত্রণে নয় এমন একটি ফাইল থেকে আসা উচিত।

একটি ফাইল রাখুন signing.properties যেখানে মডিউল নির্দিষ্ট build.gradle.kts পাওয়া যায়। এটি আপনার .gitignore ফাইলটিতে যুক্ত করতে ভুলবেন না !

signing.properties

storeFilePath=/home/willi/example.keystore
storePassword=secret
keyPassword=secret
keyAlias=myReleaseSigningKey

build.gradle.kts

android {
    // ...
    signingConfigs {
        create("release") {
            val properties = Properties().apply {
                load(File("signing.properties").reader())
            }
            storeFile = File(properties.getProperty("storeFilePath"))
            storePassword = properties.getProperty("storePassword")
            keyPassword = properties.getProperty("keyPassword")
            keyAlias = "release"
        }
    }

    buildTypes {
        getByName("release") {
            signingConfig = signingConfigs.getByName("release")
            // ...
        }
    }
}

-1

যদি আপনি দেখতে চান না তবে নাল বস্তুটিতে পদ্ধতিটি পঠন () টি পড়তে পারেন না। আপনার প্রথমে গ্রেড.প্রোপার্টি লিখতে হবে ।

KEYSTORE_PASS=*****
ALIAS_NAME=*****
ALIAS_PASS=*****
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.