android beginning tentative

This commit is contained in:
Stefano D'Angelo 2024-01-23 09:22:00 +01:00
parent b78db2283b
commit 67137cd95f
10 changed files with 227 additions and 0 deletions

View File

@ -0,0 +1,59 @@
include vars.mk
JAVAC = javac
APKSIGNER = ${BUILD_TOOLS_DIR}/apksigner
ZIPALIGN = ${BUILD_TOOLS_DIR}/zipalign
AAPT = ${BUILD_TOOLS_DIR}/aapt
D8 = ${BUILD_TOOLS_DIR}/d8
JARS := \
${ANDROID_JAR_FILE} \
${ANDROIDX_CORE_FILE} \
${ANDROIDX_LIFECYCLE_COMMON_FILE} \
${ANDROIDX_VERSIONEDPARCELABLE_FILE} \
${KOTLIN_STDLIB_FILE} \
${KOTLINX_COROUTINES_CORE_FILE} \
${KOTLINX_COROUTINES_CORE_JVM_FILE}
CLASSES_PATH := $(subst /,.,$(JAVA_PACKAGE_NAME))
CLASSES := MainActivity
ifeq (${HAS_MIDI_IN}, yes)
MIN_API := 29
else
MIN_API := 26
endif
all: build/${BUNDLE_NAME}.apk
build/${BUNDLE_NAME}.apk: build/gen/${BUNDLE_NAME}.aligned.apk ${KEY_STORE}
${APKSIGNER} sign --ks ${KEY_STORE} --ks-key-alias ${KEY_ALIAS} --ks-pass ${STORE_PASS} --key-pass ${KEY_PASS} --out $@ build/gen/${BUNDLE_NAME}.aligned.apk
build/gen/${BUNDLE_NAME}.aligned.apk: build/gen/${BUNDLE_NAME}.unsigned.apk
${ZIPALIGN} -f -p 4 $^ $@
build/gen/${BUNDLE_NAME}.unsigned.apk: build/apk/classes.dex src/AndroidManifest.xml | build/gen
${AAPT} package -f -M src/AndroidManifest.xml $(foreach jar,$(JARS),-I $(jar)) -F $@ build/apk
build/apk/classes.dex: build/apk/my_classes.jar
cd build/apk && ${D8} --min-api ${MIN_API} ../../$^ ${JARS} && cd ../..
build/apk/my_classes.jar: $(foreach class,$(CLASSES),build/obj/$(CLASSES_PATH)/$(class).class) | build/apk
${D8} $(foreach class,$(CLASSES),'build/obj/$(CLASSES_PATH)/$(class).class') --min-api ${MIN_API} --output $@ --no-desugaring
build/obj/${CLASSES_PATH}/MainActivity.class: src/MainActivity.java | build/obj
${JAVAC} -classpath "$(subst $() $(),:,$(JARS))" -d build/obj $^
build/gen build/obj:
mkdir -p $@
clean:
rm -fr build
install: build/${BUNDLE_NAME}.apk
[ -n "`${ADB} shell pm list packages | grep ^package:${JAVA_PACKAGE_NAME}$`" ] && ${ADB} uninstall ${JAVA_PACKAGE_NAME}; exit 0
${ADB} install $^
.PHONY: all clean install

View File

@ -0,0 +1,4 @@
module.exports = function (data, api) {
api.copyFile(`Makefile`, `Makefile`);
api.generateFileFromTemplateFile(`vars.mk`, `vars.mk`, data);
};

View File

@ -0,0 +1,22 @@
BUNDLE_NAME := {{=it.product.bundleName}}
JAVA_PACKAGE_NAME := {{=it.android.javaPackageName}}
KEY_STORE := {{=it.android_make.keyStore}}
KEY_ALIAS := {{=it.android_make.keyAlias}}
STORE_PASS := {{=it.android_make.storePass}}
KEY_PASS := {{=it.android_make.keyPass}}
ANDROID_SDK_DIR := {{=it.android_make.sdkDir}}
BUILD_TOOLS_DIR := ${ANDROID_SDK_DIR}/build/tools/{{=it.android_make.buildToolsVersion}}
ANDROIDX_DIR := {{=it.android_make.androidxDir}}
KOTLIN_DIR := {{=it.android_make.kotlinDir}}
ANDROID_JAR_FILE := ${ANDROID_SDK_DIR}/platforms/android-{{=it.android_make.androidVersion}}/android.jar
ANDROIDX_CORE_FILE := ${ANDROIDX_DIR}/core-{{=it.android_make.androidxCoreVersion}}.jar
ANDROIDX_LIFECYCLE_COMMON_FILE := ${ANDROIDX_DIR}/lifecycle-common-{{=it.android_make.androidxLifecycleCommonVersion}}.jar
ANDROIDX_VERSIONEDPARCELABLE_FILE := ${ANDROIDX_DIR}/versionedparcelable-{{=it.android_make.androidxVersionedparcelableVersion}}.jar
KOTLIN_STDLIB_FILE := ${KOTLIN_DIR}/kotlin-stdlib-{{=it.android_make.kotlinStdlibVersion}}.jar
KOTLINX_COROUTINES_CORE_FILE := ${KOTLIN_DIR}/kotlinx-coroutines-core-{{=it.android_make.kotlinxCoroutinesCoreVersion}}.jar
KOTLINX_COROUTINES_CORE_JVM_FILE := ${KOTLIN_DIR}/kotlinx-coroutines-core-jvm-{{=it.android_make.kotlinxCoroutinesCoreJVMVersion}}.jar
HAS_MIDI_IN := {{=it.product.buses.filter(x => x.type == "midi" && x.direction == "input").length > 0 ? "yes" : "no"}}

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.orastron.@NAME@">
{{?it.product.buses.filter(x => x.type == "audio" && x.direction == "input").length > 0}}
<uses-permission android:name="android.permission.RECORD_AUDIO" />
{{?}}
{{?it.product.buses.filter(x => x.type == "midi" && x.direction == "input").length > 0}}
<uses-sdk android:minSdkVersion="29" /> <!-- for AMidi -->
{{??}}
<uses-sdk android:minSdkVersion="26" /> <!-- for androidx core and AAudio -->
{{?}}
<uses-sdk android:targetSdkVersion="34" />
<application android:label="@NAME@">
<activity android:name=".MainActivity" android:label="@NAME@" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

View File

@ -0,0 +1,86 @@
/*
* Copyright (C) 2023, 2024 Orastron Srl unipersonale
*/
package {{=it.android.javaPackageName}};
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebSettings;
import android.webkit.WebChromeClient;
import android.webkit.WebViewClient;
import android.webkit.JavascriptInterface;
import android.content.Context;
import android.content.pm.PackageManager;
import androidx.core.app.ActivityCompat;
public class MainActivity extends Activity {
/*
static {
System.loadLibrary("{{=it.android.javaPackageName}}");
}
public native boolean nativeAudioStart();
public native void nativeAudioStop();
public native float nativeGetParameter(int i);
public native void nativeSetParameter(int i, float v);
private WebView webView;
public class WebAppInterface {
@JavascriptInterface
public boolean hasAudioPermission() {
return MainActivity.this.checkCallingOrSelfPermission(android.Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED;
}
@JavascriptInterface
public void requestAudioPermission() {
ActivityCompat.requestPermissions(MainActivity.this, new String[] { android.Manifest.permission.RECORD_AUDIO }, 0);
}
@JavascriptInterface
public boolean audioStart() {
return nativeAudioStart();
}
@JavascriptInterface
public void audioStop() {
nativeAudioStop();
}
@JavascriptInterface
public float getParameter(int i) {
return nativeGetParameter(i);
}
@JavascriptInterface
public void setParameter(int i, float v) {
nativeSetParameter(i, v);
}
}
*/
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
webView = new WebView(this);
setContentView(webView);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient());
webSettings.setDomStorageEnabled(true);
webView.addJavascriptInterface(new WebAppInterface(), "Android");
//webView.loadUrl("file:///android_asset/index.html");
webView.loadUrl("https://www.orastron.com/");
}
/*
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (grantResults.length > 0)
webView.loadUrl("javascript:gotAudioPermission()");
}
*/
}

View File

@ -0,0 +1,7 @@
var path = require("path");
var sep = path.sep;
module.exports = function (data, api) {
api.generateFileFromTemplateFile(`data${sep}AndroidManifest.xml`, `data${sep}AndroidManifest.xml`, data);
api.generateFileFromTemplateFile(`src${sep}MainActivity.java`, `src${sep}MainActivity.java`, data);
};

19
test/android-make.json Normal file
View File

@ -0,0 +1,19 @@
{
"android_make": {
"keyStore": "keystore.jks",
"keyAlias": "androidkey",
"storePass": "android",
"keyPass": "android",
"sdkDir": "${HOME}/Android/Sdk",
"buildToolsVersion": "34.0.0",
"androidxDir": "{HOME}/Android/androidx",
"kotlinDir": "${HOME}/Android/kotlin",
"androidVersion": "34",
"androidxCoreVersion": "1.10.1",
"androidxLifecycleCommonVersion": "2.6.1",
"androidxVersionedparcelableVersion": "1.1.1",
"kotlinStdlibVersion": "1.9.0",
"kotlinxCoroutinesCoreVersion": "1.7.3",
"kotlinxCoroutinesCoreJVMVersion": "1.7.3"
}
}

5
test/android.json Normal file
View File

@ -0,0 +1,5 @@
{
"android": {
"javaPackageName": "com.example.tibia_test"
}
}

BIN
test/keystore.jks Normal file

Binary file not shown.

View File

@ -13,3 +13,7 @@ $dir/../tibia $dir/product.json,$dir/company.json $dir/../templates/web $dir/../
$dir/../tibia $dir/product.json,$dir/company.json $dir/../templates/web-make $dir/../out/web
$dir/../tibia $dir/product.json,$dir/company.json $dir/../templates/web-demo $dir/../out/web
cp $dir/plugin.h $dir/../out/web/src
$dir/../tibia $dir/product.json,$dir/company.json,$dir/android.json $dir/../templates/android $dir/../out/android
$dir/../tibia $dir/product.json,$dir/company.json,$dir/android.json,$dir/android-make.json $dir/../templates/android-make $dir/../out/android
cp $dir/keystore.jks $dir/../out/android