无构建系统环境下手动集成AndroidX库的技术求助
手动集成AndroidX依赖(无构建系统)
因为笔记本配置低,我没使用Android Studio,而是用Vscodium搭配自定义脚本编译Android应用,目前已能成功构建项目,原编译脚本如下:
#!/bin/bash rm app.apk app.apk.idsig MainActivity.jar classes.dex cd R/com/example/helloworld rm R.class R.java 'R$layout.class' cd ../../../../ ~/Android/build-tools/34.0.0/aapt2 compile layout/MainUI.xml -o layout ~/Android/build-tools/34.0.0/aapt2 link layout/layout_MainUI.xml.flat -o app.apk -I ~/Android/platforms/android-34/android.jar --manifest AndroidManifest.xml --java R cd R/com/example/helloworld javac R.java cd ../../../../ kotlinc -classpath /home/mousin/Android/platforms/android-34/android.jar:/home/mousin/Downloads/app/R MainActivity.kt -d MainActivity.jar ~/Android/build-tools/34.0.0/d8 MainActivity.jar ~/Android/build-tools/34.0.0/aapt add app.apk classes.dex echo "5949147123" | ~/Android/build-tools/34.0.0/apksigner sign --ks mousin.keystore app.apk adb install app.apk
现在要集成AndroidX库用新特性,已经拿到相关aar及源码,但遇到两个问题:
- 问题1:没法处理
Theme.Appcompat这类XML依赖项 - 问题2:已经收集了所需类文件,编译没报错,但运行时出现类找不到异常
我试过让MainActivity继承AppCompatActivity,也从Google Maven仓库收集了依赖库,但还是有运行时异常;XML方面找过库的res文件但没找到,下面是手动处理AndroidX依赖的解决方法:
解决XML资源依赖(Theme.Appcompat等)
- 获取AndroidX库的资源文件:
从Maven仓库下载对应AndroidX库的AAR包(比如androidx.appcompat:appcompat),解压后能找到res目录,里面包含主题、样式等资源文件。 - 编译AndroidX的资源文件:
在自己的布局编译之后,加上AndroidX资源的编译命令:# 编译自身布局 ~/Android/build-tools/34.0.0/aapt2 compile layout/MainUI.xml -o layout # 编译appcompat解压后的res目录(假设路径为appcompat-res) ~/Android/build-tools/34.0.0/aapt2 compile --dir appcompat-res -o appcompat-res-flat - 链接阶段加入AndroidX资源:
修改aapt2 link命令,加入编译好的AndroidX资源flat文件,同时添加--auto-add-overlay参数解决资源覆盖问题,还要引用AAR里的classes.jar:~/Android/build-tools/34.0.0/aapt2 link layout/layout_MainUI.xml.flat appcompat-res-flat/*.flat \ -o app.apk \ -I ~/Android/platforms/android-34/android.jar \ -I appcompat-classes.jar \ # 替换成你解压appcompat AAR得到的classes.jar路径 --manifest AndroidManifest.xml \ --java R \ --auto-add-overlay - 修正Manifest里的主题:
把AndroidManifest.xml中的android:theme改成AndroidX对应的主题,比如@style/Theme.AppCompat.Light.NoActionBar。
解决运行时类找不到异常
- 收集所有依赖的AndroidX jar包:
AndroidX库有依赖链,比如appcompat依赖core-ktx、collection等,要从Maven仓库把所有间接依赖的jar包都下载下来,不能只下单个库。 - 编译阶段加入所有依赖jar:
修改kotlinc命令,把所有AndroidX的jar包加入classpath:kotlinc -classpath "/home/mousin/Android/platforms/android-34/android.jar:/home/mousin/Downloads/app/R:appcompat-classes.jar:core-ktx-classes.jar:material-classes.jar" MainActivity.kt -d MainActivity.jar - 打包所有类到dex文件:
用d8工具时,不能只打包自己的MainActivity.jar,要把所有依赖的AndroidX jar包一起打包:~/Android/build-tools/34.0.0/d8 MainActivity.jar appcompat-classes.jar core-ktx-classes.jar material-classes.jar - 替换原脚本中的对应步骤:
把上面的编译和d8命令替换原脚本里的对应部分,确保所有依赖类都被打包进classes.dex,再添加到APK中。
更新后的完整脚本示例
#!/bin/bash # 清理旧文件 rm -rf app.apk app.apk.idsig MainActivity.jar classes.dex layout appcompat-res-flat R # 解压AndroidX AAR(假设appcompat.aap在当前目录) unzip -q appcompat.aar -d appcompat-temp # 编译资源 ~/Android/build-tools/34.0.0/aapt2 compile layout/MainUI.xml -o layout ~/Android/build-tools/34.0.0/aapt2 compile --dir appcompat-temp/res -o appcompat-res-flat # 链接资源生成未签名APK ~/Android/build-tools/34.0.0/aapt2 link layout/layout_MainUI.xml.flat appcompat-res-flat/*.flat \ -o app.apk \ -I ~/Android/platforms/android-34/android.jar \ -I appcompat-temp/classes.jar \ --manifest AndroidManifest.xml \ --java R \ --auto-add-overlay # 编译R.java cd R/com/example/helloworld javac R.java cd ../../../../ # 编译Kotlin代码(加入所有AndroidX依赖jar) kotlinc -classpath "/home/mousin/Android/platforms/android-34/android.jar:./R:./appcompat-temp/classes.jar:./core-ktx-classes.jar" MainActivity.kt -d MainActivity.jar # 打包所有类到dex ~/Android/build-tools/34.0.0/d8 MainActivity.jar appcompat-temp/classes.jar core-ktx-classes.jar # 添加dex到APK ~/Android/build-tools/34.0.0/aapt add app.apk classes.dex # 签名并安装 echo "5949147123" | ~/Android/build-tools/34.0.0/apksigner sign --ks mousin.keystore app.apk adb install -r app.apk # 清理临时文件 rm -rf appcompat-temp
内容的提问来源于stack exchange,提问作者Mousin Ahanger
相关产品推荐
相关产品推荐

