2015-06-29 24 views
7

Her bir uygulama varyantına ait APK dosyalarını, uygulama adı, versionName, versionCode ve varsa, yapı numarası içerecek şekilde yeniden adlandırmaya çalışıyorum. Şimdiye kadar uygulama adı dışında her şey çalışıyor.Android Gradle Okuma Uygulaması Adlar from strings.xml

AndroidManifest.xml dosyasının android: label için kullandığı aynı değeri kullanmak istiyorum. Bu, @string/app_name dize kaynağından gelir. Ben kullanarak kaynak değerlerini değiştirmek için yeteneği gördük:

resValue "string", "app_name", "Some new value" 

Ama sadece bu değeri okumak ve benim APK dosyasını adlandırmak için kullanmak istiyorum.

android.applicationVariants.all { variant -> 
    variant.outputs.each { output -> 
     renameApk(variant, output) 
    } 
} 

def renameApk(variant, output) { 
    def apkPath = output.outputFile.parent 
    def baseName = project.archivesBaseName 

    baseName += "-${variant.buildType.name}" 

    // add version name and version code 
    baseName += "-v${variant.mergedFlavor.versionName}-${variant.mergedFlavor.versionCode}" 

    // if built on jenkins ci, add jenkins build number: 
    def buildNumber = System.getenv('BUILD_NUMBER') 
    if (buildNumber && buildNumber.size() > 0) { 
     baseName += "-b${buildNumber}" 
    } 

    // if the variant will not be zipAligned, specify that 
    if (!output.zipAlign) { 
     baseName += '-unaligned' 
    } 

    // set the output file 
    output.outputFile = new File(apkPath, "${baseName}.apk"); 
} 

cevap

1

Bunun kolayca yapılabileceğini sanmıyorum. Kaynak çözünürlüğü, ekran yönlendirmesi, yerelleştirme vb. Şeylere uyum sağlamak için mobil cihazda yapılır. Gradle derleme sistemi, örneğin hangi yerel ayarın kullanılacağını bilmenin bir yolu yoktur. Kaynaklardan değer elde etmede ısrar ederseniz, kullanmak istediğiniz özel strings.xml dosyasını açabilir, XML'i ayrıştırıp değeri kendiniz alabilirsiniz. Benim düşünceme göre bu büyük bir aşırı sıkıntı ve oldukça yavaş ve çirkin olurdu.

Uygulama adı sık sık değiştirilmediğinden, kodlanmış olması (özellikle de dosya adı son kullanıcı tarafından görülemediğinden, hatalar meydana gelse bile, etki minimum olacaktır) ile rahat olabilirdim. Beyaz etiket uygulaması üzerinde çalışıyorsanız ve dinamik uygulama adını desteklemeniz gerekiyorsa, değerin gradle.properties dosyasına (veya kullandığınız diğer yapılandırma dosyası türüne) ayıklanması uygulamanın kaynaklarını kullanmak yerine daha iyi bir seçenek olmalıdır. .

def getAppName() { 
    def stringsFile = android.sourceSets.main.res.sourceFiles.find { it.name.equals 'strings.xml' } 
    return new XmlParser().parse(stringsFile).string.find { [email protected] 'app_name' }.text() 
} 

ANCAK tamamen @Samuil katılıyorum:

+0

Gerçekten beyaz etiket uygulaması içindir. Yapım çıktılarımızın, halihazırda oluşturduğumuz mevcut satıcıya göre farklı şekilde adlandırıldığından emin olmak niyetindeydim. Bu şekilde QA departmanımız, APK adına dayalı farklılıkları kolayca söyleyebilir. Gradle.properties'i kullanmaya dair bir örnek var mı? – steji113

+0

@ steji113, farklı etiketleri nasıl ayırt ettiğinizi söyler misiniz - ayrı git dalları, ürün tatları veya başka bir şey kullanıyor musunuz? Buna dayanarak uygulama adını oluşturmanın güzel bir yolunu bulmaya çalışacağım. –

+0

Bu nedenle, ürün aromalarının piyasaya sürülmesinden önce beyaz etiketleme altyapısına sahibiz. Temel olarak bazı dize kaynaklarını OEM değerlerine alacak ve sonra bir derleme çalıştıracak bir python betiği yazdık. Şu anda bizim Jenkins inşa ortamı en son kodu çeker, python OEM komut dosyasını çalıştırır, sonra bir taslak oluşturma işlemini gerçekleştirir ve son olarak OEM komut dosyası tarafından yapılan değişiklikleri geri döndürür. Bunu artık farklı bir şekilde yapmaya çalışacağız. Ne olduğunu tam olarak bilmiyoruz. – steji113

3

yüzden burada arama kaynakların göre uygulamanızın adını bulmak için kullanabileceğiniz kodu kaynaklara erişmek için Android Eklenti docs herhangi bir yöntem görmüyorsanız Yanovski buna değmez - bir ipi daha iyi kodlayın. Yapım sürecini yavaşlatacağını sanmıyorum, ama bu sadece gereksiz.