Android学习19 -- 手搓App

devtools/2025/2/7 18:10:53/

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 {@Overrideprotected 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


http://www.ppmy.cn/devtools/156893.html

相关文章

Kali Linux 渗透测试环境配置(Metasploit + Burp Suite)

一、Kali Linux 系统准备 首先&#xff0c;确保你已经成功安装了 Kali Linux 系统。可以从官方网站下载镜像文件&#xff0c;并通过 U 盘引导安装等常规方式完成系统部署。建议使用最新稳定版本&#xff0c;以获取最新的软件包支持和安全更新。 安装完成后&#xff0c;登录系…

自指学习:AGI的元认知突破

文章目录 引言:从模式识别到认知革命一、自指学习的理论框架1.1 自指系统的数学定义1.2 认知架构的三重反射1.3 与传统元学习的本质区别二、元认知突破的技术路径2.1 自指神经网络架构2.2 认知效能评价体系2.3 知识表示的革命三、实现突破的关键挑战3.1 认知闭环的稳定性3.2 计…

大数据sql查询速度慢有哪些原因

1.索引问题 可能缺少索引&#xff0c;也有可能是索引不生效 2.连接数配置&#xff1a;连接数过少/连接池比较小 连接数过 3.sql本身有问题&#xff0c;响应比较慢&#xff0c;比如多表 4.数据量比较大 -这种最好采用分表设计 或分批查询 5.缓存池大小 可能是缓存问题&#xff…

【Elasticsearch】 Composite Aggregation 详解

1.什么是 Composite Aggregation&#xff1f; Composite Aggregation 是 Elasticsearch 中的一种特殊聚合方式&#xff0c;适用于需要分页展示的聚合结果。它与传统的聚合方式不同&#xff0c;采用了基于游标的分页模型。这种聚合方式可以高效地处理多级聚合中的所有桶&#x…

Deepseek 接入Word处理对话框(隐藏密钥)

硅基流动邀请码&#xff1a;1zNe93Cp 邀请链接&#xff1a;网页链接 亲测deepseek接入word&#xff0c;自由调用对话&#xff0c;看截图有兴趣的复用代码&#xff08;当然也可以自己向deepseek提问&#xff0c;帮助你完成接入&#xff0c;但是提问逻辑不一样给出的答案是千差万…

OpenAI 宣布免费开放 ChatGPT 搜索,无需注册

在科技飞速发展的今天&#xff0c;人工智能领域的每一次突破都犹如一颗重磅炸弹&#xff0c;震撼着整个世界。北京时间 2025 年 2 月 6 日凌晨&#xff0c;OpenAI 宣布向所有用户开放 ChatGPT 搜索功能&#xff0c;且无需注册&#xff0c;这一消息瞬间引发了全球范围内的广泛关…

C语言按位取反【~】详解,含原码反码补码的0基础讲解【原码反码补码严格意义上来说属于计算机组成原理的范畴,不过这也是学好编程初级阶段的必修课】

目录 概述【适合0基础看的简要描述】&#xff1a; 上述加粗下划线的内容提取版&#xff1a; 从上述概述中提取的核心知识点&#xff0c;需背诵&#xff1a; 整数【包含整数&#xff0c;负整数和0】的原码反码补码相互转换的过程图示&#xff1a; 过程详细刨析&#xff1a;…

PyQt4学习笔记2】Qt 的 Model/View 架构

目录 一、Model/View 架构 1. Model/View 架构的核心思想 2. Model/View 架构的优势 3. 常见的 Model 和 View 类 模型类 (Model) 视图类 (View) 4. 信号和槽机制 5. 示例代码 6. 数据操作 设置数据(将特定位置的数据替换掉) 插入和删除数据 7. 自定义模型 8. 总结 二、Model/V…