Difference between revisions of "WISE-PaaS/OTA Agent(Android)"
Line 89: | Line 89: | ||
ALOGI(LOG_TAG " wipedata -- mean wipe data partition\n"); | ALOGI(LOG_TAG " wipedata -- mean wipe data partition\n"); | ||
ALOGI(LOG_TAG " wipecache -- mean wipe cache partition\n"); | ALOGI(LOG_TAG " wipecache -- mean wipe cache partition\n"); | ||
− | ALOGI(LOG_TAG " install /cache/update.zip -- | + | ALOGI(LOG_TAG " install /cache/update.zip -- means update system and /cache/update.zip is the option\n"); |
+ | ALOGI(LOG_TAG " appinstall /cache/test.apk -- means install/reinstall app and /cache/test.apk is the option\n"); | ||
} | } | ||
int main(const int argc, const char *argv[]) { | int main(const int argc, const char *argv[]) { | ||
+ | char buf[] = "systembackup";//for system backup | ||
+ | //char buf[] = "install /cache/update.zip"; | ||
+ | //char buf[] = "wipecache"; | ||
+ | //char buf[] = "wipecache"; | ||
+ | int len = strlen(buf); | ||
static int clientfd; | static int clientfd; | ||
Line 107: | Line 113: | ||
} | } | ||
else if(argc == 3){ | else if(argc == 3){ | ||
− | if(strncmp(argv[1], "install", strlen("install"))){ | + | if(strncmp(argv[1], "install", strlen("install")) && strncmp(argv[1], "appinstall", strlen("appinstall"))){ |
usage(); | usage(); | ||
return -1; | return -1; | ||
Line 144: | Line 150: | ||
} | } | ||
return 0; | return 0; | ||
− | } | + | } |
</syntaxhighlight> Get source code from here: [https://github.com/ADVANTECH-Corp/wise-paas-ota-agent-android https://github.com/ADVANTECH-Corp/wise-paas-ota-agent-android] | </syntaxhighlight> Get source code from here: [https://github.com/ADVANTECH-Corp/wise-paas-ota-agent-android https://github.com/ADVANTECH-Corp/wise-paas-ota-agent-android] | ||
== Android Ota-agent == | == Android Ota-agent == | ||
Line 152: | Line 158: | ||
You can get the binary file for android from here: | You can get the binary file for android from here: | ||
− | https://github.com/ADVANTECH-Corp/wise-paas-ota-agent-android | + | [https://github.com/ADVANTECH-Corp/wise-paas-ota-agent-android https://github.com/ADVANTECH-Corp/wise-paas-ota-agent-android] |
Or you can rebuild the ota-agent under android system too. | Or you can rebuild the ota-agent under android system too. |
Revision as of 08:12, 15 November 2016
Contents
Introduction
This document demonstrates how to support our ota-agent solution under your android system.This demonstration is android 4.3 based. If you encounter problems under your some-verson android system,please mailto me: jin.xin@advantech.com.cn
Architecture
The android ota solution is compose of two parts: the C-lanuage based Ota-agent and the Java-language based OtaService.
- Ota-agent achieves communiction with the ota-server, besides, it achieves the package download and unzip. But, the Ota-agent is C-language based and it can't invoke the Java-language based android OTA APIs, so the OtaService comes.
- OtaService is on the android framework layer, so it can invoke the android OTA APIs directly. The OtaService provides as a socket server. So the Ota-agent can invoke the android OTA APIs through the socket connnect providing by OTaService indirectly.
Android OtaService
we now support four commands, you can extent your commands:
private void startTestThread(final LocalSocket socket){
Thread t = new Thread(){
@Override
public void run(){
try{
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
while(true){//
char [] data = new char[128];
int readBytes = isr.read(data);
if(readBytes != -1){
String tempStr = new String(data, 0, readBytes);
Slog.i(TAG, "recv str: " + tempStr + " len is :" + readBytes);
String newstr = tempStr.trim();
Slog.i(TAG, "newstr: " + newstr);
String[] asplit = newstr.split("#");
Slog.i(TAG, "asplit[0]: " + asplit[0]);
switch(Advaction.getAdvaction(asplit[0])){
case systembackup:
Slog.i(TAG, "switch systembackup");
RecoverySystem.rebootSystemBackup(mContext);
break;
case wipedata:
Slog.i(TAG, "switch wipedata");
RecoverySystem.rebootWipeUserData(mContext);
break;
case wipecache:
Slog.i(TAG, "swtich wipecache");
RecoverySystem.rebootWipeCache(mContext);
break;
case install:
Slog.i(TAG, "switch install");
String file = asplit[1].trim();
Slog.i(TAG, "install file: " + file);
File recoveryFile = new File(file);
if(!recoveryFile.exists()){
Slog.i(TAG, "install, file not exist");
return;
}
RecoverySystem.installPackage(mContext, recoveryFile);
break;
default:
Slog.i(TAG, "error paramer");
break;
}
}
else
Slog.i(TAG, "recv error");
Slog.i(TAG, "finished");
return;
}
}catch (IOException e){
e.printStackTrace();
}
}
};
t.start();
}
Android OtaService test tools
To test the OtaService, I developed a OtaClient test tools:
void usage()
{
#define ALOGI printf
ALOGI(LOG_TAG "not support, usage: \n");
ALOGI(LOG_TAG "servertest [action string] [option]\n");
ALOGI(LOG_TAG "action string can be:\n");
ALOGI(LOG_TAG " systembackup -- mean system backup\n");
ALOGI(LOG_TAG " wipedata -- mean wipe data partition\n");
ALOGI(LOG_TAG " wipecache -- mean wipe cache partition\n");
ALOGI(LOG_TAG " install /cache/update.zip -- means update system and /cache/update.zip is the option\n");
ALOGI(LOG_TAG " appinstall /cache/test.apk -- means install/reinstall app and /cache/test.apk is the option\n");
}
int main(const int argc, const char *argv[]) {
char buf[] = "systembackup";//for system backup
//char buf[] = "install /cache/update.zip";
//char buf[] = "wipecache";
//char buf[] = "wipecache";
int len = strlen(buf);
static int clientfd;
ALOGI(LOG_TAG "test recovery functions...\n");
if(argc <= 1 && argc > 3){
usage();
return -1;
}
else if(argc == 2){
if(strncmp(argv[1], "systembackup", strlen("systembackup")) && strncmp(argv[1], "wipedata", strlen("wipedata")) && strncmp(argv[1], "wipecache", strlen("wipecache"))){
usage();
return -1;
}
}
else if(argc == 3){
if(strncmp(argv[1], "install", strlen("install")) && strncmp(argv[1], "appinstall", strlen("appinstall"))){
usage();
return -1;
}
}
else{
usage();
return -1;
}
clientfd = socket_local_client("ota_server", ANDROID_SOCKET_NAMESPACE_ABSTRACT,SOCK_STREAM);
if(clientfd < 0){
ALOGE(LOG_TAG "Failed to connect to local socket test_server: %s\n", strerror(errno));
exit(1);
}
ALOGI(LOG_TAG "test connect successful\n");
sleep(1);
if(argc == 2){
writex(clientfd, argv[1], strlen(argv[1]));
}
else if(argc == 3){
char astr[1024] = {0};
int len1 = strlen(argv[1]);
int len2 = strlen(argv[2]);
int len3 = strlen("#");
strncpy(astr, argv[1], len1);
strncpy(astr+len1, "#", len3);
strncpy(astr+len1+len3, argv[2], len2);
writex(clientfd, astr, strlen(astr));
}
else{
usage();
return -1;
}
return 0;
}
Android Ota-agent
The Android Ota-agent is same as the wise-pass ota-agent,The difference is that I modify the linux's Makefie to Android's Android.mk.
You can get the binary file for android from here:
https://github.com/ADVANTECH-Corp/wise-paas-ota-agent-android
Or you can rebuild the ota-agent under android system too.