【发布时间】:2014-09-23 06:42:39
【问题描述】:
因此,我尝试使用生成未签名 apk 的自定义构建文件,然后在其上运行任务,然后对其进行压缩对齐。我还没有得到那个工作。但是我确实让它创建并正确签署了apk但是当我尝试按下播放按钮以使用我的自定义调试设置在设备上调试运行它时,工作室/gradle会生成我的apk并将其放置在我想要的目录中但是它无法将其推送到设备上,因为它使用了不存在的文件路径。 I/O 错误:C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Android Studio\apk\V2.5-10-debug-20140922-2335.apk(系统找不到指定的路径)。这是硬编码到工作室构建中的,因为我找不到更改它的设置。它真的让整个过程变得非常痛苦,哈哈。事实上,我的机器上的任何地方都不存在该路径。
编辑这是我的 build.gradle 文件
import java.text.SimpleDateFormat
import java.util.regex.Pattern
apply plugin: 'com.android.application'
def buildTime() {
def df = new SimpleDateFormat("yyyyMMdd'-'HHmm")
df.setTimeZone(TimeZone.getDefault())
return df.format(new Date())
}
def apkName = "MyApp"
def apkLocation
task (runApkSigTool , dependsOn: android, type: JavaExec) {
classpath files('apksigtool.jar')
main 'com.widevine.tools.android.apksigtool.ApkSigTool'
args[0] = apkLocation
args[1] = 'private_key.der'
args[2] = 'my.crt'
System.out.println(apkLocation);
}
android {
compileSdkVersion 19
buildToolsVersion "19.1.0"
signingConfigs{
debug{
storeFile file("debug.keystore")
storePassword "android"
keyAlias "androiddebugkey"
keyPassword "android"
}
release{
storeFile file("debug.keystore")
storePassword "android"
keyAlias "androiddebugkey"
keyPassword "android"
}
}
buildTypes {
debug{
}
release {
signingConfig signingConfigs.release
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
assembleDebug.doLast{
runApkSigTool.execute()
}
zipAlign true
}
debug{
signingConfig signingConfigs.debug
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
assembleDebug.doLast{
runApkSigTool.execute()
}
zipAlign false
}
android.applicationVariants.all { variant ->
def manifestFile = file("C:\\path\\app\\src\\main\\AndroidManifest.xml")
def pattern = Pattern.compile("versionName=\"(.+)\"")
def manifestText = manifestFile.getText()
def matcher = pattern.matcher(manifestText)
matcher.find()
def versionName = matcher.group(1)
pattern = Pattern.compile("versionCode=\"(.+)\"")
matcher = pattern.matcher(manifestText)
matcher.find()
def versionCode = matcher.group(1)
if (variant.zipAlign) {
variant.outputFile = new File("apk/"+apkName+"-V"+versionName+"-"+versionCode+"-"+variant.name+"-"+buildTime()+"-unaligned.apk");
variant.zipAlign.inputFile = variant.outputFile
variant.zipAlign.outputFile = new File("apk/"+apkName+"-V"+versionName+"-"+versionCode+"-"+variant.name+"-"+buildTime()+".apk");
} else {
apkLocation = "apk/"+apkName+"-V"+versionName+"-"+versionCode+"-"+variant.name+"-"+buildTime()+".apk";
variant.outputFile = new File("apk/"+apkName+"-V"+versionName+"-"+versionCode+"-"+variant.name+"-"+buildTime()+".apk");
System.out.println("CREATED UNSIGNED APK---------------")
}
}
}
lintOptions {
abortOnError false
ignoreWarnings true
checkAllWarnings false
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:20.0.0'
compile 'com.android.support:mediarouter-v7:20.0.0'
compile 'com.google.android.gms:play-services:5.0.89'
}
【问题讨论】:
-
能否提供您的 build.gradle 文件内容。如果没有更多信息,则无法重现此问题
-
Android Studio 查询 Gradle 以获取它要安装的变体的输出文件。在您的代码中,您为变体提供了一个相对路径,这给您带来了麻烦——当命令运行时,不要假设有关工作目录的任何内容。相反,将目录锚定到模块的根目录。我不确定您的
variant.outputFile东西是否正常工作,即使那样 - 您的错误消息(显示相对于 Android Studio 的安装目录的路径)指向的文件名不符合代码中的约定。所以还有其他问题。 -
我认为 variant.output 的东西正在工作,因为否则我不会在我创建的 apk 目录中获得构建 apk 文件。当您说将目录锚定到模块根目录时,您的意思是 src 和 res 文件夹在项目中的位置吗?我的 apk 目录已经在我的项目根目录中。我应该让 gradle 将文件放在项目根目录中,而不需要 apk 目录吗?
-
在构建时,它运行在不同的上下文中(具有不同的工作目录),而不是 Android Studio 执行构建文件以提取有关项目的信息时。这是您使用的纯相对路径,它没有锚定任何导致问题的原因。
-
好吧,这是有道理的。那我应该如何创建未签名的apk。我应该只使用没有路径声明的文件吗?
标签: android gradle android-studio