我想我的应用程序支持任何Android手机API 3及以上。为什么?因为我不喜欢浪费,而且这些旧手机完全可以胜任手头的任务。可悲的是,获得关于api-9之前的SDK构建的基本信息比让NDK工作要困难得多。
wnvonmuf1#
我无法找到使用developer.android.com上提供的任何Android Studio版本构建< 9的Android应用程序API的机制。但是,可以使用旧的命令行工具来构建它们。(我还没有研究API < 9使用ActivityCompat库,也没有研究用于调试JNI应用程序的ndk构建-这些都是留给读者的练习:-)注意:使用这些技术需要熟悉当前的命令行构建,否则就没有什么阅读的意义。此任务分为四个部分:
https://android.googlesource.com/platform/development/+refs
字符串从甜甜圈发布到android-s-beta-4,应有尽有。每个都有一个“样本”的标签,这是一个很好的开始。
https://dl.google.com/android/repository/repository-10.xml
型列出了所有下载及其摘要/校验和,位于:
https://dl.google.com/android/repository/(repo-filename)
型您需要查找、下载并安装:
请注意,API < 4的设备似乎更喜欢从设备操作系统链接共享符号,而不是从您的JNI库链接共享符号,因此请避免从您的库发布冲突符号,并静态链接任何第三方库(许可证允许)。Makefile示例:
API = 3 NDK = ~/Android/Sdk/ndk/r11c CC = $(NDK)/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc SR = $(NDK)/platforms/android-$(API)/arch-arm INC = -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux objs = obj/thing1.o obj/thing2.o ... libexample.so : $(objs) $(CC) --sysroot=$(SR) -fPIC -Wall -shared -o libexample.so -O $^ obj/%.o : %.c $(CC) --sysroot=$(SR) -fPIC -Wall -mthumb -c $< -o $@ $(INC)
型如果你正在构建openssl,你需要一个额外的configure标志:
--with-rand-seed=devrandom
型以及无线程无ASM。
遗憾的是,我无法找到一种方法来使用现在的Android Studio来构建这些低API项目,所以下面是一些讨厌的命令行东西来代替它。您需要查找、下载并安装:
(See上面是如何得到这些。)
project/ Makefile app/ build/ src/ main/ AndroidManifest.xml assets/ jniLibs/ armeabi/ libexample.so res/ layout/ activity_main.xml java/ com/ example/ project/ MainActivity.java
型
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.project"> <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name" > <uses-sdk android:minSdkVersion="3" /> <activity android:name="com.example.project.MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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" tools:context="com.example.project.MainActivity" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/outer" android:orientation="vertical" > <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="run" /><!--note: no onClick--> ...
型MainActivity.java
package com.example.project; import android.os.Bundle; import android.app.Activity; import android.widget.Button; public class MainActivity extends Activity { @Override protected void onCreate(Bundle bdl) { super.onCreate(bdl); setContentView(R.layout.activity_main); final Button btn = (Button)findViewById(R.id.btn); btn.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { ... } }); } };
API = 3 KEY_PATH = ~/jkeystore DROID_HOME = ~/Android/Sdk JAVA_HOME = /usr/lib/jvm/java-8-openjdk-amd64 BLD_TOOLS=17.0.0 APK_SIGNR=24.0.3 PKG_PATH = com/example/project JVA_ROOT = app/src/main/java RES_ROOT = app/src/main/res AST_ROOT = app/src/main/assets AMF_PNAM = app/src/main/AndroidManifest.xml LIB_REAL = app/src/main/jniLibs CLS_ROOT = app/build/intermediates/javac/debug/classes DEX_PATH = app/build/intermediates/dex/debug/mergeDexDebug APK_PATH = app/build/outputs/apk/debug APK_NAME = app-debug LIB_TEMP = lib JVA_PRJT = $(JVA_ROOT)/$(PKG_PATH) CLS_PRJT = $(CLS_ROOT)/$(PKG_PATH) APK_PNAM = $(APK_PATH)/$(APK_NAME) DRD_JAR = $(DROID_HOME)/platforms/android-$(API)/android.jar jopt = -proc:none -Xlint:all -Xlint:-fallthrough -Werror -Xmaxerrs 5 jopt += -implicit:none -target 1.6 -source 1,6 -bootclasspath ~/jre1.6.0_45/lib/rt.jar # wildcard matches symlinks awa directories. dir filters, sort dedupes. JVA_DIRS := $(dir $(wildcard $(JVA_PRJT)/*/) ) JVA_DIRS := $(sort $(JVA_DIRS) ) JVA_DIRS += $(JVA_PRJT)/ # all in java tree except R.java (and thus R.class) temp_jva := $(foreach pth, $(JVA_DIRS), $(wildcard $(pth)*.java) ) JVA_LIST := $(patsubst $(JVA_PRJT)/R.java, , $(temp_jva)) temp_cls := $(patsubst $(JVA_PRJT)/%.java,$(CLS_PRJT)/%.class, $(JVA_LIST)) CLS_LIST := $(patsubst $(JVA_PRJT)/%,$(CLS_PRJT)/%, $(temp_cls)) LIB_LIST := $(shell find $(LIB_REAL) -type f 2> /dev/null) LIB_TLST := $(patsubst $(LIB_REAL)/%, $(LIB_TEMP)/%, $(LIB_LIST)) AST_LIST := $(shell find $(AST_ROOT) -type f 2> /dev/null) ifneq ($(strip $(AST_LIST)),) AST_OPTN = -A $(AST_ROOT) endif RES_LIST := $(shell find $(RES_ROOT) -type f) .DELETE_ON_ERROR: assembleDebug: $(APK_PNAM).apk $(APK_PNAM).apk : $(APK_PNAM).nosig.apk $(AMF_PNAM) $(RES_LIST) $(AST_LIST) $(LIB_LIST) #****************************** SIGN ********************************** $(DROID_HOME)/build-tools/$(APK_SIGNR)/apksigner sign -v --verbose \ --ks $(KEY_PATH) --ks-pass pass:debug_pw --min-sdk-version $(API) \ --out $@ $(APK_PNAM).nosig.apk $(APK_PNAM).nosig.apk : $(DEX_PATH)/classes.dex $(AMF_PNAM) $(RES_LIST) $(AST_LIST) $(LIB_LIST) #****************************** PACKAGE ******************************* @-mkdir -p $(APK_PATH) $(DROID_HOME)/build-tools/$(BLD_TOOLS)/aapt package -v -f -M $(AMF_PNAM) \ -S $(RES_ROOT) $(AST_OPTN) -I $(DRD_JAR) -F $(APK_PNAM).nosig.apk $(DEX_PATH)/ ifneq ($(strip $(LIB_LIST)),) #****************************** LIBS ********************************** cp -r $(LIB_REAL) $(LIB_TEMP)/ $(DROID_HOME)/build-tools/$(BLD_TOOLS)/aapt add -v $(APK_PNAM).nosig.apk $(LIB_TLST) @-rm -r $(LIB_TEMP) endif $(DEX_PATH)/classes.dex : $(CLS_LIST) $(CLS_PRJT)/R.class #****************************** LINK ********************************** $(JAVA_HOME)/bin/javac $(jopt) -sourcepath $(JVA_ROOT)/ -cp $(DRD_JAR) \ -d $(CLS_ROOT)/ $(JVA_PRJT)/$(START).java @-mkdir -p $(DEX_PATH) $(DROID_HOME)/build-tools/$(BLD_TOOLS)/dx --dex --verbose --output=$@ $(CLS_ROOT) $(CLS_PRJT)/%.class : $(JVA_PRJT)/%.java $(CLS_PRJT)/R.class @-mkdir -p $(CLS_PRJT) $(JAVA_HOME)/bin/javac $(jopt) -sourcepath $(JVA_ROOT)/ -cp $(DRD_JAR) -d $(CLS_ROOT)/ $< $(CLS_PRJT)/R.class : $(JVA_PRJT)/R.java #****************************** R.CLASS ******************************* @-mkdir -p $(CLS_PRJT) $(JAVA_HOME)/bin/javac $(jopt) -sourcepath $(JVA_ROOT)/ -cp $(DRD_JAR) -d $(CLS_ROOT)/ $< $(JVA_PRJT)/R.java : $(RES_LIST) $(AMF_PNAM) #****************************** R.JAVA ******************************** $(DROID_HOME)/build-tools/$(BLD_TOOLS)/aapt package -v -f -M $(AMF_PNAM) \ -S $(RES_ROOT) -m -J $(JVA_ROOT) -I $(DRD_JAR)
型你可能需要一个32位的zlib:
sudo apt install zlib1g:i386
型......应该真正获得Java 1.6用于引导:
https://www.oracle.com/uk/java/technologies/javase-java-archive-javase6-downloads.html
型下载jre-6u45-linux-x64.bin(需要注册)您还需要为apk签名配置密钥库:
/usr/lib/jvm/java-8-openjdk-amd64/bin/keytool \ -genkeypair -validity 1000 -dname "CN=some company,O=Android,C=JPN" -keystore ~/jkeystore \ -storepass debug_pw -keypass debug_pw -alias cert -keyalg RSA -v
我应该指出的是,API < 9设备最好被认为是无可救药的容易受到攻击,通过移动的数据,无线网络,网络共享,adb,蓝牙,GSM等。
1条答案
按热度按时间wnvonmuf1#
我无法找到使用developer.android.com上提供的任何Android Studio版本构建< 9的Android应用程序API的机制。
但是,可以使用旧的命令行工具来构建它们。(我还没有研究API < 9使用ActivityCompat库,也没有研究用于调试JNI应用程序的ndk构建-这些都是留给读者的练习:-)
注意:使用这些技术需要熟悉当前的命令行构建,否则就没有什么阅读的意义。
此任务分为四个部分:
API < 9的Android示例项目
字符串
从甜甜圈发布到android-s-beta-4,应有尽有。
每个都有一个“样本”的标签,这是一个很好的开始。
构建API < 9项目的Android工具
型
列出了所有下载及其摘要/校验和,位于:
型
您需要查找、下载并安装:
构建API < 9的Android JNI库
请注意,API < 4的设备似乎更喜欢从设备操作系统链接共享符号,而不是从您的JNI库链接共享符号,因此请避免从您的库发布冲突符号,并静态链接任何第三方库(许可证允许)。
Makefile示例:
型
如果你正在构建openssl,你需要一个额外的configure标志:
型
以及无线程无ASM。
为API < 9构建Android Java应用
遗憾的是,我无法找到一种方法来使用现在的Android Studio来构建这些低API项目,所以下面是一些讨厌的命令行东西来代替它。
您需要查找、下载并安装:
(See上面是如何得到这些。)
项目树
型
AndroidManifest.xml
型
activity_main.xml
型
MainActivity.java
型
Makefile
型
你可能需要一个32位的zlib:
型
......应该真正获得Java 1.6用于引导:
型
下载jre-6u45-linux-x64.bin(需要注册)
您还需要为apk签名配置密钥库:
型
重要提示:
我应该指出的是,API < 9设备最好被认为是无可救药的容易受到攻击,通过移动的数据,无线网络,网络共享,adb,蓝牙,GSM等。