无法在 Android Studio 之外安装基于 CLI 构建的应用程序 – “无法删除”错误/缺少 base.apk 代码

Ilm*_*ont 5 android adb aapt

我对 Android 原生开发很陌生,最近尝试在没有 Android Studio 的情况下直接从 CLI 构建(我真的不喜欢 IDE 并且发现 Gradle 过于复杂,虽然我还不能让我的工具链运行......)

使用来自网络的指导,特别是这个,我有一个非常基本的应用程序,它成功地构建到一个签名和对齐的 APK(据我所知)。我正在使用 Java 1.8 针对平台 14 进行构建,并且在更改此配置时没有观察到任何变化。

我已将应用程序源代码放在 GitHub 上以供此问题的参考。这是一种布局的活动。

当涉及到adb install(或从设备手动安装)时,安装总是失败INSTALL_FAILED_INVALID_APK...... Package /data/app/net.ilmiont.helloworld-...==/base.apk code is missing...外观上是一些长 ID)。

逻辑猫

adb logcat在安装尝试期间运行,我得到这个:

11-16 10:34:52.729 24742 7402 I Finsky : [9791] com.google.android.finsky.verifier.impl.ea.a(82): Skipping verification. Disabled by user setting 11-16 10:34:52.729 24742 7402 I Finsky : [9791] com.google.android.finsky.verifier.impl.ea.a(43): Skipping anti malware verification due to pre-check failure 11-16 10:34:52.730 24742 24742 I Finsky : [2] com.google.android.finsky.verifier.impl.fs.c(164): Verifying id=132, result=1 11-16 10:34:52.735 24742 24742 I Finsky : [2] com.google.android.finsky.verifier.impl.fs.c(177): Verification complete: id=132, package_name=net.ilmiont.helloworld 11-16 10:34:52.752 1856 27782 E : Couldn't opendir /data/data/net.ilmiont.helloworld: No such file or directory 11-16 10:34:52.753 1856 27782 E installd: Failed to delete /data/data/net.ilmiont.helloworld: No such file or directory 11-16 10:34:52.753 1856 27782 E : Couldn't opendir /data/user_de/0/net.ilmiont.helloworld: No such file or directory 11-16 10:34:52.753 1856 27782 E installd: Failed to delete /data/user_de/0/net.ilmiont.helloworld: No such file or directory 11-16 10:34:52.754 2198 2398 W PackageManager: com.android.server.pm.Installer$InstallerException: android.os.ServiceSpecificException: Failed to delete /data/user_de/0/net.ilmiont.helloworld (code 2) 11-16 10:34:52.756 2198 2398 W PackageManager: Package couldn't be installed in /data/app/net.ilmiont.helloworld-pbDVHiVe6mEghhiOqRUNjg== 11-16 10:34:52.756 2198 2398 W PackageManager: com.android.server.pm.PackageManagerException: Package /data/app/net.ilmiont.helloworld-pbDVHiVe6mEghhiOqRUNjg==/base.apk code is missing

我不明白为什么它在刚刚安装应用程序(并且从未成功安装)时尝试打开/删除这些目录---我对 Android 内部结构了解得不够多,但从那个跟踪来看,它确实看起来像删除是问题所在。

我已经多次查看我的来源,但看不到我遗漏了什么。清单看起来不错,布局看起来不错,Java 都是两行。那么我错过了什么?这一定是非常明显的事情。

装置

这可能是相关的,所以这里是所有细节。

运行无根 Android 8.1 的诺基亚 6(原版)。

我打开Android Studio中,创建的默认样板应用程序,然后点击“运行”,并建成并成功部署,因此显然有什么错这是使这个打破我的应用程序/编译工具链,而且我的地方出出主意看。

构建脚本(摘录,它确实构建但不会部署)

aapt package -v -f -m -J $PROJECT_SOURCE -M $ANDROID_MANIFEST -S $ANDROID_RESOURCES -I $ANDROID_SDK/platforms/android-$ANDROID_API/android.jar;

javac -d $JAVA_COMPILE_DESTINATION -source $JAVA_VERSION -target $JAVA_VERSION_TARGET -classpath "$PROJECT_SOURCE$JAVA_CLASSPATH_LIBS" -bootclasspath $ANDROID_SDK/platforms/android-$ANDROID_API/android.jar $PROJECT_SOURCE/$PROJECT_PACKAGE_SOURCE/*.java;

dx --dex --output=$DX_COMPILE_DESTINATION $JAVA_COMPILE_DESTINATION;

aapt package -f -m -F $APP_APK_UNALIGNED -M $ANDROID_MANIFEST -S $ANDROID_RESOURCES -I $ANDROID_SDK/platforms/android-$ANDROID_API/android.jar;

aapt add $APP_APK_UNALIGNED $DX_COMPILE_DESTINATION;

zipalign -f 4 $APP_APK_UNALIGNED $APP_APK;

apksigner sign --ks /home/jh_walker/.keystore $APP_APK;

密钥库

keytool -genkeypair -validity 365 -keystore $KEYSTORE -alias $KEYSTORE_ALIAS -sigalg SHA1withDSA -keyalg DSA -keysize 1024

我试过的

  • Java 1.7/1.8
  • 针对不同的 Android 平台进行编译 (21/28)
  • 包括附加资产(最初没有图标)
  • use-sdk在清单中设置(无影响)

我错过了什么?

Ilm*_*ont 3

我到了那里。

aapt inspect app.apk

我立即注意到 APK 中是./bin/classes.dex,并且其他文件都没有该./前缀。

深入挖掘,我在构建脚本中看到我正在将 DEX 编译为./bin/classes.dex,然后将该路径添加到我的 APK 中。但似乎该路径的某些内容不被喜欢aapt(尽管它对于我运行它的位置来说是完全有效的),并且它没有正确添加文件——它似乎只是一些空的东西./bin/classes.dex

(是的,这是一个有点可悲的解释,我稍后会进行适当的调查!)

不管怎样,看来你必须从当前目录添加:classes.dex。也许这对于更熟悉这些工具的人来说是显而易见的。

反正,

cp ./bin/classes.dex . && aapt add app.apk.unaligned classes.dex有效,但aapt add app.apk.unaligned ./bin/classes.dex没有。