Android学习19 -- 手搓App

1 前言

之前工作中,很多时候要搞一个简单的app去验证底层功能,Android studio又过于重型,之前用gradle,被版本匹配和下载外网包折腾的堪称噩梦。所以搞app都只有找应用的同事帮忙。一直想知道一些简单的app怎么能手搓一下,简单快速的搞出来。趁着现在有时间,终于体验了一把。

我的环境是windows10,终端设备没有用虚拟机,用了一个安卓平板,荣耀平板5。

2 代码结构

代码架构如下:

其中要自己写的就是两个文件,MainActivity.java和AndroidManifest.xml。如下:

MainActivity.java

package com.example.simpleapp;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView tv = new TextView(this);
        tv.setText("Hello, Android!");
        setContentView(tv);
    }
}

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.simpleapp"
    android:versionCode="1"
    android:versionName="1.0">
    
    <application android:label="SimpleApp">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

关于这个文件,简单的介绍如下:

`AndroidManifest.xml` 是 Android 应用开发中的核心配置文件,为系统和开发者提供应用的关键信息,以下是简要介绍:

1. **基本信息声明** - 定义应用包名,作为应用唯一标识。 - 包含版本号,`versionCode` 供系统识别版本新旧,`versionName` 面向用户展示。

2. **组件声明** - **Activity**:代表应用界面,可设置为启动界面。 - **Service**:用于后台长时间运行任务。 - **Broadcast Receiver**:接收系统或应用广播消息。 - **Content Provider**:实现不同应用间的数据共享。

3. **权限声明**:列出应用正常运行所需权限,部分危险权限需运行时动态请求。

4. **其他配置** - 配置应用图标、名称、主题,决定应用外观展示。 - 声明应用对硬件特性和 Android 系统版本的要求。

3 环境配置

之后就是要配置一大堆组件了。

其中platform-tools,cmdline-tools,jdk-23.0.1都要自己下载,前面两个可以去安卓官网下,jdk去甲骨文网站下。Adnroid_SDK可以用过cmdline-tools里面的sdkmanager.bat自动下载。

platform-tools里面主要是adb,fastboot这些工具。

cmdline-tools主要就是开发中的工具,是一堆bat文件。sdkmanager管理SDK的,avdmanager管理虚拟机的,lint是代码静态检查,apkanalyzer是APK文件分析。

撸apk,主要要用sdkmanager。使用list命令可以看现在可以下载哪些。

sdkmanager --list --sdk_root=D:\Tools\Adnroid_SDK

先安装build tool

sdkmanager --install "build-tools;35.0.0"

我的目标设备是荣耀平板5,很老的一个7寸平板。看了一下设备的OS是Android9, Android9对应的SDK版本是28,安装的命令是:

sdkmanager --install "platforms;android-28" --sdk_root=D:\Tools\Adnroid_SDK

之后就是设置环境变量,主要是ANDROID_HOME,JAVA_HOME,然后jdk的bin,build-tools,platform-tools这几个都要加到PATH之中。

4 操作步骤

然后就可以开撸。

4.1 编译java文件

首先是编译java文件

javac -d bin -classpath "D:\Tools\Adnroid_SDK\platforms\android-28\android.jar" src/com/example/simpleapp/MainActivity.java

之后会在bin下面生成com/example/simpleapp/MainActivity.class。

4.2 生成dex

然后生成classes.dex,输入就是上一步的class文件。

d8 --output=out/ bin/com/example/simpleapp/MainActivity.class 

之后会在out下生成classes.dex。看了一下介绍,安卓的虚拟机的字节码是DEX bytecode,和一般的虚拟机还有不同,所以这里要处理下。

d8: This tool is the DEX compiler. It takes Java bytecode (.class files) and converts it into DEX bytecode (.dex files), which is what the Android Runtime (ART) executes.

4.3 生成apk

之后使用aapt生成apk,这一步的输入参数就是那个AndroidManifest.xml,还有Android9的运行库jar。

aapt package -f -m -F out/app.unsigned.apk -M AndroidManifest.xml -I D:\Tools\Adnroid_SDK\platforms\android-28\android.jar

此时会生成一个基础的app.unsigned.apk。

然后将之前的class.dex加到apk之中。这里貌似直接用zip拖进去也行。。

aapt add out/app.unsigned.apk out/classes.dex

aapt (Android Asset Packaging Tool): This tool is used to package resources (like layouts, images, and strings) into a compiled format that Android can understand. It also handles the creation of the resources.arsc file and the AndroidManifest.xml processing.

apk本质其实就是一个zip文件,可以直接用winrar打开,此时内容如下:

有的介绍说要对齐一下。但是我没对齐也可以的。

zipalign -v 4 build/apk/app-debug-unaligned.apk build/apk/app-debug.apk

4.4 签名

最后就是签名,这一步感觉倒是挺无聊的。但是不签名,确实无法安装:

签名的步骤如下: 

keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-key
apksigner sign --ks my-release-key.jks --out out/app.signed.apk out/app.unsigned.apk

签完名,apk里面会多一个META-INF文件夹。 

最后的文件大小大概是8k,不是我吹牛,这么小的安卓app绝对堪称罕见中的罕见了。。

5 运行

之后就是推送APK。当然,之前要进入开发者模式,然后把usb调试打开。

adb install out/app.signed.apk

然后就提示是否安装:

(这个图是另一个实验的app)

之后会提示说有一些东西太老之类的,但是可以看到期待的画面了。

6 参考和其他

最后,谷歌官方是很不推荐这种做法,推荐用Android Studio和Gradle,理由如下:

Important Considerations
Complexity: This process is very manual and error-prone.
Maintenance: Maintaining a project built this way is extremely difficult.
Features: You're missing out on all the features and optimizations that Gradle provides.
Dependencies: Managing dependencies manually would be a nightmare.
Android Studio: Android Studio and Gradle are designed to make Android development much easier.
Android SDK: You need to have the Android SDK installed and configured correctly.
Environment Variables: You need to set the ANDROID_HOME environment variable.
Missing files: You need to create the res directory and the strings.xml file.


Conclusion
While you can technically create a very simple Android 9 APK using aapt and d8 directly, it's strongly discouraged for anything beyond experimentation or very specific edge cases. Gradle is the standard build system for Android, and it provides a much more robust, efficient, and maintainable way to develop Android apps. I highly recommend using Gradle unless you have a very compelling reason not to.

之前倒是写过一个Gardle的文,但是很简单,也没有涉及到apk这一层。可以看看:Android学习18 -- Gradle_resourcehashescache.bin-CSDN博客 

参考:

ChatGPT和Gemini

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/964252.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实验六 项目二 简易信号发生器的设计与实现 (HEU)

声明&#xff1a;代码部分使用了AI工具 实验六 综合考核 Quartus 18.0 FPGA 5CSXFC6D6F31C6N 1. 实验项目 要求利用硬件描述语言Verilog&#xff08;或VHDL&#xff09;、图形描述方式、IP核&#xff0c;结合数字系统设计方法&#xff0c;在Quartus开发环境下&#xff…

< 自用文儿 > 下载 MaxMind GeoIP Databases 对攻击的 IP 做 地理分析

起因 两个 VPM/VPS&#xff0c;安装了 fail2ban 去拦截密码穷举攻击。每天的记录都在增长&#xff0c;以前复制屏幕输出就行&#xff0c;一屏的内容还容易粘贴出来的。昨天已经过 500 条&#xff0c;好奇 fail2ban 是如何存储这些内容的&#xff1f;就发现它在使用 SQLite3 数…

通过IP地址查看终端具体位置

最近关于deepseek的热度不断&#xff0c;无论是deepseek的优秀性价比和能力&#xff0c;以及deepseek遭受到海外攻击然后国内反击的AI上甘岭&#xff0c;随之而来的是铺天盖地的营销号&#xff0c;要擦亮自己的眼睛&#xff0c;要勇于质疑和证实网络言论的真实性。 其中一点&am…

【Linux探索学习】第二十八弹——信号(下):信号在内核中的处理及信号捕捉详解

Linux学习笔记&#xff1a; https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; 在前面我们已经学习了有关信号的一些基本的知识点&#xff0c;包括&#xff1a;信号的概念、信号产生和信号处理等&#xff0c;今天我们重…

【Redis】主从模式,哨兵,集群

主从复制 单点问题&#xff1a; 在分布式系统中&#xff0c;如果某个服务器程序&#xff0c;只有一个节点&#xff08;也就是一个物理服务器&#xff09;来部署这个服务器程序的话&#xff0c;那么可能会出现以下问题&#xff1a; 1.可用性问题&#xff1a;如果这个机器挂了…

1.PPT:天河二号介绍【12】

目录 NO1 NO2.3.4.5 NO6.7.8.9​ NO1 PPT&#xff1a;新建一个空白演示文档→保存到考生文件夹下&#xff1a;天河二号超级计算机.pptx幻灯片必须选择一种设计主题&#xff1a;设计→主题&#xff08;随便选中一种&#xff09;幻灯片的版式&#xff1a;开始→版式&#x…

基于python的体育新闻数据可视化及分析

项目 &#xff1a;北京冬奥会体育新闻数据可视化及分析 摘 要 随着社会的不断进步与发展&#xff0c;新时代下的网络媒体获取的信息也更加庞大和繁杂&#xff0c;相比于传统信息来源更加难以分析和辨别&#xff0c;造成了新时代媒体从业者撰写新闻的难度。在此背景下&#xff…

WPS计算机二级•幻灯片的配色、美化与动画

听说这是目录哦 配色基础颜色语言❤️使用配色方案&#x1fa77;更改PPT的颜色&#x1f9e1;PPT动画添加的原则&#x1f49b;PPT绘图工具&#x1f49a;自定义设置动画&#x1f499;使用动画刷复制动画效果&#x1fa75;制作文字打字机效果&#x1f49c;能量站&#x1f61a; 配色…

数据结构实战之线性表(三)

目录 1.顺序表释放 2.顺序表增加空间 3.合并顺序表 4.线性表之链表实现 1.项目结构以及初始代码 2.初始化链表(不带头结点) 3.链表尾部插入数据并显示 4.链表头部插入数据 5.初始化链表&#xff08;带头结点&#xff09; 6.带头结点的链表头部插入数据并显示 7.带头结…

SwiftUI 在 Xcode 预览修改视图 FetchedResults 对象的属性时为什么会崩溃?

概览 从 SwiftUI 诞生那天起&#xff0c;让秃头码农们又爱又恨的 Xcode 预览就在界面调试中扮演了及其重要的角色。不过&#xff0c;就是这位撸码中的绝对主角却尝尝在关键时刻“掉链子”。 比如当修改 SwiftUI 视图中 FetchedResults 对象的属性时&#xff0c;Xcode 预览可能…

【字节青训营-7】:初探 Kitex 字节微服务框架(使用ETCD进行服务注册与发现)

本文目录 一、Kitex概述二、第一个Kitex应用三、IDL四、服务注册与发现 一、Kitex概述 长话短说&#xff0c;就是字节跳动内部的 Golang 微服务 RPC 框架&#xff0c;具有高性能、强可扩展的特点&#xff0c;在字节内部已广泛使用。 如果对微服务性能有要求&#xff0c;又希望…

51单片机入门_05_LED闪烁(常用的延时方法:软件延时、定时器延时;while循环;unsigned char 可以表示的数字是0~255)

本篇介绍编程实现LED灯闪烁&#xff0c;需要学到一些新的C语言知识。由于单片机执行的速度是非常快的&#xff0c;如果不进行延时的话&#xff0c;人眼是无法识别(停留时间要大于20ms)出LED灯是否在闪烁所以需要学习如何实现软件延时。另外IO口与一个字节位的数据对应关系。 文…

JVM的GC详解

获取GC日志方式大抵有两种 第一种就是设定JVM参数在程序启动时查看&#xff0c;具体的命令参数为: -XX:PrintGCDetails # 打印GC日志 -XX:PrintGCTimeStamps # 打印每一次触发GC时发生的时间第二种则是在服务器上监控:使用jstat查看,如下所示&#xff0c;命令格式为jstat -gc…

基于python去除知乎图片水印

基于python去除知乎图片水印 背景&#xff1a;看到知乎技术文章里面的图片非常好&#xff0c;但是下载下来都是带有水印的&#xff0c;并不是不尊重别人的版权和劳动成果&#xff0c;纯粹的是洁癖&#xff0c;总感觉水印打上去很难受~~~ 实在想去掉水印&#xff0c;但是又不会P…

Android学习20 -- 手搓App2(Gradle)

1 前言 昨天写了一个完全手搓的&#xff1a;Android学习19 -- 手搓App-CSDN博客 后面谷歌说不要用aapt&#xff0c;d8这些来搞。其实不想弄Gradle的&#xff0c;不过想着既然开始了&#xff0c;就多看一些。之前写过一篇Gradle&#xff0c;不过是最简单的编译&#xff0c;不涉…

【愚公系列】《循序渐进Vue.js 3.x前端开发实践》051-案例:教务系统学生列表页面

标题详情作者简介愚公搬代码头衔华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xff0c;阿里云签约作者&#xff0c;腾讯云优秀博主&…

毕业设计:基于深度学习的高压线周边障碍物自动识别与监测系统

目录 前言 课题背景和意义 实现技术思路 一、算法理论基础 1.1 卷积神经网络 1.2 目标检测算法 1.3 注意力机制 二、 数据集 2.1 数据采集 2.2 数据标注 三、实验及结果分析 3.1 实验环境搭建 3.2 模型训练 3.2 结果分析 最后 前言 &#x1f4c5;大四是整个大学…

2025.2.1——八、Web_php_wrong_nginx_config

题目来源&#xff1a;攻防世界 Web_php_wrong_nginx_config 目录 一、打开靶机&#xff0c;整理信息 二、解题思路 step 1&#xff1a;找找解题入口 step 2&#xff1a;抓包修改信息&#xff0c;得到配置文件 step 3&#xff1a;找到突破口&#xff0c;进行文件遍历 st…

Netty中用了哪些设计模式?

大家好&#xff0c;我是锋哥。今天分享关于【Netty中用了哪些设计模式&#xff1f;】面试题。希望对大家有帮助&#xff1b; Netty中用了哪些设计模式&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Netty 是一个基于 Java 的高性能网络应用框架&#…

【办公类-99-01】20250201学具PDF打印会缩小一圈——解决办法:换一个PDF阅读器

背景需求&#xff1a; 2024年1月13日&#xff0c;快要放寒假了&#xff0c;组长拿着我们班的打印好的一叠教案来调整。 “前面周计划下面的家园共育有调整&#xff0c;你自己看批注。” “还有你这个教案部分的模版有问题&#xff0c;太小&#xff08;窄&#xff09;了。考虑…