背景:
内置一个爱奇艺的app, 是pad版,一个语音公司发给我们的,用于语音唤醒调用它播放视频资源。
遇到的问题:
这个app内置到/system/app, /system/priv-app都有问题,问题是能联网,但是播放不了视频。
app内提示"播放出错了,看看其他视频吧[null]"
------------------
测试与发现问题:
Android.mk里的签名是PRESIGNED, 保留原有签名。(实际platform也试了,一样的现象)
机器启动后,用adb install -r覆盖安装,app就能播放视频了...
我感觉很奇怪,以前内置都可以,不知道为什么这个app不行,是缺库 ? 或者安装时出了问题 ?
问题解决:
时间急,一时想不到解决这个安装包内置什么时候出了问题。
想了另一个办法,用一个开机脚本,开机启动时system("pm install -r /sdcard/temp/iqiyi.apk"),然后删除目录。这么搞。
上代码吧:
#define SOCKET_NAME "fstiService"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, "itv_assistance_native", __VA_ARGS__)
#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
#include <errno.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <sys/un.h>
//#include <cutils/sockets.h>
#include <android/log.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>
#include <pthread.h>
#include <string.h>
#include <fcntl.h>
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, "itv_assistance_native", __VA_ARGS__)
#define UNUSED(x) ( (void)(x) )
//qyc add 2019/1/22 for serialno
#include <sys/system_properties.h>
//
void backlight_connect_cmd(char* p, char* str1);
void led_connect_cmd(char* p, char* str1, char* str2);
void *run(void *arg)
{
if (!access("/sdcard//sdcard/temp/iqiyi_speaker.apk", 0))
{
system("pm install /sdcard/temp/iqiyi_speaker.apk");
system("rm -rf /sdcard/temp");
}
}
int main(int argC, char **argV)
{
int fun; //argv[1], it is used as function code
int value; //argv[2], it is used as value
char cmd[80];
int err;
pthread_t th;
err = pthread_create(&th, NULL, run, NULL);
if (err != 0)
{
printf("failed: %d\n", err);
exit(-1);
}
if (argC > 5) {
LOGD("argC is not right..\n");
return 0;
}
// fun = atoi(argV[1]);
// value=atoi(argV[2]);
LOGD("qyc, I'm in ledtest.. argV[2]=%s, fun=%d, value=%d\n", argV[2], fun, value);
//system("pm install /sdcard/temp/iqiyi_speaker.apk");
//system("rm -rf /sdcard/temp");
return 0;
}
void backlight_connect_cmd(char* p, char* str1)
{
strcpy(p, "echo ");
strcat(p, str1);
strcat(p, " ");
strcat(p, " > /sys/class/leds/lcd-backlight/brightness");
//strcat(p, " >/sys/devices/soc/soc\\:qcom,dsi1_bridge/dsi1_bl_value");
}
void led_connect_cmd(char* p, char* str1, char* str2)
{
strcpy(p, "echo ");
strcat(p, str1);
strcat(p, " ");
strcat(p, str2);
strcat(p, " >/sys/class/leds/aw9106_led/reg");
}
这几天一直搞这个蠢事,搞得脑壳疼。
以前mk是在device下rc文件里面写,试了两天以为自己的语法或者什么文件权限,selinux权限问题,一直启动不了。我是服了,心累
今天还是无目的的搜博客看,偶尔看到一篇是在system下的rc文件里面写的。
自己也没办法,我还以为这份系统源码有问题,device下的rc怎么就不能生效 ??以前都是可以的
没办法,自己又在system下的rc里面写了,一会儿就启动了。
-------------------
真的,android源码里的device和system目录就是乱的,乱七八糟的,什么rc文件,
selinux的te文件,真的一点规则没有,位置随便乱写,根本没讲究,里面大量冗余
代码,跟自己的平台一点关系没有。不知道为什么这样,让人挺迷惑的。
2021.08.16
先拷贝到sdcard,在执行安装。这个逻辑上可行,但是实际/sdcard/目录挂载非常后,在android起来后才挂载,这个可执行文件早就执行了。
然后,我又去找目录,存放。。。最后放在/system/etc下
/system/etc/ 的权限是755