应用获取自定义服务实例化对象为null
记录一下之前遇到的问题修改成功后,再次遇到忘记怎么改了。
app的libs下正常引入jar
classes.jar下是已经自定义服务的几个Manager,在AS里面也正常引入编译,配置build.gradle:
在MainActivity里面将自定义服务(DiagnosticManager )实例化:
package com.battmon.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import com.information.diagnostic.DiagnosticManager;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "MainActivity";
private Button btn1;
private ActivityManager activityManager;
private DiagnosticManager diagnosticManager;
private DiagnosticManager.EthernetStatusChangeListener changeListener = new DiagnosticManager.EthernetStatusChangeListener() {
@Override
public void onAvailabilityChanged(String s, boolean b) {
Log.d(TAG, "onAvailabilityChanged: " + s + " avail : " + b);
}
};
@SuppressLint("WrongConstant")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = findViewById(R.id.btn_1);
btn1.setOnClickListener(this);
activityManager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
diagnosticManager = (DiagnosticManager) this.getSystemService("diagnostic");
Log.d(TAG, "onCreate: " + diagnosticManager);
Log.d(TAG, "onCreate: " + activityManager);
if (diagnosticManager != null) {
diagnosticManager.addListener(changeListener);
}
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_1:
diagnosticManager.getChargeStatus();
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (changeListener != null) {
diagnosticManager.removeListener(changeListener);
}
}
}
实例化对象为null
打印实例化对象log显示:
2022-08-22 14:09:34.705 9423-9423/com.battmon.myapplication D/MainActivity: onCreate: null
2022-08-22 14:09:34.706 9423-9423/com.battmon.myapplication D/MainActivity: onCreate: android.app.ActivityManager@12c87fd
2022-08-22 14:09:34.706 9423-9423/com.battmon.myapplication
2022-08-22 14:09:34.742 9423-9423/com.battmon.myapplication D/ViewRootImpl[MainActivity]: hardware acceleration = true , fakeHwAccelerated = false, sRendererDisabled = false, forceHwAccelerated = false, sSystemRendererDisabled = false
2022-08-22 14:09:34.756 9423-9423/com.battmon.myapplication V/PhoneWindow: DecorView setVisiblity: visibility = 0, Parent = android.view.ViewRootImpl@e4a23bb, this = DecorView@a1660d8[MainActivity]
2022-08-22 14:09:34.770 9423-9423/com.battmon.myapplication V/PhoneWindow: DecorView setVisiblity: visibility = 4, Parent = android.view.ViewRootImpl@e4a23bb, this = DecorView@a1660d8[MainActivity]
***在检查自己定义的服务没有问题之后,认为是在编译时,jar下的类没有编译进去,在网上查了一遍之后jar的引用没有问题,此时,在另外一个窗口看到系统log信息,因为只查看当前应用的log所以将其他log过滤了,log显示:
2022-08-22 14:09:34.485 9423-9423/com.battmon.myapplication W/n.myapplicatio: Accessing hidden method Lcom/information/diagnostic/DiagnosticManager;->getEthernetStatus()Z (blacklist, linking, denied)
2022-08-22 14:09:34.485 9423-9423/com.battmon.myapplication W/n.myapplicatio: Accessing hidden method Lcom/information/diagnostic/DiagnosticManager;->getChargeStatus()I (blacklist, linking, denied)
2022-08-22 14:09:34.705 353-353/? E/SELinux: avc: denied { find } for pid=9423 uid=10133 name=diagnostic scontext=u:r:untrusted_app:s0:c133,c256,c512,c768 tcontext=u:object_r:diagnostic_service:s0 tclass=service_manager permissive=0
2022-08-22 14:09:34.705 9423-9423/com.battmon.myapplication W/SystemServiceRegistry: No service published for: diagnostic
2022-08-22 14:09:34.705 9423-9423/com.battmon.myapplication D/MainActivity: onCreate: null
2022-08-22 14:09:34.706 9423-9423/com.battmon.myapplication D/MainActivity: onCreate: android.app.ActivityManager@12c87fd
2022-08-22 14:09:34.706 9423-9423/com.battmon.myapplication D/MainActivity: onCreate: null
这不就熟悉起来了,log显示当前应用为黑名单应用,拒绝访问,第三行显示缺少SELinux权限,那么到对应的untrusted_app加上find权限不就ok了。
修改device/mediatek/sepolicy/bsp/plat_private/untrusted_app.te文件,给我自定义的diagnostic_service添加find权限
allow untrusted_app diagnostic_service:service_manager find;
测试结果:
2022-08-22 14:54:10.566 5757-5757/com.battmon.myapplication D/MainActivity: onCreate: com.information.diagnostic.DiagnosticManager@66a9583
2022-08-22 14:54:10.567 5757-5757/com.battmon.myapplication D/MainActivity: onCreate: android.app.ActivityManager@b41c300