Gradle을 사용하여 릴리스 서명 apk 파일을 만드는 방법은 무엇입니까?


514

Gradle을 사용하여 릴리스 서명 apk 파일을 만들기 위해 Gradle 빌드를 만들고 싶습니다.

코드가 올바른지 또는 수행 할 때 매개 변수가 누락되었는지 확실하지 gradle build않습니까?

이것은 내 gradle 파일의 코드 중 일부입니다.

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

gradle 빌드는 성공적으로 완료되며 내 build/apk폴더에는 ...-release-unsigned.apk...-debug-unaligned.apk파일 만 표시 됩니다.

이 문제를 해결하는 방법에 대한 제안 사항이 있습니까?



gradle 파일에서 v1 (jar signature) 또는 v2 (full apk signature) 버전으로 서명 하시겠습니까? 여기에 해결책 : 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


signingConfigsGradle DSL에 대한 참조도 참조하십시오


12
당신이 나에게 묻는다면 가장 좋은 방법. 프로젝트 폴더 / SVN에 아무것도 저장하지 않으며 키에 대해 걱정할 필요없이 10 가지 버전의 프로젝트를 체크 아웃 할 수 있습니다.
Frank

8
Windows에서 gradlew를 사용하는 경우 GRADLE_USER_HOME이 환경 변수로 정의되어 있는지 확인해야합니다. 프로젝트 디렉토리 위의 하나의 디렉토리로 설정하고 키 저장소를 거기에 두었습니다. gradle.properties의 키 저장소 경로는 Windows 단일 백 슬래시가 아니라 슬래시 (/) 또는 이중 백 슬래시 (\\)를 사용해야합니다. Windows 명령 프롬프트에서 키 저장소를 작성하려면 stackoverflow.com/questions/3997748/how-can-i-create-a-keystore
Anachronist

3
경로가 build.gradle 파일이있는 위치 또는 시스템 루트 디렉토리와 관련이 있습니까?
Prem

1
@Prem은 file()항상 상대 경로를 가정합니다. new File(path)절대적인 것으로 취급 하려면 사용하십시오 .
ars-longa-vita-brevis

4
이것은 저에게 가장 효과적이었습니다. gradle.properties에서 RELEASE_STORE_FILE = .. / mykeystore와 같이 모듈 build.gradle을 기준으로 storeFile을 지정하십시오. 인용구를 추가하지 마십시오 gradle mangles 경로
Lakshman Chilukuri

263

이 코드를 추가하고 다음을 사용하여 문제를 해결했습니다 gradle build.

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

서명 된 릴리스 apk 파일이 생성됩니다.


33
암호를 묻는 메시지를 표시하는 방법이 있습니까? 또는 내 자식 저장소에서 암호를 유지하기위한 다른 제안?
user672009

3
build.gradle을 편집하여 사용자처럼 보이지만 "내장> 서명 된 APK 생성 ..."을 실행하면 여전히 해당 대화 상자가 표시됩니다 ( "자세한 내용은 Gradle 사용 설명서 참조"등).
Semanticer

3
@Semanticer 실행 gradle build또는 gradlew build터미널 / 프롬프트 명령
Phillip Kamikaze

12
@ user672009 속성 파일에 비밀번호를 넣고 .gitignore를 사용하여 repos에서 제외 할 수 있습니다. 이 링크를 볼 수 있습니다. gist.github.com/gabrielemariotti/6856974
Gabriele Mariotti

1
@GabrieleMariotti 여전히 불완전한 저장소를 남겨둔다. 더 좋은 방법은 스켈레톤 signing.properties를 작성하고 "git update-index --assume-unchanged signing.properties"를 발행 한 후에 작성하는 것입니다. 그러나 futura 편집 내용이 커밋되지 않습니다. sdqali가 제안하는 첫 번째 옵션과 같은 것이 더 좋습니다.
user672009

67

@sdqali의 스크립트는 적어도 Gradle 1.6을 사용 하는 경우 gradle 작업 을 호출 때마다 비밀번호를 묻습니다 . 수행 할 때만 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작업 목록에서 사라졌습니다. 왜 그렇습니까?
Kaarel

1
@caspase이 가짜 "storePassword"와 "keyPassword"에 대한 의견을 더 진지하게 받아 들였습니다. 이러한 속성 (예 : "")을 초기화하지 않으면 서명 된 * -release.apk가 생성되지 않고 오류가 표시되지 않으며 PROJECT_NAME / build / apk / 디렉토리의 * -release-unsigned.apk만으로 완전히 혼란스러워집니다. . Man ... : /
vizZ

buildTypes-> Release에서 signingConfig를 추가하는 것에 대한 참고 사항에 감사드립니다. 그것은 자동 서명을 해결했습니다!
mm2001

1
릴리스 apk를 빌드 할 때 암호를 묻는 간단한 gradle 플러그인을 만들었습니다 (이 게시물에 설명 된 mathod를 사용하지만 가짜 storePassword 및 keyPassword를 정의 할 필요는 없습니다). maven central에서도 사용 가능합니다. github.com/alexvasilkov/AndroidGradleSignPlugin
Alex Vasilkov

대단하다. 환경 변수 KEYSTORE는 디버그 빌드 및 Android Studio에서 "gradle sync"에 대해서도 정의해야합니다. 그렇지 않으면 경로가 null 인 경우 오류가 발생합니다.
Jerry101

63

build.gradle 에서 키 저장소 및 비밀번호를 하드 코딩하지 않으려면 여기에 설명 된대로 특성 파일을 사용할 수 있습니다. GRADLE로 서명 구성 처리

원래:

1) /home/[username]/.signing 과 같은 내용 으로 myproject.properties 파일을 작성하십시오 .

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

2) 내용으로 gradle.properties 파일 (아마도 프로젝트 디렉토리의 루트에 있음)을 작성하십시오.

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

3) 다음 과 같이 build.gradle 에서 참조하십시오 .

    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
잘 작동합니다! 감사합니다. 이 코드는 buildTypes {} 섹션 전에 추가해야하며 섹션은 signingConfig signingConfigs.release를 정상적으로 선언해야합니다.
theczechsensation 2016 년

마지막 으로이 문제에 대한 해결책을 찾았습니다. 정말 나를 도와 준 유일한 것! 이것은 정답이 될 것입니다 ...
devnull69

39

자식을 사용할 때 Gradle로 자동 앱 서명

이를 위해 얼마나 많은 복잡한 방법이 있는지 놀랍습니다. 다음은 Google의 자체 권장 사항 을 준수하려는 고유 한 방법 입니다. 그러나 그 설명은 명확하지 않으므로 Linux 절차에 대해 자세히 설명하겠습니다.


기술:

앱 개발 (GIT) 경로에 비밀번호 및 서명 파일을 유지하지 않고 빌드 중에 앱에 자동으로 서명하는 기본 Google 지침 은 다소 모호합니다. 다음은 명확한 단계별 지침입니다.

초기 가정 :

다음 경로로 지정된 디렉토리에 "MyApp"이라는 앱이 $HOME/projects/mydev/MyApp있습니다.. 그러나 MyApp 디렉토리는 GIT에서 사용 및 제어됩니다.

여기에 이미지 설명을 입력하십시오

문제

우리는 GIT 제어 디렉토리의 어디에서나 서명 또는 비밀번호 파일을 갖고 싶지 않습니다 .gitignore. 그래서 우리는 키 스토어와 서명 파일을 외부에 원합니다.

해결책

우리는 세 가지 일을해야합니다 :

  1. Android Studio에서 사용할 비밀번호 파일 작성
  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.gradle. MyApp-release-key.jks 파일 을 가리 키기 위해 여기에 넣어야 할 것은 다음과 같습니다.

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

여기서는 키에 대한 "myapp"별칭도 선택했습니다. 그런 다음 최종 파일은 다음과 같아야합니다.

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

두 개의 암호와 많은 정보를 요구합니다. (Android Studio에서와 동일합니다.) 이제 이전에 선택한 비밀번호를 복사 / 붙여 넣기하십시오.

(3) gradle.build위를 사용하도록 모듈 파일을 편집하십시오.

앱 / 모듈의 Gradle 빌드 파일에 다음 부분이 있어야합니다. 먼저 다음 줄을 외부에 추가하십시오.전에 당신의 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

Google Play에서 사용할 수있는 올바르게 서명 된 앱을 생성해야합니다.


업데이트 : 2019-04-02

최신 버전 keytool무언가 는 위에서 사용하는 것처럼 원래 / 기본값 대신 PKCS12 기반 키 파일 을 사용해야한다는 것을 알려줍니다 .그들은 당신이 새로운 오픈 PKCS12 형식으로 변환해야 말하고 이동합니다. 그러나 Android 개발 도구는 아직 준비가되지 않은 것 같습니다. 그렇게하면 다음과 같은 이상한 오류가 발생합니다.

com.android.ide.common.signing.KeytoolException:"F : \ XXX \ XXX.jks"저장소에서 키 XXX를 읽지 못했습니다. 키 가져 오기 실패 : 주어진 최종 블록이 제대로 채워지지 않았습니다. 암호 해독 중에 잘못된 키를 사용하면 이러한 문제가 발생할 수 있습니다.

변환 된 키를 사용하지 마십시오!


signingConfigs는 apk에 저장되어 있으며 모든 사용자가 암호를 얻기 위해 디 컴파일 할 수 있습니까? 아니면 apk에 표시되지 않습니까?
JavierSegoviaCordoba

2
매력처럼 작동합니다. 감사합니다. 이것은 허용 된 답변이어야합니다
pratham kesarkar

빌드 서버에서 키 저장소와 비밀번호 만 원하는 경우 어떻게합니까? 위의 솔루션을 사용하면 팀의 모든 개발자가 로컬 컴퓨터에 키 저장소가 있어야합니다. 그렇지 않으면 Gradle 프로젝트 동기화가 실패합니다 : keystore.properties (이러한 파일 또는 디렉토리 없음).
Diana Farin

1
keystore.properties소스 파일에 더미 파일을 커밋 할 수 있으므로 개발자 컴퓨터에서 작업을 빌드합니다. 여기에 빌드 서버 설정을 설명했습니다 .
dskrvk

1
대한 마지막 업데이트에 대한 참고 keytoolPKCS12 키 스토어를 생성 : 당신은 통과 할 수 -storetype JKSkeytool안드로이드 공구가 필요 JKS로 키 스토어 유형을 설정하는 명령.
Trevor Halvorson

35

@Destil이 말했듯이 빌드 할 키가없는 다른 사람들을 허용하십시오 : 이전 답변보다 쉬운 방법 :

이것을 넣어 ~/.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 OR 을 실행할 수 있습니다gradle build


Windows에서 경로를 설정하는 방법 : 키 저장소 경로
reza_khalafi

storeFile 파일 ( "C : \\ Users \\ xxxx \\ Documents \\ yyyy \\ mykey.jks") 맞습니까?
reza_khalafi

28

( user672009 에게 답장 위의 .)

git 저장소에서 암호를 유지하려는 경우 훨씬 쉬운 솔루션입니다. 그러나 제품 풍미에도 잘 작동하는 build.gradle을 포함하고 싶다면 별도의 gradle 파일을 만드는 것입니다. 그것을 'signing.gradle'이라고 부릅시다 (.gitignore에 포함 시키십시오). 마치 build.gradle 파일에서 로그인과 관련이없는 모든 것을 뺀 것처럼.

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

그런 다음 build.gradle 파일에서 "apply plugin : 'android'"바로 아래에이 줄을 포함하십시오.

 apply from: 'signing.gradle'

여러 가지 맛이 없거나 사용하지 않는 경우 위에서 "flavor1"의 이름을 "release"로 바꾸면 완료됩니다. 풍미를 사용하는 경우 계속하십시오.

마지막으로 풍미를 build.gradle 파일의 올바른 signingConfig에 연결하면 완료해야합니다.

  ...

  productFlavors {

      flavor1 {
          ...
          signingConfig signingConfigs.flavor1
      }

      flavor2 {
          ...
          signingConfig signingConfigs.flavor2
      }
  }

  ...

좀 더 구체적으로 할 수 있습니까? "심볼 서명 구성을 확인할 수 없습니다"라고 실행할 수 없습니다.
Amio.io

build.gradle에 'signing.gradle'을 포함하면 git 저장소에 하나가 있어야합니다 (그렇지 않으면 'signing.gradle이 없습니다'오류가 발생합니다). 그리고 'signing.gradle'을 git에 넣으면 목적을 무효화합니다. signing.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

Android 프로젝트를 영구적으로 변경할 필요가 없습니다.

출처 : http://www.tinmith.net/wayne/blog/2014/08/gradle-sign-command-line.htm


18

이것은 user672009에 대한 회신 이며 sdqali의 게시물에 추가되었습니다. (IDE의 "실행"버튼으로 디버그 버전을 빌드하면 코드가 충돌합니다).

다음 코드를 사용할 수 있습니다 :

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 {

        }
    }

}

기본값을 가질 수있는 방법이 있습니까? 내 키 스토어는 일반적으로 동일합니다. storePassword는 일반적으로 keyPassword와 동일하며 keyAlias는 일반적으로 프로젝트 이름이 소문자입니다.
user672009

@ user672009 스크립트 내에서 언제든지 Java 코드를 사용할 수 있습니다.
AChep

1
다음과 같은 것을 사용하고 싶을 수도 있습니다 : keyPassword new String(console.readPassword("Enter key password: "))입력 중에 비밀번호가 표시되지 않도록
Alex Semeniuk

더 이상 작동하지 않습니다. github.com/gradle/gradle/issues/1251
SqAR.org

16

최신 Android Studio에는 매우 쉬운 GUI 방식이 있으며 Gradle 파일도 채 웁니다.

  1. File -> Project Structure

  2. Module -> 메인 모듈 ( '앱'또는 기타 맞춤 이름)을 선택하십시오.

  3. Signing 탭-> 플러스 이미지로 새로운 구성 추가

  4. 오른쪽에 데이터 채우기

  5. 확인하고 Gradle 파일이 자동으로 생성됩니다

  6. signingConfig signingConfigs.NameOfYourConfig내부 에 줄을 수동으로 추가해야합니다builtTypes{release{}}

이미지 :

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

두 가지 중요한 (!) 메모 :

(편집 12/15)

  1. 서명 된 APK를 만들려면 Android Studio (메인 인터페이스 하단)의 터미널 탭을 열고 명령을 실행해야합니다 ./gradlew assembleRelease

  2. 잊어 버린 경우 keyAlias(자주 발생하는 일) Build -> Generate Signed APK프로세스를 시작하고 Alias ​​키 이름을 확인해야합니다.


2
이것은 암호를 build.gradle파일에 하드 코딩 하지 않습니까?
Joshua Pinter

16

나와 같은 명령 줄을 통해 apk를 빌드하면 서명 구성을 인수로 제공 할 수 있습니다.

이것을 당신의 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입니까? 최상위? 더 많은 코드를 추가하십시오
Vlad

명확히하기 위해, 이것은 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
        }
    }
}

Android Studio 0.5.1, Gradle 1.11 및 Gradle 플러그인 0.9 사용
JP Ventura

1
요청시 속성 (일명 동적 속성) 생성은 더 이상 사용되지 않으며 Gradle 2.0
JP Ventura

10

gradle의 -P 명령 행 옵션을 사용 하여 서명을 도울 수도 있습니다 . build.gradle에서 다음과 같이 singingConfigs를 추가하십시오.

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

그런 다음 gradle build를 다음과 같이 호출하십시오.

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

원하는 경우 -P를 사용하여 storeFile 및 keyAlias를 설정할 수 있습니다.

이것은 기본적으로 Destil의 솔루션이지만 명령 행 옵션이 있습니다.

gradle 속성에 대한 자세한 내용은 gradle 사용 설명서를 확인하십시오 .


7

모든 프로젝트에서 동일한 구성을 재사용 할 수 있다면 @Destil의 대답이 좋습니다. 또는 Android Studio는local.properties 대신 사용할 수 파일이 되지만 IDE에서 생성 된 것으로 추정되며 Android Studio 내에서 확장 할 수있는 방법을 찾을 수 없습니다.

이것은 @ jonbo 's answer의 변형입니다 . 그 대답은 프로젝트 특정 설정을 허용하지만 약간의 개발자 오버 헤드가 있습니다. 특히, signingConfigs정의를 별도의 파일로 옮기려면 상당한 상용구가 필요합니다. 특히 여러 프로젝트에 대해 필요한 경우 Destil보다이 솔루션을 선택하는 주된 이유입니다. 이것은 또한 라인을 포함 함으로써 다소 완화 될 수 있습니다

apply plugin: 'com.android.application'

자격 증명 파일에 IDE 완성이 가능합니다.

마지막으로, 대부분의 솔루션은 여기 않습니다 하지 자동으로 디버그 서명 처리 - - 구문 적 경우 의미 유효하지를 제공하지 않고 디버그 모드에서 프로젝트를 빌드 할 수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.gradleVCS에서는 무시해야합니다.


6

거의 모든 플랫폼이 이제 일종의 키링을 제공하므로 명확한 텍스트 암호를 남겨 둘 이유가 없습니다.

Python Keyring 모듈 (주로 동반 콘솔 스크립트 keyring)과 Groovy ['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

David Vavra의 답변을 확장하여 ~ / .gradle / gradle.properties 파일을 작성하고 추가하십시오.

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

나는 이것을 알아내는 것이 꽤 재미있었습니다. 여기 나의 연습이 있습니다.

IntelliJ (v.13.1.4)에서 gradle 빌드 파일을 만드는 방법에 대한 A-Z 연습이 연습에서는 키 저장소 파일을 만드는 방법을 알고 있다고 가정합니다. 이 튜토리얼이 작동하려면 키 저장소 파일이 앱 폴더에 있고 zipalign.exe 파일이 'SDK-ROOT \ tools'에 있어야합니다. 이 파일은 일반적으로 'SDK-ROOT \ build-tools'에 있으며이 폴더 아래 가장 높은 api 폴더 (알파 또는 베타, 알파 버전을 권장합니다)에 있습니다.

바로 여기에 뛰어 오르기를 원하는 사람들에게는 gradle 빌드 파일이 있습니다.

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

메뉴 옵션에서 파일 / 프로젝트 구조에서이 빌드 파일의 일부를 빌드 할 수 있습니다. 여기에서 패싯을 선택하고 'Android-Gradle (App)을 클릭하십시오. 여기에서이 연습을위한 '속성', '서명', 'Flavors', '건물 유형'및 '종속성'탭이 표시됩니다. '서명'및 '건물 유형'만 사용할 것입니다. 이름 섹션의 '빌드 유형'아래에서 빌드 유형 구성을 식별하려는 이름을 입력하고 다른 4 개의 필드에 키 저장소 정보를 입력하십시오 (키 저장소 경로를 앱 폴더 아래에 설정).

'Build Types'에서 이름 필드에 'assembleRelease'값을 입력하십시오. 'Debuggable'은 false로 설정되어야하고, 'Jni Debug Build'는 false로 설정되어야합니다. 'Proguard 실행'을 true로 설정하고 'Zip Align'을 true로 설정하십시오. 이렇게하면 빌드 파일이 생성되지만 위에서 설명한 것은 아니지만 나중에 빌드 파일에 몇 가지 사항을 추가해야합니다. 여기의 ProGuard 파일 위치는 gradle 빌드 파일에서 수동으로 설정됩니다. (위 그림 참조)

나중에 추가해야 할 DSL 컨테이너는 다음과 같습니다.

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

위의 DSL 컨테이너 ( '종속성')는 구성 파일의 맨 아래에 있지만 Android DSL 컨테이너 안에는 안됩니다. IntelliJ 메뉴에서 종속성 컨테이너를 빌드하려면 파일 / 프로젝트 구조를 선택하십시오. 거기에서 다시 Facets를 선택한 다음 Android-Gradle (app)을 선택하십시오. 위에서 언급 한 것과 동일한 5 개의 탭이 표시됩니다. '종속성'탭을 선택하고 필요한 종속성을 추가하십시오.

이 작업을 모두 마치면이 연습의 맨 위에있는 파일과 비슷한 Gradle 빌드 파일이 표시됩니다. 서명 된 Zip 정렬 릴리스를 빌드하려면 Gradle 태스크를 열어야합니다. View / Tool Windows / Gradle을 선택하여이 창으로 이동할 수 있습니다. 여기에서 'assembleAssembleRelease를 두 번 클릭하십시오. 배포 가능한 APK를 생성해야합니다.

릴리스를 컴파일 할 때 발생할 수있는 잠재적 문제는 다음과 같습니다 (단, 이에 한하지 않음). Gradle 빌드 파일이 잘못된 위치에 있습니다. 두 개의 Gradle 빌드 파일이 있습니다. 하나는 응용 프로그램 루트 폴더에 있고 다른 하나는 응용 프로그램 루트 아래의 응용 프로그램 폴더에 있습니다. 후자를 사용해야합니다.

보푸라기 문제가있을 수도 있습니다. (참고 : Android Developer Studio는 IntelliJ보다 Lint 문제를 발견하는 데 훨씬 좋습니다. 메뉴 옵션에서 서명 된 APK를 생성하려고 할 때이를 알 수 있습니다)

보푸라기 문제를 해결하려면 다음 DSL 컨테이너를 안드로이드 컨테이너 안에 넣으십시오 (맨 위).

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

이것을 안드로이드 DSL 컨테이너에 넣으면 빌드 폴더 (앱 폴더 바로 아래)에 오류 파일이 생성됩니다. 파일 이름은 'lint-results-release-fatal.html'과 같아야합니다. 에러가 발생한 클래스 생성 될 다른 파일은 lint 오류와 관련된 '문제 ID'가 포함 된 XML 파일입니다. 파일 이름은 'lint-results-release-fatal.xml'과 같아야합니다. 파일 상단 근처에 'issue'라는 노드가 있으며 그 안에 'id = "IDOfYourLintProblem"'과 비슷한 것이 있습니다.

이 문제를 해결하려면 프로젝트에서 'lint-results-assembleRelease-fatal.html'파일에 나열된 파일을 열고 클래스 이름 바로 위에 Java 클래스 파일에 다음 코드 줄을 입력하십시오. @SuppressLint ( "IDOfYourLintProblem "). 'android.annotation.SuppressLint;'를 가져와야 할 수도 있습니다.

따라서 Java 클래스 파일은 다음과 같이 나타납니다.

package com.WarwickWestonWright.developers4u.app.CandidateArea;

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

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

린트 오류를 ​​억제하는 것이 항상 최상의 IDEA 인 것은 아닙니다. 린트 오류를 ​​일으킨 코드를 변경하는 것이 더 좋습니다.

잠재적으로 발생할 수있는 또 다른 문제점은 Gradle HOME 환경 변수에 환경 변수를 설정하지 않은 경우입니다. 이 변수의 이름은 'GRADLE_HOME'이며 'C : \ gradle-1.12'와 같이 gradle 홈 디렉토리의 경로를 설정해야합니다. 때때로 'ANDROID_HOME'에 대한 환경 변수를 'YOUR- SDK-Root \ sdk '

이 작업이 끝나면 Gradle 작업 창으로 돌아가서 assembleAssembleRelease를 두 번 클릭하십시오.

모두 성공하면 app \ build \ apk 폴더로 이동하여 배포 가능한 APK 파일을 찾을 수 있어야합니다.


노력과 +1 : 'lintOptions {abortOnError false}'
Raz Tourgman

4

같은 문제에 대한 또 다른 접근법. 소스 코드 내에 어떤 종류의 자격 증명도 저장하지 않는 것이 좋으므로 다음과 같이 별도의 속성 파일에 키 저장소 및 키 별칭의 비밀번호를 설정하기로 결정했습니다.

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

git을 사용하면 secure.properties와 같은 텍스트 파일을 작성할 수 있습니다. 저장소에서 제외시켜야합니다 (git를 사용하는 경우 .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')
        }
        ...
    }
}

signingConfig를 릴리스 빌드 유형에 수동으로 할당하는 것을 잊지 마십시오 (어떤 이유로 자동으로 사용되는 경우가 있습니다). 또한 proguard를 반드시 설정해야하는 것은 아니지만 권장됩니다.

우리는 명령 행을 사용하지 않고 realease 빌드 유형으로 전환하고 앱을 실행하여 IDE에서 수행 할 수 있기 때문에 환경 변수를 사용하거나 사용자 입력을 요청하는 것보다이 방법을 선호합니다.


1
Gradle은 이것을 사용하여 컴파일하지 않습니다 : props = new Properties (); 읽기 전용 속성 'props'의 값을 설정할 수 없습니다
cesards

당신은 맞습니다 @ m3n0R. 앱에 도입해야 할 수정 사항을 반영하기 위해 응답 줄을 편집하여 최신 버전의 Gradle을 사용하여 컴파일합니다. 기본적으로 props는 지역 변수로 선언해야합니다.
argenkiwi

클라우드 CI / CD 도구를 사용하여 어떻게 적용 할 수 있습니까? ... / path / to / keystore 및 /path/to/secure.props는 나를 던지고 있습니다.
sirvon

4

Android Studio 파일-> 프로젝트 구조로 이동 하거나 Ctrl + Alt + Shift + S를 누릅니다.

이미지보기

여기에 이미지 설명을 입력하십시오

확인을 클릭하십시오

그런 다음 signingConfigs가 build.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 "******"
    }
}

signingConfigs 부분을 android 섹션 안에 넣었는지 확인하십시오.

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

대신에

android
{
    ....
}

signingConfigs {
   release {
        ...
   }
}

이 실수는 쉽습니다.


2

2019 년이며 V1 (jar signature) 또는 V2 (full APK signature)로 APK에 서명해야합니다. 나는 "sign apk gradle 생성"을 봤는데 여기로왔다. 그래서 여기에 원래 솔루션을 추가하고 있습니다.

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

내 원래 질문 : build.gradle 파일에서 V1 (Jar signature) 또는 V2 (Full APK signature)를 사용하는 방법


세미콜론이 필요하지 않습니다. 오류가 발생합니다.
Takeshi Kaga

맞아 그거야. 감사. 나는 대답을 편집했다.
user1506104

1

다른 답변을 보완하기 위해 키 저장소가 하나의 프로젝트에만 해당되는 경우를 위해 gradle.properties 파일을 build.gradle과 함께 고유 한 모듈 폴더에 배치 할 수도 있습니다.


1

나는 Ubuntu14.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 {

        }
    }

}

IMHO는 최고의 솔루션 인 것 같지만 불행히도 최신 버전의 Gradle : System.console()returns 작업을 중단했습니다null .
Antonio Vinicius Menezes Medei 2016 년

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 두 방법을 어떻게 비교합니까?
user2768

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지점에 접근 할 수 없지만 Gradle이 install...Release작업 을 생성하도록 속 입니다.

뒷이야기 . 지적한 바와 같이 https://stackoverflow.com/a/19130098/3664487 " Gradle을 스크립트는은, System.console (). ReadLine 메서드를 사용하여 사용자 입력에 대한 프롬프트있다 ." 불행히도 Gradle은 디버그 릴리스를 빌드 할 때에도 항상 암호를 요청합니다 (Gradle 을 사용하여 릴리스 서명 apk 파일을 만드는 방법은 무엇입니까? ). 다행히도 위에서 설명한 것처럼이 문제를 극복 할 수 있습니다.


내 이전 답변은 stackoverflow.com/questions/33897802/… 로 인해 문제가 발생했습니다 . 이 문제를 해결하기 위해 답변을 수정했습니다.
user2768

@Haroon, 15 년 11 월 24 일자로 일했습니다. 커뮤니티가 문제 해결에 도움을 줄 수 있지만 자세한 내용을 제공해야합니다.
user2768

텍스트 파일에 암호를 일반 텍스트로 넣지 않기 때문에이 솔루션이 마음에 들지만 성가신 문제 로 인해 System.console (). readLine이 gradle에서 작동하지 않습니다 .
morpheus

@morpheus, 나는 결코 문제가 없었습니다. 위의 내용은 저에게 효과적입니다.
user2768

IDE 내에서 스크립트를 실행한다고 생각합니다. 스크립트가 터미널에서 실행되면 오류가 표시됩니다. 이 답변에 감사드립니다. 이것이 내가 찾던 것입니다.
morpheus

0

react-native-config 패키지를 사용하여 React-Native에서 내 길을 추가하십시오 .
.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

제 경우에는 다른 앱의 릴리스에 잘못된 APK를 업로드하고있었습니다.


0

Groovy (build.gradle)의 경우

서명 자격 증명을 build.gradle 파일에 직접 넣지 마십시오 . 대신 자격 증명은 버전 제어가 아닌 파일에서 가져와야합니다.

모듈 별 build.gradle 이 있는 곳에 signing.properties 파일을 두십시오 . 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)

서명 자격 증명을 build.gradle.kts 파일에 직접 넣지 마십시오 . 대신 자격 증명은 버전 제어가 아닌 파일에서 가져와야합니다.

모듈 별 build.gradle.kts 가 있는 곳에 signing.properties 파일을 넣으십시오 . 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

null 객체에서 readLine () 메서드를 호출 할 수 없음 을 표시하지 않으려는 경우 먼저 gradle.properties를 작성해야합니다 .

KEYSTORE_PASS=*****
ALIAS_NAME=*****
ALIAS_PASS=*****
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.