由于在同一个应用程序的 android 市场上同时提供免费和付费版本很受欢迎,我决定做同样的事情。最初我只是复制了完整的代码库并在这里和那里调整了一些代码(添加了广告,内置了一些限制等),因为当时没有选择做库项目,但这给我留下了两个管理修复程序非常糟糕的项目到错误,因为我需要做两次。
从 r14 开始,我们可以使用带有资源的库项目,因此据我所知,这将是解决这个特定问题的好方法。因此我已经阅读了 library projects和考虑,我很想知道不同版本的项目所需的最小文件量是多少。因此,我的问题是;
最佳答案
如果我正确理解您的问题,您想创建多个彼此相似的 Android 应用程序(即,有很多相同的源代码),但它们在特定(次要)方式上有所不同,并且您想要其中的每一个应用程序具有独特的包,以便它可以在应用程序商店(例如 Google Play)上单独上传和分发。项目库是实现这些目标的绝佳工具。
我假设您的各种版本之间的差异很小,涉及资源和应用程序名称和包等内容,以及为付费版本打开某些功能而在免费版本中关闭它们的开关。
即使情况并非如此,通过以下面描述的方式使用多态性,您的各种应用程序可能会有很大的不同,并且仍然共享一个公共(public)项目库。
可以在 Eclipse 中以与定义任何 Android 项目相同的方式定义项目库,但它被标记为项目库(通过选中库的项目属性对话框的 Android 页面底部附近的“是库”框) 并且不能单独编译和运行。相反,它旨在通过引用包含在作为实际应用程序的一个或多个其他项目中(通过在每个此类应用程序的“项目属性”对话框的 Android 页面上添加对其的引用)。这些应用程序将使用项目库,因此将共享其代码和功能。
每个这样的引用应用程序都有自己的 list 文件(可以在其中声明它们各自的不同包),并且它们还可以定义自己的类(包括从项目库的 Activity 和/或应用程序类派生的类),以便这些类可以针对使用项目库的每个应用程序进行多态特化(例如,通过覆盖方法或通过为在项目库的 Activity 或应用程序派生类中定义为抽象的方法提供定义),尽管您也可以使用那些无需修改的库类(前提是它们不是抽象的),只需在使用库的每个应用程序的 list 文件(例如,在 Activity 或应用程序标签中)引用它们,就像引用定义的 Activity 或应用程序派生类一样在应用程序本身内。
如果您决定使用这种方法,那么您会将您的主要源文件放在一个项目库中,并为您想要制作的每个应用程序创建一个单独的项目,每个项目都将引用项目库。项目库的 list 文件将被使用该库创建的任何项目的 list 覆盖(实际上,我认为项目库自己的 list 被完全忽略,不仅被覆盖,但创建 list 仍然很有用库,以便您可以手动模板 - 复制和编辑 - 从库自己的 list 中使用它的每个项目的 list )。
我已经使用这种方法创建了多个共享一些相同功能的 Android 应用程序,它对我来说效果很好。
关于包命名,任何旧的包名称都适用于库项目,但当然,为库项目的包使用与用于使用它的各种个人(例如,免费与付费)应用程序相同的前缀当然是有意义的,以“.library”作为名称的最后一部分,而各种应用程序的结尾可能是“.myappfree”和“.myapppaid”。自然,您会希望对库的包前缀使用反向域名约定来防止冲突,就像您对已发布应用程序的包名称所做的那样。
在 Windows 中,用于比较代码库的一个不错的开源工具是 WinMerge:
http://winmerge.org/
但是,如果我处于您的位置,我只会使用此工具手动识别差异,而不会尝试使用它来自动将您的代码重构为库项目。这最好在您自己(手动)控制下完成。
最后,作为替代方案,您可以考虑使用一个免费的应用程序,该应用程序默认具有您的免费应用程序的功能,并可以选择通过应用程序内付款升级到您的完整应用程序的功能(在同一 APK 中提供),而不是拥有单独的免费和付费应用程序。在过去的几个月里(随着 IAB 版本 3 的发布),应用内支付有了很大的改进,虽然仍然存在一些小故障,但它们已经成为比免费/完全二分法更实用的替代方案第一的。
关于android - 具有共享代码库的多个应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9515230/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序