Programing

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

lottogame 2020. 2. 13. 00:25
반응형

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


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/gradle.properties

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

다음 build.gradle과 같이 수정하십시오 .

...    
signingConfigs {

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

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

그럼 당신은 실행할 수 있습니다 gradle assembleRelease


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

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

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


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

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

@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 assembleReleaseOR 을 실행할 수 있습니다gradle build


git을 사용할 때 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 키를 읽지 못했습니다 : 키 가져 오기 실패 : 주어진 마지막 블록이 제대로 채워지지 않았습니다. 암호 해독 중에 잘못된 키를 사용하면 이러한 문제가 발생할 수 있습니다.

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


( 위의 user672009 에게 회신하십시오 .)

암호를 자식 저장소에 보관하지 않으려는 경우 훨씬 쉬운 솔루션입니다. 그러나 제품 풍미에도 잘 작동하는 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
      }
  }

  ...

이것은 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 {

        }
    }

}

나와 같은 명령 줄을 통해 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"

최신 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 ​​키 이름을 확인해야합니다.


키 저장소 파일이 이미 있으면 빌드 명령에 몇 가지 매개 변수를 추가하는 것만 큼 간단 할 수 있습니다.

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


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

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 사용 설명서를 확인하십시오 .


모든 프로젝트에서 동일한 구성을 재사용 할 수 있다면 @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에서는 무시해야합니다.


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

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

행복한 릴리스!


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

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

이미지보기

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

확인을 클릭하십시오

그런 다음 signingConfigs가 build.gradle 파일에서 생성됩니다.

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


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

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 파일을 찾을 수 있어야합니다.


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

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에서 수행 할 수 있기 때문에 환경 변수를 사용하거나 사용자 입력을 요청하는 것보다이 방법을 선호합니다.


다음과 같은 줄을 잘못된 곳에 넣는 몇 가지 문제가 있습니다.

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 {
        ...
   }
}

이 실수는 쉽습니다.


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


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

        }
    }

}

대안은 릴리스 빌드에서만 실행되는 작업을 정의하는 것입니다.

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();
}

명령 행에서 비밀번호를 요청할 수 있습니다.

...

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작업 을 생성하도록 속 입니다.

Backstory. As noted by https://stackoverflow.com/a/19130098/3664487, "Gradle scripts can prompt for user input using the System.console().readLine method." Unfortunately, Gradle will always request a password, even when you're building a debug release (cf. How to create a release signed apk file using Gradle?). Fortunately, this can be overcome, as I have shown above.


It is 2019 and I need to sign APK with V1 (jar signature) or V2 (full APK signature). I googled "generate signed apk gradle" and it brought me here. So I am adding my original solution here.

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

My original question: How to use V1 (Jar signature) or V2 (Full APK signature) from build.gradle file


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

KEYSTORE_PASS=*****
ALIAS_NAME=*****
ALIAS_PASS=*****

나처럼 테스트 목적으로 장치에서 릴리스를 실행하려면 서명을 위해 두 번째 키 저장소작성 하십시오. 따라서 시장 키를 걱정하지 않고 간단히 암호를 build.gradle에 넣을 수 있습니다. 보안을 저장하십시오.

서명 된 APK 빌드 / 생성 / 새로 작성 ...을 클릭하여 새 키 저장소를 작성할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/18328730/how-to-create-a-release-signed-apk-file-using-gradle



반응형