草庐IT

android - 单独使用Android SDK的Hello world(无IDE)

coder 2023-11-19 原文

我的目标是:

  • 在一个简单的程序
  • 上测试基本开发工具
  • 将程序扩展为有用的应用程序

  • 与IDE相比,我更喜欢使用小型的独立工具。与声明式(XML)相比,我更喜欢以过程式或命令式(普通的Java)编码。

    我安装了独立的Android SDK as instructed。我至少需要其他工具(文本编辑器,命令 shell 和JDK)。但是我能找到的唯一入门说明与Android Studio,Eclipse或其他IDE绑定(bind)。我不能跟随他们。

    如何使用文本编辑器编写Java程序以在Android设备上显示“Hello world”?如何使用SDK仿真器对其进行测试?请给我指示。

    最佳答案

    这些是最终为我工作的说明。我通过解构Google的Ant脚本来获得它们,Rob的答案就是基于该脚本。

    The following content is from "Android programming without an IDE" from Stack Overflow Documentation (archived here); copyright 2017 by geekygenius, Michael Allan, cascal, Doron Behar, mnoronha, and AndroidMechanic; licensed under CC BY-SA 3.0. An archive of the full Stack Overflow Documentation content can be found at archive.org, in which this example is indexed by its topic ID: 85, as example: 9496.



    这是一个简约的Hello World示例,仅使用最基本的Android工具。

    要求和假设
  • Oracle JDK 1.7或更高版本
  • Android SDK工具(仅command line tools)

  • 本示例假设使用Linux。您可能必须针对自己的平台调整语法。

    设置Android SDK

    解压缩SDK版本后:
  • 使用SDK管理器安装其他软件包。
    不要按照 bundle 的Readme.txt中的指示使用android update sdk --no-ui
    它会下载约30 GB的不必要文件。
    而是使用交互式SDK管理器android sdk获得建议的最小包装数量。
  • 将以下JDK和SDK目录追加到执行PATH。
    这是可选的,但是下面的说明是假定的。
  • JDK/bin
  • SDK/平台工具
  • SDK/工具
  • SDK/build-tools/LATEST(在步骤1中安装)
  • 创建一个Android虚拟设备。
    使用交互式AVD管理器(android avd)。
    您可能需要摆弄一些东西并寻求建议。
    on-site instructions并不总是有用。

    (您也可以使用自己的设备)
  • 运行设备:
    emulator -avd DEVICE
    
  • 如果设备屏幕似乎被锁定,请滑动以将其解锁。

    在编写应用程序代码时,使其保持运行状态。

  • 编写应用程式
  • 更改为空的工作目录。
  • 制作源文件:
    mkdir --parents src/dom/domain
    touch src/dom/domain/SayingHello.java
    

    内容:
    package dom.domain;
    import android.widget.TextView;
    
    public final class SayingHello extends android.app.Activity
    {
        protected @Override void onCreate( final android.os.Bundle activityState )
        {
            super.onCreate( activityState );
            final TextView textV = new TextView( SayingHello.this );
            textV.setText( "Hello world" );
            setContentView( textV );
        }
    }
    
  • 添加 list :
    touch AndroidManifest.xml
    

    内容:
    <?xml version='1.0'?>
    <manifest xmlns:a='http://schemas.android.com/apk/res/android'
     package='dom.domain' a:versionCode='0' a:versionName='0'>
        <application a:label='Saying hello'>
            <activity a:name='dom.domain.SayingHello'>
                 <intent-filter>
                    <category a:name='android.intent.category.LAUNCHER'/>
                    <action a:name='android.intent.action.MAIN'/>
                    </intent-filter>
                </activity>
            </application>
        </manifest>
    
  • 为声明的资源创建一个子目录:
    mkdir res
    

    现在将其留空。

  • 构建代码
  • 生成资源声明的源。
    在此处替换为 SDK 的正确路径,
    以及要针对其构建的已安装 API (例如“android-23”):
    aapt package -f \
      -I SDK/platforms/android-API/android.jar \
      -J src -m \
      -M AndroidManifest.xml -S res -v
    

    资源声明(下面将进一步描述)实际上是可选的。
    同时,如果res/仍然为空,则上述调用不执行任何操作。
  • 将源代码编译为Java字节码(.java→.class):
    javac \
      -bootclasspath SDK/platforms/android-API/android.jar \
      -classpath src -source 1.7 -target 1.7 \
      src/dom/domain/*.java
    
  • 将字节码从Java转换为Android(.class→.dex):

    首先使用Jill(.class→.jayce):
    java -jar SDK/build-tools/LATEST/jill.jar \
      --output classes.jayce src
    

    然后 jack (.jayce→.dex):
    java -jar SDK/build-tools/LATEST/jack.jar \
      --import classes.jayce --output-dex .
    

    Android字节码曾经被称为“Dalvik可执行代码”,因此被称为“dex”。

    如果愿意,您可以只打一个电话就可以替换步骤11和12。
    它可以直接从Java源代码(.java→.dex)进行编译。
    但是使用javac进行编译有很多优点。
    这是一个更广为人知,文档更丰富,适用范围更广的工具。
  • 打包资源文件,包括 list :
    aapt package -f \
      -F app.apkPart \
      -I SDK/platforms/android-API/android.jar \
      -M AndroidManifest.xml -S res -v
    

    这样会产生部分APK文件(Android应用程序包)。
  • 使用ApkBuilder工具制作完整的APK:
    java -classpath SDK/tools/lib/sdklib.jar \
      com.android.sdklib.build.ApkBuilderMain \
      app.apkUnalign \
      -d -f classes.dex -v -z app.apkPart
    

    它警告:“此工具已弃用。有关详细信息,请参阅--help。”
    如果--help失败并显示ArrayIndexOutOfBoundsException
    然后改为不传递任何参数:
    java -classpath SDK/tools/lib/sdklib.jar \
      com.android.sdklib.build.ApkBuilderMain
    

    它说明不推荐使用CLI(ApkBuilderMain)
    支持直接调用Java API(ApkBuilder)。
    (如果您知道如何从命令行执行此操作,请更新此示例。)
  • 优化APK(recommended practice)的数据对齐方式:
    zipalign -f -v 4 app.apkUnalign app.apk
    

  • 安装和运行
  • 将应用程序安装到Android设备:
    adb install -r app.apk
    
  • 启动应用程序:
    adb shell am start -n dom.domain/.SayingHello
    

    它应该运行并打个招呼。

  • 就这样。这就是使用基本的Android工具打个招呼所需要的。

    声明资源

    本部分是可选的。
    简单的“hello world”应用程序不需要资源声明。
    如果您的应用程序也不需要它们,
    那么您可以通过省略步骤10来简化构建过程,
    并从步骤13中删除对res/目录的引用。

    否则,这是有关如何声明资源的简短示例,
    以及如何引用它。
  • 添加资源文件:
    mkdir res/values
    touch res/values/values.xml
    

    内容:
    <?xml version='1.0'?>
    <resources>
        <string name='appLabel'>Saying hello</string>
    </resources>
    
  • 从XML list 中引用资源。
    这是一种声明式的引用方式:
    <!-- <application a:label='Saying hello'> -->
         <application a:label='@string/appLabel'>
    
  • 从Java源引用相同的资源。
    这是当务之急的引用:
    // v.setText( "Hello world" );
       v.setText( "This app is called "
         + getResources().getString( R.string.appLabel ));
    
  • 通过重新构建,重新安装来测试以上修改
    并重新运行该应用程序(步骤10-17)。

    它应该重新启动,并说:“此应用程序称为“打招呼”。

  • 卸载应用
    adb uninstall dom.domain
    

    也可以看看
  • working example-使用上述命令
  • 的有效构建脚本

    关于android - 单独使用Android SDK的Hello world(无IDE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29178552/

    有关android - 单独使用Android SDK的Hello world(无IDE)的更多相关文章

    1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

      我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

    2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

      我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

    3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

      类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

    4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

      很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

    5. ruby - 在 Ruby 中使用匿名模块 - 2

      假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

    6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

      我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

    7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

      关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

    8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

      我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

    9. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

      我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

    10. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

      我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

    随机推荐