2014-04-10 9 views
7

Wewnątrz build.gradle dla projektu AndroidGradle - Jak zdobyć wartości z AndroidManifest?

task runAndroidApplication(type: Exec, dependsOn: ':installDebug') { 
    //TODO update Activity name below or find a way to get it from AndroidManifest.xml 
    if (System.properties['os.name'].toLowerCase().contains('windows')) { 
     // windows 
     commandLine 'cmd', '/c', 'adb', 'shell', 'am', 'start', '-n', "com.example.androidapptorun.MainActivity"  
    } else { 
     // linux 
     commandLine 'adb', 'shell', 'am', 'start', '-n', "com.example.androidapptorun.MainActivity" 
    } 
} 

Jak uzyskać wartość dla głównej działalności z AndroidManifest dla domyślnego Activity? (także jeśli istnieje kilka czynności, co byłoby logiczne, aby wybrać jeden sprawiają, że długo, podczas przetwarzania ma być wewnątrz narzędzi Android)

Czy jest lepszy sposób z android wtyczki następnie analizowania AndroidManifest.xml?

UPDATE: https://github.com/novoda/gradle-android-command-plugin puszka możliwe garnitur pewne potrzeby, ale potrzebowałem wersję bez argumentów, aby szybki bieg w Eclipse poprzez http://marketplace.eclipse.org/content/gradle

+0

widziałaś http://stackoverflow.com/questions/10187556/reading-android-manifest-file –

+0

To czytać ' AndroidManifest.xml' z aplikacji w czasie wykonywania. Pytanie dotyczy gradacji systemu kompilacji, tj. Czasu kompilacji, bez klas Android. –

+0

Znalezione http://stackoverflow.com/questions/11558157/reading-info-from-existing-pom-xml-file-using-gradle i XmlSluper http://groovy.codehaus.org/Reading+XML+using+Groovy % 27s + XmlSlurper. Nie tak czyste rozwiązanie ... –

Odpowiedz

6

Właśnie napisałem to dla ADT 20 (L), Gradle 1,12 i com.android.tools.build:gradle:0.12.2.

Działa ze smakami, rodzajami kompilacji (nie zapomnij o myBuildType.initWith(existingBuildType)) i applicationIdSuffix.

umieścić następujące po zakończeniu android { ... }:

applicationVariants.all { variant -> 
    if (variant.install) { 
     tasks.create(name: "run${variant.name.capitalize()}", type: Exec, dependsOn: variant.install) { 
      description "Installs the APK for ${variant.description}, and then runs the main launcher activity." 
      def getMainActivity = { file -> 
       new XmlSlurper().parse(file).application.activity.find{ it.'intent-filter'.find{ filter -> 
        return filter.action .find{[email protected]() == 'android.intent.action.MAIN'} \ 
         && filter.category.find{[email protected]() == 'android.intent.category.LAUNCHER'} 
       }}[email protected] 
      } 
      doFirst { 
       def activityClass = getMainActivity(variant.processManifest.manifestOutputFile) 
       commandLine android.adbExe, 'shell', 'am', 'start', '-n', "${variant.packageName}/${activityClass}" 
      } 
     } 
    } 
} 

Dla bibliotek trzeba zmienić applicationVariants do libraryVariants: patrz manual.

Aktualizacja: ADT 20, Gradle 2,1 i com.android.tools.build:gradle:0.13.1:

applicationVariants.all { variant -> 
    if (variant.install) { 
     tasks.create(name: "run${variant.name.capitalize()}", type: Exec, dependsOn: variant.install) { 
      description "Installs the APK for ${variant.description}, and then runs the main launcher activity." 
      def getMainActivity = { file -> 
       new XmlSlurper().parse(file).application.activity.find{ it.'intent-filter'.find{ filter -> 
        return filter.action .find{it.'@android:name'.text() == 'android.intent.action.MAIN'  } \ 
         && filter.category.find{it.'@android:name'.text() == 'android.intent.category.LAUNCHER'} 
       }}.'@android:name' 
      } 
      doFirst { 
       def activityClass = getMainActivity(variant.outputs.processManifest.manifestOutputFile) 
       commandLine android.adbExe, 'shell', 'am', 'start', '-n', "${variant.applicationId}/${activityClass}" 

       // or without the XML hacking: commandLine android.adbExe, 'shell', 'monkey', '-p', variant.applicationId, '1' 
      } 
     } 
    } 
} 
+0

Wspaniały show-cast of Gradle power –

10

Można użyć XmlSlurper klasę.

przykład:

AndroidManifest.xml

<manifest package="com.example.your.app"> 

i odzyskać go w Gradle

def manifest = new XmlSlurper().parse(file("AndroidManifest.xml")) 

// returns "com.exmaple.your.app" 
[email protected]() 
+0

Dzięki, to było bardzo pomocne. –

+2

Możesz także użyć pliku 'android.sourceSets.main.manifest.srcFile' zamiast' "AndroidManifest.xml" ', aby automatycznie znaleźć plik manifestu. –