Guest User

Untitled

a guest
Apr 24th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.16 KB | None | 0 0
  1. require 'rubygems'
  2. require 'rake'
  3. require 'rexml/document'
  4. require 'rake/clean'
  5.  
  6. fail "need SCALA_HOME set" unless ENV['SCALA_HOME']
  7. fail "need ANDROID_SDK set" unless ENV['ANDROID_SDK']
  8.  
  9. def manifest
  10. @parsed ||= begin
  11. doc = REXML::Document.new(File.read('AndroidManifest.xml'))
  12. {
  13. :package => doc.root.attribute('package').to_s
  14. }
  15. end
  16. end
  17.  
  18. app_pkg = manifest[:package]
  19. project = app_pkg.gsub(/\./, '_')
  20.  
  21. @spec_pkg = "com.tiggerpalace.campfire.specs"
  22.  
  23. sdk_location = ENV['ANDROID_SDK']
  24. src = 'src'
  25. gen = 'gen'
  26. res = 'res'
  27. bin = 'bin'
  28. libs = 'libs'
  29. assets = 'assets'
  30. @classes = classes = "#{bin}/classes"
  31. classes_jar = "/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar"
  32. scala_jars = %w(scala-compiler.jar scala-library.jar).map { |l| File.join(ENV['SCALA_HOME'], 'lib', l) }
  33. test_jars = FileList.new + Dir.open("test_libs") { |dir|
  34. dir.collect { |f| File.expand_path("test_libs/#{f}") if File.file?("test_libs/#{f}") }
  35. }.compact
  36.  
  37. ap_ = "#{bin}/#{project}.ap_"
  38. apk = "#{bin}/#{project}.apk"
  39.  
  40. android_jar = "#{sdk_location}/platforms/android-2.0/android.jar"
  41. android_aidl = "#{sdk_location}/platforms/android-2.0/framework.aidl"
  42. intermediate_dex_location = "#{bin}/classes.dex"
  43.  
  44. directory gen
  45. directory bin
  46. directory classes
  47. dirs = [gen, bin, classes]
  48.  
  49. CLEAN.include(gen, bin)
  50. CLASSPATH = FileList["#{libs}/**/*.jar"] + scala_jars + test_jars
  51. BOOTCLASSPATH = FileList[android_jar, classes_jar]
  52.  
  53. # Extensions for standard rake classes.
  54. module Rake
  55. class FileList
  56. def to_cp(sep = File::PATH_SEPARATOR)
  57. self.join(sep)
  58. end
  59. end
  60. end
  61.  
  62. def compile_java(dest, *srcdirs)
  63. files = FileList.new
  64. srcdirs.each do |d|
  65. files.include("#{d}/**/*.java")
  66. end
  67.  
  68. unless files.empty?
  69. sh "javac", "-target", "1.5", "-g", "-bootclasspath", BOOTCLASSPATH.to_cp, "-nowarn", "-Xlint:none",
  70. "-sourcepath", srcdirs.join(File::PATH_SEPARATOR), "-d", dest ,"-classpath", CLASSPATH.to_cp, *files
  71. end
  72. end
  73.  
  74. def compile_scala(dest, *srcdirs)
  75. files = FileList.new
  76. srcdirs.each do |d|
  77. files.include("#{d}/**/*.scala")
  78. end
  79.  
  80. sh "scalac", "-g", "-bootclasspath", BOOTCLASSPATH.to_cp, "-nowarn",
  81. "-sourcepath", srcdirs.join(File::PATH_SEPARATOR), "-d", dest ,"-classpath", CLASSPATH.to_cp, *files
  82. end
  83.  
  84. def spec_classes
  85. class_list = FileList.new.include(File.expand_path("#{@classes}/#{@spec_pkg.gsub(/\./, '/')}/**/*.class"))
  86. classes = []
  87. class_list.each do |f|
  88. path = f.split(/\//)
  89. next unless path.last =~ /^\w+\.class$/
  90. path.push path.pop.gsub(/\.class/, "")
  91. classes << path[path.index("classes")+1..-1].join(".")
  92. end
  93. classes
  94. end
  95.  
  96. task :default => :test
  97.  
  98. task :resource_src => dirs do
  99. sh "aapt package -m -J #{gen} -M AndroidManifest.xml -S #{res} -I #{android_jar}"
  100. end
  101.  
  102. task :test => :compile do
  103. spec_classes.each do |klass|
  104. sh "java", "-cp", CLASSPATH.to_cp + ":#{File.expand_path(@classes)}", klass
  105. end
  106. end
  107.  
  108.  
  109. task :aidl => dirs do
  110. FileList["#{src}/**/*.aidl"].each do |f|
  111. sh "aidl -p #{android_aidl} -I #{src} -o #{gen} #{f}"
  112. end
  113. end
  114.  
  115. task :compile => [:resource_src, :aidl] do
  116. compile_java(classes, gen)
  117. compile_scala(classes, src, gen)
  118. end
  119.  
  120. task :shake => [ :compile ] do
  121. sh "java", "-Xmx512M", "-jar", "proguard/proguard.jar",
  122. "-injars", "#{classes}:#{scala_jars.last}(!META-INF/MANIFEST.MF,!library.properties)",
  123. "-outjars", "#{bin}/out.min.jar",
  124. "-libraryjars", android_jar,
  125. "-dontwarn",
  126. "-dontoptimize",
  127. "-dontobfuscate",
  128. "-keep", "public class * extends android.app.Activity"
  129. end
  130.  
  131. task :dex => :shake do
  132. sh "dx", *["-JXmx512M", "--dex", "--output=#{intermediate_dex_location}", "#{bin}/out.min.jar"]
  133. end
  134.  
  135. task :package_resources do
  136. opts = ["package", "-f", "-M", "AndroidManifest.xml", "-I", android_jar, "-S", res, "-F", ap_]
  137. opts += ["-A", assets] if File.directory?(assets)
  138. sh "aapt", *opts
  139. end
  140.  
  141. apkbuilder = Proc.new do |signed|
  142. args = [apk, "-f", intermediate_dex_location, "-rf", src, "-z", ap_]
  143. args += [ "-rj", libs] if File.directory?(libs)
  144. args += ["-u" ] unless signed
  145.  
  146. sh "apkbuilder", *args
  147. end
  148.  
  149. desc "Builds the application and sign it with a debug key."
  150. task :debug => [:dex, :package_resources] do
  151. apkbuilder.call(true)
  152. end
  153.  
  154. desc "Builds the application and sign it with a release key."
  155. task :release => [:dex, :package_resources] do
  156. apkbuilder.call(false)
  157. Rake::Task['package:sign'].invoke
  158. end
  159.  
  160. def adb(*args)
  161. args.unshift '-s', ENV['DEVICE'] if ENV['DEVICE']
  162. sh "adb", *args
  163. end
  164.  
  165. desc "Installs the debug package onto a running emulator or device (DEVICE=<serialno>)."
  166. task :install => :debug do
  167. adb 'install', apk
  168. end
  169.  
  170. desc "Installs the debug package on a running emulator or device that already has the application (DEVICE=<serialno>)."
  171. task :reinstall => :debug do
  172. adb 'install', '-r', apk
  173. end
  174.  
  175. desc "uninstall the application from a running emulator or device (DEVICE=<serialno>)."
  176. task :uninstall do
  177. adb 'uninstall', app_pkg
  178. end
  179.  
  180. namespace :package do
  181. desc "verify signature of the package."
  182. task :verify do
  183. sh "jarsigner", "-verify", "-certs", "-verbose", apk
  184. end
  185.  
  186. desc "sign the package."
  187. task :sign do
  188. alias_name = "alias"
  189. keystore = "keystore"
  190. sh "jarsigner", "-verbose", "-keystore", keystore, apk, alias_name
  191. end
  192. end
Add Comment
Please, Sign In to add comment