【问题标题】:How to use androidx libs without gradle如何在没有 gradle 的情况下使用 androidx 库
【发布时间】:2020-03-25 23:50:57
【问题描述】:

下面是我的脚本:

echo "Setting environment variables..."
SDK="${HOME}/Programs/Android"
BUILD_TOOLS="${SDK}/build-tools/29.0.2"
PLATFORM="${SDK}/platforms/android-29"
ANDROID_API=29
APK_NAME="ECLAndroidSkeleton"
PACKAGE_NAME="ecl.android.skeleton"
ORG_DIRS="${PACKAGE_NAME//./\/}"
NDK="${SDK}/ndk-bundle"
ANDROID_TOOLCHAIN="${NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi23-clang"
ECL="${HOME}/Programs/ecl"
ECL_ANDROID_DIR="${ECL}/ecl-armv7a-linux-androideabi"
ECL_LIB_DIR="${ECL_ANDROID_DIR}/lib/ecl-16.1.3"
KEY_PASS="android123"

echo "Cleaning build directories..."
rm -rf build/gen build/obj build/apk

echo "Creating build directories..."
mkdir -p build/gen build/obj build/apk build/apk/lib/armeabi-v7a

if [ ! -f keystore.jks ] || [ "$1" == "key" ]; then
  if [ -f keystore.jks ]; then
    echo "Deleting ./keystore.jks..."
    rm -rf keystore.jks
  fi
  echo "Generating new ./keystore.jks..."  
  keytool -genkeypair -keystore keystore.jks -alias androidkey \
      -validity 10000 -keyalg RSA -keysize 2048
  if [ "$1" == "key" ]; then exit 0; fi
fi

echo "Compiling C code..."
${ANDROID_TOOLCHAIN} -shared -o build/apk/lib/armeabi-v7a/libhelloecl.so \
             -DANDROID -llog \
             -I"${ECL_ANDROID_DIR}"/include \
             jni/ecl_boot.c \
             jni/ecl_thread.c \
             jni/org_lisp_ecl_EmbeddedCommonLisp.c \
             "${ECL_ANDROID_DIR}"/lib/libecl.so

${ANDROID_TOOLCHAIN} -shared -o build/apk/lib/armeabi-v7a/libandroidlog.so \
             -DANDROID -llog \
             jni/android_log.c

echo "Copying ${ECL_ANDROID_DIR}/lib/libecl.so to ./build/apk/lib/armeabi-v7a/..." 
cp "${ECL_ANDROID_DIR}"/lib/libecl.so ./build/apk/lib/armeabi-v7a/

echo "Copying assets to APK..."
MODULES_DIR=./assets/lisp/lib
rm -rf "${MODULES_DIR}"
mkdir -p "${MODULES_DIR}"
cp "${ECL_LIB_DIR}"/help.doc "${MODULES_DIR}"
cp "${ECL_LIB_DIR}"/asdf.fas "${MODULES_DIR}"
#cp "${ECL_LIB_DIR}"/encodings/* "${MODULES_DIR}"
unzip -qq -o ./libs/lisp.zip -d "${MODULES_DIR}"
"${NDK}"/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip "${MODULES_DIR}"/*.fas
cp -r ./assets/ ./build/apk/

echo "Generate ./build/gen/${ORG_DIRS}/R.java file..."
"${BUILD_TOOLS}/aapt" package -f -m -J build/gen/ -S res \
       -M AndroidManifest.xml -I "${PLATFORM}/android.jar"

echo "Compiling the java files in ./build/obj/*.class..."
javac -bootclasspath "${JAVA_HOME}/jre/lib/rt.jar" \
      -classpath "${PLATFORM}/android.jar" \
      -d build/obj \
      build/gen/"${ORG_DIRS}"/R.java \
      src/"${ORG_DIRS}"/EmbeddedCommonLisp.java \
      src/"${ORG_DIRS}"/HelloEclActivity.java

echo "Creating ./build/apk/classes.dex..."
"${BUILD_TOOLS}/dx" --dex --output=build/apk/classes.dex build/obj/

echo "Packaging ./build/${APK_NAME}.unsigned.apk..."
"${BUILD_TOOLS}/aapt" package -f -M AndroidManifest.xml -S res/ \
      -I "${PLATFORM}/android.jar" \
      -F build/"${APK_NAME}".unsigned.apk build/apk/

echo "Zipaligning unsigned APK to ./build/${APK_NAME}.aligned.apk..."
"${BUILD_TOOLS}/zipalign" -f -p 4 \
      build/"${APK_NAME}".unsigned.apk build/"${APK_NAME}".aligned.apk

echo "Signing aligned APK to ./build/${APK_NAME}.apk..."
if [[ -n "${KEY_PASS}" ]]; then
    "${BUILD_TOOLS}/apksigner" sign --ks keystore.jks \
                   --ks-key-alias androidkey \
                   --ks-pass pass:"${KEY_PASS}" \
                   --key-pass pass:"${KEY_PASS}" \
                   --out build/"${APK_NAME}".apk \
                   build/"${APK_NAME}".aligned.apk
else
    "${BUILD_TOOLS}/apksigner" sign --ks keystore.jks \
               --ks-key-alias androidkey \
               --out build/"${APK_NAME}".apk \
               build/"${APK_NAME}".aligned.apk
fi

echo "Clean lisp libs because ASDF..."
rm -r assets/lisp/lib/*
rm -r build/apk/assets/lisp/lib/*

echo "Testing APK..."
"${SDK}/platform-tools/adb" install -r build/"${APK_NAME}".apk
"${SDK}/platform-tools/adb" shell am start --activity-clear-top -n "${PACKAGE_NAME}"/.HelloEclActivity

还有布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    android:background="#1de9b6">

  <View
   android:id="@+id/rect001" 
   android:layout_width="100dp"
   android:layout_height="100dp"
   android:background="#E7040F" />

  <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/my_text"/>
</LinearLayout>

我可以在没有 gradle 的情况下成功编译。但布局如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#1de9b6">

  <View
      android:id="@+id/rect001"
      android:layout_width="100dp"
      android:layout_height="100dp"
      android:background="#E7040F"
      app:layout_constraintRight_toRightOf="parent"
      app:layout_constraintLeft_toLeftOf="parent"/>

  <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/my_text"
      app:layout_constraintRight_toRightOf="parent"
      app:layout_constraintLeft_toLeftOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

我无法编译:

Generate ./build/gen/ecl/android/skeleton/R.java file...
    (skipping file '.#main.xml' due to ANDROID_AAPT_IGNORE pattern '.*')
res/layout/main.xml:10: error: No resource identifier found for attribute 'layout_constraintRight_toRightOf' in package 'ecl.android.skeleton'

res/layout/main.xml:10: error: No resource identifier found for attribute 'layout_constraintLeft_toLeftOf' in package 'ecl.android.skeleton'

res/layout/main.xml:18: error: No resource identifier found for attribute 'layout_constraintRight_toRightOf' in package 'ecl.android.skeleton'

res/layout/main.xml:18: error: No resource identifier found for attribute 'layout_constraintLeft_toLeftOf' in package 'ecl.android.skeleton'

所以,我知道我需要将约束布局库添加到aapt 命令,但我不知道我需要添加哪个或哪些文件以及将其放在哪里。

总结:

  1. 在哪里下载需要添加的文件?
  2. 我需要在appt 命令中添加什么文件?
  1. 在哪里下载需要添加的文件?

我现在可以下载 lib 文件了:

https://dl.google.com/dl/android/maven2/androidx/constraintlayout/constraintlayout/2.0.0-beta4/constraintlayout-2.0.0-beta4.aar

但我不知道我必须在脚本的哪个位置添加constraintlayout-2.0.0-beta4.aar 文件。

  1. 在哪里下载需要添加的文件?

我认为需要做很多事情:

  1. 解压 .aar lib 文件。

首先我检查 lib 文件:

# unzip -Z1 constraintlayout-2.0.0-beta4.aar

AndroidManifest.xml
R.txt
classes.jar
res/
res/values/
res/values/values.xml
values/

所以,解压这个:

# unzip -d constraintlayout-2.0.0-beta4 constraintlayout-2.0.0-beta4.aar
  1. 将 lib AndroidManifest.xml 与应用 AndroidManifest.xml 合并。

我现在是手动完成的。

  1. 在aapt命令中添加lib res/生成R.java文件吧。

我更改了构建脚本以添加约束布局库的 res/:

echo "Generate ./build/gen/${ORG_DIRS}/R.java file..."
"${BUILD_TOOLS}/aapt" package --auto-add-overlay -f -m -J build/gen/ \
              -S res \
              -S "${ANDROIDX_LIBS}"/constraintlayout-2.0.0-beta4/res \
              -M AndroidManifest.xml -I "${PLATFORM}/android.jar"

它似乎有效,我不再收到错误。

  1. 在javac命令中添加lib的classes.jar。

我可以编译:

echo "Compiling the java files in ./build/obj/*.class..."
javac -bootclasspath "${JAVA_HOME}/jre/lib/rt.jar" \
      -classpath "${PLATFORM}/android.jar":"${ANDROIDX_LIBS}"/constraintlayout-2.0.0-beta4/classes.jar \
      -d build/obj \
      build/gen/"${ORG_DIRS}"/R.java \
      src/"${ORG_DIRS}"/EmbeddedCommonLisp.java \
      src/"${ORG_DIRS}"/HelloEclActivity.java

但我无法打包应用程序。 错误信息:

# ...
Copying assets to APK...
Generate ./build/gen/ecl/android/skeleton/R.java file...
Compiling the java files in ./build/obj/*.class...
Creating ./build/apk/classes.dex...
Packaging ./build/ECLAndroidSkeleton.unsigned.apk...
res/layout/main.xml:11: error: No resource identifier found for attribute 'layout_constraintRight_toRightOf' in package 'ecl.android.skeleton'

res/layout/main.xml:11: error: No resource identifier found for attribute 'layout_constraintLeft_toLeftOf' in package 'ecl.android.skeleton'

res/layout/main.xml:19: error: No resource identifier found for attribute 'layout_constraintRight_toRightOf' in package 'ecl.android.skeleton'

res/layout/main.xml:19: error: No resource identifier found for attribute 'layout_constraintLeft_toLeftOf' in package 'ecl.android.skeleton'

当我将第 4 行的 main.xml 文件更改为:

xmlns:app="http://schemas.android.com/apk/ecl.android.skeleton"

我可以创建 apk,但是当我在手机中测试时,它坏了。 adb 错误:

03-24 09:41:05.420 19978 19978 E AndroidRuntime: Caused by: android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class androidx.constraintlayout.widget.ConstraintLayout

03-24 09:41:05.420 19978 19978 E AndroidRuntime: Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.constraintlayout.widget.ConstraintLayout" on path: DexPathList[[zip file "/data/app/ecl.android.skeleton-2/base.apk"],nativeLibraryDirectories=[/data/app/ecl.android.skeleton-2/lib/arm, /data/app/ecl.android.skeleton-2/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]]

03-24 09:41:05.420 19978 19978 E AndroidRuntime:    Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

03-24 09:41:05.426  1796  2936 W ActivityManager:   Force finishing activity ecl.android.skeleton/.HelloEclActivity

所以我在dex 步骤中添加了库:

echo "Creating ./build/apk/classes.dex..."
"${BUILD_TOOLS}/dx" --dex --output=build/apk/classes.dex \
            "${ANDROIDX_LIBS}"/constraintlayout-solver-2.0.0-beta4.jar \
            "${ANDROIDX_LIBS}"/constraintlayout-2.0.0-beta4/classes.jar \
            build/obj/

我需要添加“constraintlayout-solver-2.0.0-beta4.jar”,因为在此错误之前我收到了一个抱怨此错误的错误。

我现在得到了其他:

03-25 10:20:01.401 12274 12274 E AndroidRuntime: Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.constraintlayout.widget.R$styleable" on path: DexPathList[[zip file "/data/app/ecl.android.skeleton-2/base.apk"],nativeLibraryDirectories=[/data/app/ecl.android.skeleton-2/lib/arm, /data/app/ecl.android.skeleton-2/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]]

我看到constraintlayout-solver-2.0.0-beta4.jar没有androidx.constraintlayout.widget.R$styleable这个类:

# unzip -Z1 constraintlayout-2.0.0-beta4/classes.jar

androidx/constraintlayout/helper/widget/Flow.class
androidx/constraintlayout/helper/widget/Layer.class
androidx/constraintlayout/motion/utils/ArcCurveFit$Arc.class
androidx/constraintlayout/motion/utils/ArcCurveFit.class
androidx/constraintlayout/motion/utils/CurveFit$Constant.class
androidx/constraintlayout/motion/utils/CurveFit.class
androidx/constraintlayout/motion/utils/Easing$CubicEasing.class
androidx/constraintlayout/motion/utils/Easing.class
androidx/constraintlayout/motion/utils/HyperSpline$Cubic.class
androidx/constraintlayout/motion/utils/HyperSpline.class
androidx/constraintlayout/motion/utils/LinearCurveFit.class
androidx/constraintlayout/motion/utils/MonotonicCurveFit.class
androidx/constraintlayout/motion/utils/Oscillator.class
androidx/constraintlayout/motion/utils/StopLogic.class
androidx/constraintlayout/motion/utils/VelocityMatrix.class
androidx/constraintlayout/motion/widget/Animatable.class
androidx/constraintlayout/motion/widget/CustomFloatAttributes.class
androidx/constraintlayout/motion/widget/Debug.class
androidx/constraintlayout/motion/widget/DesignTool.class
androidx/constraintlayout/motion/widget/Key.class
androidx/constraintlayout/motion/widget/KeyAttributes$Loader.class
androidx/constraintlayout/motion/widget/KeyAttributes.class
androidx/constraintlayout/motion/widget/KeyCache.class
androidx/constraintlayout/motion/widget/KeyCycle$Loader.class
androidx/constraintlayout/motion/widget/KeyCycle.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$1.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$AlphaSet.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$CustomSet.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$CycleOscillator.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$ElevationSet.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$IntDoubleSort.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$IntFloatFloatSort.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$PathRotateSet.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$ProgressSet.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$RotationSet.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$RotationXset.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$RotationYset.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$ScaleXset.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$ScaleYset.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$TranslationXset.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$TranslationYset.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$TranslationZset.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator$WavePoint.class
androidx/constraintlayout/motion/widget/KeyCycleOscillator.class
androidx/constraintlayout/motion/widget/KeyFrames.class
androidx/constraintlayout/motion/widget/KeyPosition$Loader.class
androidx/constraintlayout/motion/widget/KeyPosition.class
androidx/constraintlayout/motion/widget/KeyPositionBase.class
androidx/constraintlayout/motion/widget/KeyTimeCycle$Loader.class
androidx/constraintlayout/motion/widget/KeyTimeCycle.class
androidx/constraintlayout/motion/widget/KeyTrigger$Loader.class
androidx/constraintlayout/motion/widget/KeyTrigger.class
androidx/constraintlayout/motion/widget/MotionConstrainedPoint.class
androidx/constraintlayout/motion/widget/MotionController.class
androidx/constraintlayout/motion/widget/MotionHelper.class
androidx/constraintlayout/motion/widget/MotionInterpolator.class
androidx/constraintlayout/motion/widget/MotionLayout$DecelerateInterpolator.class
androidx/constraintlayout/motion/widget/MotionLayout$DevModeDraw.class
androidx/constraintlayout/motion/widget/MotionLayout$Model.class
androidx/constraintlayout/motion/widget/MotionLayout$MotionTracker.class
androidx/constraintlayout/motion/widget/MotionLayout$MyTracker.class
androidx/constraintlayout/motion/widget/MotionLayout$TransitionListener.class
androidx/constraintlayout/motion/widget/MotionLayout.class
androidx/constraintlayout/motion/widget/MotionPaths.class
androidx/constraintlayout/motion/widget/MotionScene$1.class
androidx/constraintlayout/motion/widget/MotionScene$Transition$TransitionOnClick.class
androidx/constraintlayout/motion/widget/MotionScene$Transition.class
androidx/constraintlayout/motion/widget/MotionScene.class
androidx/constraintlayout/motion/widget/ProxyInterface.class
androidx/constraintlayout/motion/widget/SplineSet$AlphaSet.class
androidx/constraintlayout/motion/widget/SplineSet$CustomSet.class
androidx/constraintlayout/motion/widget/SplineSet$ElevationSet.class
androidx/constraintlayout/motion/widget/SplineSet$PathRotate.class
androidx/constraintlayout/motion/widget/SplineSet$ProgressSet.class
androidx/constraintlayout/motion/widget/SplineSet$RotationSet.class
androidx/constraintlayout/motion/widget/SplineSet$RotationXset.class
androidx/constraintlayout/motion/widget/SplineSet$RotationYset.class
androidx/constraintlayout/motion/widget/SplineSet$ScaleXset.class
androidx/constraintlayout/motion/widget/SplineSet$ScaleYset.class
androidx/constraintlayout/motion/widget/SplineSet$Sort.class
androidx/constraintlayout/motion/widget/SplineSet$TranslationXset.class
androidx/constraintlayout/motion/widget/SplineSet$TranslationYset.class
androidx/constraintlayout/motion/widget/SplineSet$TranslationZset.class
androidx/constraintlayout/motion/widget/SplineSet.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$AlphaSet.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$CustomSet.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$ElevationSet.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$PathRotate.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$ProgressSet.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$RotationSet.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$RotationXset.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$RotationYset.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$ScaleXset.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$ScaleYset.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$Sort.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$TranslationXset.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$TranslationYset.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet$TranslationZset.class
androidx/constraintlayout/motion/widget/TimeCycleSplineSet.class
androidx/constraintlayout/motion/widget/TouchResponse$1.class
androidx/constraintlayout/motion/widget/TouchResponse$2.class
androidx/constraintlayout/motion/widget/TouchResponse.class
androidx/constraintlayout/motion/widget/TransitionAdapter.class
androidx/constraintlayout/motion/widget/TransitionBuilder.class
androidx/constraintlayout/utils/widget/ImageFilterButton$1.class
androidx/constraintlayout/utils/widget/ImageFilterButton$2.class
androidx/constraintlayout/utils/widget/ImageFilterButton.class
androidx/constraintlayout/utils/widget/ImageFilterView$1.class
androidx/constraintlayout/utils/widget/ImageFilterView$2.class
androidx/constraintlayout/utils/widget/ImageFilterView$ImageMatrix.class
androidx/constraintlayout/utils/widget/ImageFilterView.class
androidx/constraintlayout/utils/widget/MockView.class
androidx/constraintlayout/utils/widget/MotionTelltales.class
androidx/constraintlayout/widget/Barrier.class
androidx/constraintlayout/widget/ConstraintAttribute$1.class
androidx/constraintlayout/widget/ConstraintAttribute$AttributeType.class
androidx/constraintlayout/widget/ConstraintAttribute.class
androidx/constraintlayout/widget/ConstraintHelper.class
androidx/constraintlayout/widget/ConstraintLayout$1.class
androidx/constraintlayout/widget/ConstraintLayout$LayoutParams$Table.class
androidx/constraintlayout/widget/ConstraintLayout$LayoutParams.class
androidx/constraintlayout/widget/ConstraintLayout$Measurer.class
androidx/constraintlayout/widget/ConstraintLayout.class
androidx/constraintlayout/widget/ConstraintLayoutStates$State.class
androidx/constraintlayout/widget/ConstraintLayoutStates$Variant.class
androidx/constraintlayout/widget/ConstraintLayoutStates.class
androidx/constraintlayout/widget/ConstraintProperties.class
androidx/constraintlayout/widget/ConstraintSet$Constraint.class
androidx/constraintlayout/widget/ConstraintSet$Layout.class
androidx/constraintlayout/widget/ConstraintSet$Motion.class
androidx/constraintlayout/widget/ConstraintSet$PropertySet.class
androidx/constraintlayout/widget/ConstraintSet$Transform.class
androidx/constraintlayout/widget/ConstraintSet.class
androidx/constraintlayout/widget/Constraints$LayoutParams.class
androidx/constraintlayout/widget/Constraints.class
androidx/constraintlayout/widget/ConstraintsChangedListener.class
androidx/constraintlayout/widget/Group.class
androidx/constraintlayout/widget/Guideline.class
androidx/constraintlayout/widget/Placeholder.class
androidx/constraintlayout/widget/StateSet$State.class
androidx/constraintlayout/widget/StateSet$Variant.class
androidx/constraintlayout/widget/StateSet.class
androidx/constraintlayout/widget/VirtualLayout.class

所以,我现在不知道,我认为需要生成某种方式的androidx.constraintlayout.widget.R$styleable

【问题讨论】:

    标签: android android-constraintlayout


    【解决方案1】:

    我明白了。 Gradle 还没有咬我!没有这个,我的编译将在几秒钟内继续。我了解添加库的所有过程。

    所以,完整的脚本:

    echo "Setting environment variables..."
    SDK="${HOME}/Programs/Android"
    BUILD_TOOLS="${SDK}/build-tools/29.0.2"
    PLATFORM="${SDK}/platforms/android-23"
    ANDROID_API=23
    APK_NAME="ECLAndroidSkeleton"
    PACKAGE_NAME="ecl.android.skeleton"
    ORG_DIRS="${PACKAGE_NAME//./\/}"
    NDK="${SDK}/ndk-bundle"
    ANDROID_TOOLCHAIN="${NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi23-clang"
    ECL="${HOME}/Programs/ecl"
    ECL_ANDROID_DIR="${ECL}/ecl-armv7a-linux-androideabi"
    ECL_LIB_DIR="${ECL_ANDROID_DIR}/lib/ecl-16.1.3"
    KEY_PASS="android123"
    ANDROIDX_LIBS="${SDK}/androidx/"
    
    echo "Cleaning build directories..."
    rm -rf build/gen build/obj build/apk  
    
    echo "Creating build directories..."
    mkdir -p build/gen build/obj build/apk build/apk/lib/armeabi-v7a
    
    if [ ! -f keystore.jks ] || [ "$1" == "key" ]; then
      if [ -f keystore.jks ]; then
        echo "Deleting ./keystore.jks..."
        rm -rf keystore.jks
      fi
      echo "Generating new ./keystore.jks..."  
      keytool -genkeypair -keystore keystore.jks -alias androidkey \
          -validity 10000 -keyalg RSA -keysize 2048
      if [ "$1" == "key" ]; then exit 0; fi
    fi
    
    echo "Compiling C code..."
    ${ANDROID_TOOLCHAIN} -shared -o build/apk/lib/armeabi-v7a/libhelloecl.so \
                 -DANDROID -llog \
                 -I"${ECL_ANDROID_DIR}"/include \
                 jni/ecl_boot.c \
                 jni/ecl_thread.c \
                 jni/org_lisp_ecl_EmbeddedCommonLisp.c \
                 "${ECL_ANDROID_DIR}"/lib/libecl.so
    
    ${ANDROID_TOOLCHAIN} -shared -o build/apk/lib/armeabi-v7a/libandroidlog.so \
                 -DANDROID -llog \
                 jni/android_log.c
    
    echo "Copying ${ECL_ANDROID_DIR}/lib/libecl.so to ./build/apk/lib/armeabi-v7a/..." 
    cp "${ECL_ANDROID_DIR}"/lib/libecl.so ./build/apk/lib/armeabi-v7a/
    
    echo "Copying assets to APK..."
    MODULES_DIR=./assets/lisp/lib
    rm -rf "${MODULES_DIR}"
    mkdir -p "${MODULES_DIR}"
    cp "${ECL_LIB_DIR}"/help.doc "${MODULES_DIR}"
    cp "${ECL_LIB_DIR}"/asdf.fas "${MODULES_DIR}"
    #cp "${ECL_LIB_DIR}"/encodings/* "${MODULES_DIR}"
    unzip -qq -o ./libs/lisp.zip -d "${MODULES_DIR}"
    "${NDK}"/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip "${MODULES_DIR}"/*.fas
    cp -r ./assets/ ./build/apk/
    
    echo "Generate ./build/gen/${ORG_DIRS}/R.java file..."
    "${BUILD_TOOLS}/aapt" package --auto-add-overlay -f -m -J build/gen/ \
                  -S res/ \
                  -M AndroidManifest.xml -I "${PLATFORM}/android.jar"
    
    echo "Generate androidx lib R.java files..."
    "${BUILD_TOOLS}/aapt" package -f -m -J build/gen/ \
                  -S "${ANDROIDX_LIBS}"/constraintlayout-1.1.3/res/ \
                  -M "${ANDROIDX_LIBS}"/constraintlayout-1.1.3/AndroidManifest.xml -I "${PLATFORM}/android.jar"
    
    echo "Compiling the java files in ./build/obj/*.class..."
    javac -bootclasspath "${JAVA_HOME}/jre/lib/rt.jar" \
          -classpath "${PLATFORM}/android.jar":"${ANDROIDX_LIBS}"/constraintlayout-1.1.3/classes.jar:"${ANDROIDX_LIBS}"/constraintlayout-solver-1.1.3.jar \
          -d build/obj \
          build/gen/"${ORG_DIRS}"/R.java \
          build/gen/androidx/constraintlayout/widget/R.java \
          src/"${ORG_DIRS}"/EmbeddedCommonLisp.java \
          src/"${ORG_DIRS}"/HelloEclActivity.java 
    
    echo "Creating ./build/apk/classes.dex..."
    "${BUILD_TOOLS}/dx" --dex --output=build/apk/classes.dex \
                "${ANDROIDX_LIBS}"/constraintlayout-solver-1.1.3.jar \
                "${ANDROIDX_LIBS}"/constraintlayout-1.1.3/classes.jar \
                build/obj/
    
    echo "Packaging ./build/${APK_NAME}.unsigned.apk..."
    "${BUILD_TOOLS}/aapt" package -f -M AndroidManifest.xml \
                  -S res/ \
                  -I "${PLATFORM}/android.jar" \
                  -F build/"${APK_NAME}".unsigned.apk build/apk/
    
    echo "Zipaligning unsigned APK to ./build/${APK_NAME}.aligned.apk..."
    "${BUILD_TOOLS}/zipalign" -f -p 4 \
          build/"${APK_NAME}".unsigned.apk build/"${APK_NAME}".aligned.apk
    
    echo "Signing aligned APK to ./build/${APK_NAME}.apk..."
    if [[ -n "${KEY_PASS}" ]]; then
        "${BUILD_TOOLS}/apksigner" sign --ks keystore.jks \
                       --ks-key-alias androidkey \
                       --ks-pass pass:"${KEY_PASS}" \
                       --key-pass pass:"${KEY_PASS}" \
                       --out build/"${APK_NAME}".apk \
                       build/"${APK_NAME}".aligned.apk
    else
        "${BUILD_TOOLS}/apksigner" sign --ks keystore.jks \
                   --ks-key-alias androidkey \
                   --out build/"${APK_NAME}".apk \
                   build/"${APK_NAME}".aligned.apk
    fi
    
    echo "Clean lisp libs because ASDF..."
    rm -r assets/lisp/lib/*
    rm -r build/apk/assets/lisp/lib/*
    
    echo "Testing APK..."
    "${SDK}/platform-tools/adb" install -r build/"${APK_NAME}".apk
    "${SDK}/platform-tools/adb" shell am start --activity-clear-top -n "${PACKAGE_NAME}"/.HelloEclActivity
    

    出了什么问题?

    我在 apk R.java 文件中添加了约束布局库的 res/,因为我需要将 lib R.java 文件分开编译。因此,使用javac 编译所有R.java 文件,在dex 命令中添加所有.class 文件。并且有效。

    【讨论】:

      猜你喜欢
      • 2019-11-28
      • 1970-01-01
      • 2021-12-05
      • 2016-12-30
      • 1970-01-01
      • 2015-02-20
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多