2016-08-08 59 views
0

generieren Ich arbeite an einem Android-Projekt, wo es eine Reihe von Ressourcen wie SRC, Res, Assets, etc. Jetzt gibt es eine Anforderung, die ich generieren muss mehrere APKs, die diese Ressourcen verwenden. Und ich muss ein bisschen für jede Quelldatei für jede apk ändern. Zum Beispiel um apk zu bauen. in der ursprünglichen AndroidManifest.xml gibt es ein Paketnamenfeld "com.hello.app", ich muss es zu "com.hello.app.one" ersetzen. Und im ursprünglichen Java-Code wie "HelloApp.java" gibt es so etwas wie "com.hello.app", ich muss es umbenennen als "HelloAppOne.java" und "com.hello.app" durch "com.hello.app" ersetzen .ein". Ähnliches passiert für apk twoWie man mehrere Android-apk mit mehreren Satz von Quellcodes mit Gradle

Die Lösung, die ich finde, besteht darin, zuerst alle Originalcodes und Manifest.xml an einen Platz für jede APK zu kopieren, wobei Gradle Kopieraufgabe verwendet wird. Benenne und ersetze dann den Dateinamen und die Token. Dieser Teil funktioniert.

Aber als nächstes, wenn ich versuche, die apks mit verschiedenen Code-Sets, die ich erstellt habe, zu bauen, stellt sich heraus, etwas stimmte nicht.

Hier ist das Grapple-Skript, das ich herauskomme.

android{ 
    productFlavors { 
     One{ 
      def appFolders = 'build/cache/AppOne'; 
      applicationId = 'com.hello.app.one' 
      sourceSets{ 
       main{     
        manifest.srcFile appFolders + File.separator + 'AndroidManifest.xml' 
        java.srcDirs = [appFolders+'/src'] 
        res.srcDirs = [appFolders+'/res'] 
        assets.srcDirs = [appFolders+'/assets'] 
       } 
      } 
     }   
     Two{ 
      def appFolders = 'build/cache/AppTwo'; 
      applicationId = 'com.hello.app.two' 
      sourceSets{ 
       main{     
        manifest.srcFile appFolders + File.separator + 'AndroidManifest.xml' 
        java.srcDirs = [appFolders+'/src'] 
        res.srcDirs = [appFolders+'/res'] 
        assets.srcDirs = [appFolders+'/assets'] 
       } 
      } 
     } 

    } 
} 

Die Verzeichnisstruktur ist wie

build.gradle 
AndroidManifest.xml 
src/ 
    com.hello.app/ 
res/ 
assets/ 
build/cache/ 
    AppOne/ 
     src/ 
     codes for apk one 
     res/ 
     assets/ 
     AndroidManifest.xml (modified for apk one) 
    AppTwo/ 
     src/ 
     codes for apk two 
     res/ 
     assets/ 
     AndroidManifest.xml (modified for apk two)  

Die Dateien in Ordnern AppOne und AppTwo von Gradle Kopieraufgabe erzeugt werden.

Wenn ich baue, kann ich APKs für jedes Produkt Geschmack bekommen. Wenn ich apk one und apk two auf einem Gerät installiere, stelle ich fest, dass diese beiden genau gleich sind. APK One hat genau den gleichen Namen, Provider mit APK zwei.

Kann mir jemand helfen? Was ist falsch in meinen Skripten? oder Gibt es einen anderen Weg, meine Anforderungen zu erfüllen? Vielen Dank!

Antwort

0

Ich habe keine Erfahrung mit dieser Funktion, aber es sieht aus wie Ihre 'manifest.srcfile' Zeile fehlt ein =. Sollte es sein: manifest.srcFile = appFolders + File.separator + 'AndroidManifest.xml'

HTH, Jim

+0

Nein, funktioniert immer noch nicht –

0

Ihre Struktur wie folgt bilden:

build.gradle 
src/ 
    main/ 
     java/com.hello.app 
     assets 
     res 
     AndroidManifest.xml 
    One/ 
     java/com.hello.app 
     assets 
     res 
    Two/ 
     java/com.hello.app 
     assets 
     res 

so die Idee ist zu nennen Sie Ihre Quellsätze wie die Produktaromen, so, wenn Sie Ihre App mit assembleOne (zum Beispiel) bauen, erhalten Sie Code von Haupt und Ein Quellsätze. Verwenden Sie Haupt für Code, der geteilt werden muss, und One, Zwei für Geschmack-einzigartigen Code. Sie können das Manifest wahrscheinlich auch in main weglassen und ein eindeutiges Manifest in jede Flavor-Quelle setzen, falls dies notwendig ist.

Darüber hinaus können Sie die buildConfigField und manifestPlaceholders direkt von Ihrem build.gradle verwenden, um benutzerdefinierte Werte in die Manifest- oder BuildConfig.java-Klasse zur Build-Zeit zu injizieren.

Hint: Wenn Android Studio verwenden, finden eine build variants Option (linke untere Ecke des Fensters), wenn man sie wechseln können Sie die Quellensatz sehen zur Zeit ausgewählt ist.