[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-8067":3},{"id":4,"name":5,"fullName":6,"owner":5,"repo":5,"description":7,"homepage":8,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":16,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":15,"compositeScore":17,"rankGlobal":9,"rankLanguage":9,"license":18,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":21,"hasPages":19,"topics":22,"createdAt":9,"pushedAt":9,"updatedAt":23,"readmeContent":24,"aiSummary":25,"trendingCount":15,"starSnapshotCount":15,"syncStatus":26,"lastSyncTime":27,"discoverSource":28},8067,"ruboto","ruboto\u002Fruboto","A platform for developing apps using JRuby on Android.","http:\u002F\u002Fruboto.org\u002F",null,"Ruby",2033,161,97,80,0,1,59.23,"MIT License",false,"master",true,[],"2026-06-12 04:00:37","# Ruboto 2\n\nRuboto 2 is a redesign based on an [Android Studio](https:\u002F\u002Fdeveloper.android.com\u002Fstudio\u002F) workflow.\nThis means that the JRuby and Ruboto components will integrate into the standard gradle tooling used by\nregular Android Studio projects.\n\n## Starting a new Ruboto project\n\n* Download and install [Android studio](https:\u002F\u002Fdeveloper.android.com\u002Fstudio\u002F).\n\n* Choose \"Create New Project\" in the startup screen.\n  * Choose \"Phone and Tablet\" and \"No Activity\" for the project template.\n  * Choose \"Java\" for your language and \"Minimum SDK\" should be \"**API 27: Android 8.1 (Oreo)**\" or higher.\n\n* Add a **jcenter** to the `dependencyResolutionManagement\u002Frepositories` section of your `settings.gradle` file:\n  ```groovy\n  dependencyResolutionManagement {\n      ...\n      repositories {\n          ...\n          jcenter()\n      }\n  }\n  ```\n\n* Add the these dependencies to your `app\u002Fbuild.gradle` file:\n  ```groovy\n  dependencies {\n    ...\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation 'com.linkedin.dexmaker:dexmaker:2.19.1'\n    implementation 'me.qmx.jitescript:jitescript:0.4.1'\n    implementation 'com.jakewharton.android.repackaged:dalvik-dx:7.1.0_r7'\n  }\n  ```\n\n* Add `gems.rb` file:\n  ```ruby\n  source 'https:\u002F\u002Frubygems.org\u002F'\n\n  gem 'ruboto', '~>2.0.dev', git: 'https:\u002F\u002Fgithub.com\u002Fruboto\u002Fruboto.git'\n  ```\n\n* Ensure you are using JRuby on the command line\n\n  Create a `.ruby-version` file:\n  ```text\n    jruby\n  ```\n\n* Initialize Ruboto:\n  ```shell\n  jruby -S bundle\n  jruby -S bundle exec ruboto init\n  ```\n\n  This will copy the core files to your project.\n\n\n* Add `app\u002Fgems.rb`\n  ```ruby\n  source 'https:\u002F\u002Frubygems.org\u002F'\n\n  gem 'activerecord', '~>7.0'\n  gem 'activerecord-jdbc-adapter', '~>70.1'\n  gem 'sqldroid', '~>1.0'\n  ```\n\n* Add `app\u002Fupdate_jruby_jar.sh`:\n  ```shell\n  #!\u002Fusr\u002Fbin\u002Fenv bash\n  set -e\n\n  VERSION=\"9.4.2.0\"\n  FULL_VERSION=\"${VERSION}\"\n  # FULL_VERSION=\"${VERSION}-SNAPSHOT\" # Uncomment to use a local snapshot\n  # FULL_VERSION=\"${VERSION}-20190822.050313-17\" # Uncomment to use a remote snapshot\n  JAR_FILE=\"jruby-complete-${FULL_VERSION}.jar\"\n  DOWNLOAD_DIR=\"$HOME\u002FDownloads\"\n  DOWNLOADED_JAR=\"${DOWNLOAD_DIR}\u002F${JAR_FILE}\"\n  SCRIPT_DIR=$( cd -- \"$( dirname -- \"${BASH_SOURCE[0]}\" )\" &> \u002Fdev\u002Fnull && pwd )\n\n  cd $SCRIPT_DIR\n\n  [ ! -d $HOME\u002FDownloads ] && mkdir $HOME\u002FDownloads  # Create the directory if we don't find it\n  [ ! -d .\u002Flibs ] && mkdir .\u002Flibs                    # Create the directory if we don't find it\n\n  cd libs\n  rm -f bcpkix-jdk15on-*.jar bcprov-jdk15on-*.jar bctls-jdk15on-*.jar cparse-jruby.jar generator.jar jline-*.jar jopenssl.jar jruby-complete-*.jar parser.jar psych.jar readline.jar snakeyaml-*.jar\n\n  if test -f \"${DOWNLOADED_JAR}\"; then\n    echo \"Found downloaded JAR\"\n  else\n    echo No \"${DOWNLOADED_JAR}\" - Downloading.\n    curl \"https:\u002F\u002Foss.sonatype.org\u002Fservice\u002Flocal\u002Frepositories\u002Freleases\u002Fcontent\u002Forg\u002Fjruby\u002Fjruby-complete\u002F${VERSION}\u002Fjruby-complete-${VERSION}.jar\" -o \"${DOWNLOADED_JAR}\"\n  fi\n  cp ${DOWNLOADED_JAR} .\n\n  unzip -o -j ${JAR_FILE} '*.jar'\n\n  # FIXME(uwe): Why do we delete these files?\n  zip generator.jar -d json\u002Fext\u002FByteListTranscoder.class\n  zip generator.jar -d json\u002Fext\u002FOptionsReader.class\n  zip generator.jar -d json\u002Fext\u002FUtils.class\n  zip generator.jar -d json\u002Fext\u002FRuntimeInfo.class\n\n  cd - >\u002Fdev\u002Fnull\n\n  cd src\u002Fmain\u002Fjava\n  find * -type f | grep \"org\u002Fjruby\u002F\" | sed -e 's\u002F\\.java\u002F\u002Fg' | sort > ..\u002F..\u002F..\u002Foverridden_classes.txt\n  cd - >\u002Fdev\u002Fnull\n\n  while read p; do\n    unzip -Z1 libs\u002F${JAR_FILE} | grep \"$p\\\\.class\" > classes.txt\n    unzip -Z1 libs\u002F${JAR_FILE} | egrep \"$p(\\\\\\$[^$]+)*\\\\.class\" >> classes.txt\n    if [[ -s classes.txt ]] ; then\n      zip -d -@ libs\u002F${JAR_FILE} \u003Cclasses.txt\n      if [[ ! \"$?\" == \"0\" ]] ; then\n        zip -d libs\u002F${JAR_FILE} \"$p\\\\.class\"\n      fi\n    fi\n    rm classes.txt\n  done \u003C overridden_classes.txt\n\n  rm overridden_classes.txt\n  \n  cd libs\n  rm -f digest.jar\n  cd - >\u002Fdev\u002Fnull\n  ```\n\n* Make `app\u002Fupdate_jruby_jar.sh` executable:\n  ```shell\n    chmod u+x app\u002Fupdate_jruby_jar.sh\n  ```\n\n* Generate `jruby.jar`:\n  ```shell\n    app\u002Fupdate_jruby_jar.sh\n  ```\n\n* Generate the startup activity:\n  ```shell\n    bundle exec ruboto gen class Activity --name StartupActivity\n  ```\n\n* Add the startup activity intent filter to the new activity tag in `app\u002Fsrc\u002Fmain\u002FAndroidManifest.xml`:\n  ```xml\n  \u003Cactivity android:name='StartupActivity' android:exported=\"true\">\n      \u003Cintent-filter>\n          \u003Caction android:name=\"android.intent.action.MAIN\" \u002F>\n          \u003Ccategory android:name=\"android.intent.category.LAUNCHER\" \u002F>\n          \u003Caction android:name=\"android.intent.action.VIEW\" \u002F>\n      \u003C\u002Fintent-filter>\n  \u003C\u002Factivity>\n  ```\n\n* Declare the Ruboto components and SplashActivity in `app\u002Fsrc\u002Fmain\u002FAndroidManifest.xml`\n  ```xml\n  \u003Cactivity android:name='org.ruboto.RubotoActivity' \u002F>\n  \u003Cactivity android:name='org.ruboto.RubotoDialog' android:theme='@android:style\u002FTheme.Dialog' \u002F>\n  \u003Cservice\n      android:name='org.ruboto.RubotoService'\n      android:exported='false' \u002F>\n  \u003Cactivity\n      android:name='org.ruboto.SplashActivity'\n      android:configChanges='orientation|screenSize'\n      android:exported='false'\n      android:noHistory='true' \u002F>\n  ```\n\n  **Rember to sync the gradle config after the changes.**\n\n \n* Start your app!\n\n## Updating app gems\n\nUpdate your `app\u002Fgems.rb` (or `app\u002FGemfile`) and run\n  ```shell\n  bundle exec rake bundle\n  ```\n\n## Adding Ruboto to an existing Android Studio project\n\nHOWTO missing.  Pull requests welcome!\n\n# Ruboto 1.x\n\nLooking for Ruboto 1.x?  Switch to the [ruboto_1.x](https:\u002F\u002Fgithub.com\u002Fruboto\u002Fruboto\u002Ftree\u002Fruboto_1.x) branch.\n","Ruboto是一个基于JRuby开发Android应用的平台。它允许开发者使用Ruby语言编写Android应用程序，并通过集成到标准的Android Studio项目中，利用Gradle工具链来管理构建过程。核心功能包括支持最新的Android API版本以及与JRuby和相关库的无缝集成。适合于希望在Android平台上使用Ruby进行快速原型设计或开发完整应用的场景，特别是对于熟悉Ruby且希望避免Java\u002FKotlin复杂性的开发者来说尤为适用。",2,"2026-06-11 03:15:52","top_language"]