如何使用没有gradle的androidx库

问题描述 投票:0回答:1

[下面有我的脚本:

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>

我可以毫无障碍地成功编译。但是使用以下布局:

<?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. 将库AndroidManifest.xml与应用AndroidManifest.xml合并。

我现在手动完成。

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

我更改了构建脚本以添加constraintlayout库的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'

当我将第四行的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个回答
0
投票

我明白了。 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文件中添加constraintlayout库的res /,因为我需要编译分离的lib R.java文件。因此,使用javac编译所有R.java文件,并在dex命令中添加所有.class文件。并且有效。

© www.soinside.com 2019 - 2024. All rights reserved.